参考:
https://www.openssl.org/docs/manmaster/
SSL
Secure Sockets Layer,现在应该叫”TLS”,但由于习惯问题,我们还是叫”SSL”比较多.http协议默认情况下是不加密内容的,这样就很可能在内容传播的时候被别人监听到,对于安全性要求较高的场合,必须要加密,https就是带加密的http协议,而https的加密是基于SSL的,它执行的是一个比较下层的加密,也就是说,在加密前,你的服务器程序在干嘛,加密后也一样在干嘛,不用动,这个加密对用户和开发者来说都是透明的。
简单地说,OpenSSL是SSL的一个实现,SSL只是一种规范.理论上来说,SSL这种规范是安全的,目前的技术水平很难破解,但SSL的实现就可能有些漏洞,如著名的”心脏出血”.OpenSSL还提供了一大堆强大的工具软件。
openssl 用例
openssl是一个强大的加密、解密工具,由开源组织维护。利用openssl工具,我们可以实现一些常见的摘要算法。
示例:
1 2 3 4 5 6 7 8 9 10
| # base64 echo -n "phpgao" | openssl base64 # 解密 -d == decrypt echo "cGhwZ2Fv" | openssl base64 -d # 对一个文件计算摘要,下同 openssl base64 -in nginx.conf # md5 echo -n "phpgao" | openssl md5 # sha128 echo -n "phpgao" | openssl sha1
|
1 2 3 4 5 6
| # 对称加密 # 使用rc4算法加密php字符串,使用密钥phpgao,输出使用base64编码 echo -n "php" | openssl rc4 -k phpgao -base64
# 使用rc4算法解密字符串,使用密钥phpgao,输入使用base64编码 echo U2FsdGVkX18f3qEoEhVf+hsNOg== | openssl rc4 -d -k phpgao -base64
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| # rsa非对称加密 生成私钥
# genrsa 指使用rsa算法生成密钥文件 # -des3 指的是给私钥加密的算法(可选) openssl genrsa -des3 -out key_rsa 4096 openssl genrsa -out key_rsa 4096 # 移除已经存在的密码(先做一下备份) cp key_rsa old.key openssl rsa -in old.key -out key_rsa
# 根据刚才创建的私钥创建公钥 openssl rsa -in key_rsa -pubout -out key_rsa.pub
# 使用公钥加密数据 # -in 输入文件 echo -n "phpgao" | openssl rsautl -encrypt -pubin -inkey key_rsa.pub -out a.txt
# 使用私钥解密数据 openssl rsautl -decrypt -inkey key_rsa -in a.txt
# 查看密钥信息 openssl rsa -in key_rsa -text -noout openssl rsa -pubin -in key_rsa.pub -text -noout
# 检查私钥 openssl rsa -check -in key_rsa # 检查一个CSR文件(后面有讲) openssl req -text -noout -verify -in domain.csr # 检查证书信息 openssl x509 -text -noout -in domain.crt
|
1 2 3 4 5 6
| # 编码转换 # PEM转为DER openssl x509 -in cert.crt -outform der -out cert.der
# DER转为PEM openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
|
CA证书
原理
证书与密钥不同,CA证书指的是权威机构给我们颁发的证书,我们的电脑或者电子设备中内置了根证书,我们的电脑信任根证书。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| +-----------------+ +--------------------+ | | | | | | | | | | | | | browser/PC | ① GET / HTTP/1.0 | | | |--------------------> sites over https | | ① WAIT! Where is CA ?| | | +--------------------> | | | ④ Anyway,give me | | +-----+----^------+ the code! +--------------------+ | | | | | |③ He is good! ② Is's it| | a bad site? | | | +----------------------+ | | | | | +----+ | | | | | | CA | +---------> | | | | | +----------------------+
|
1、 网站生成自己的公钥
2、CA机构用自己的私钥加密网站的公钥以及相关信息。
3、客户端信任CA,并拥有CA的公钥,客户端就可以使用公钥解密加密后的证书,并从证书中得到网站的公钥。
4、如果能用CA的公钥解密出数据,说明网站的证书是经过CA认证的,客户端就可以放心访问网站了,如果系统发现证书不是权威CA机构颁发的,会警告用户。
5、客户端使用网站的公钥加解密数据,然后进行信息交换。
证书格式
- PEM (Privacy Enhanced Mail) 格式
通常常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, and .key。内容为Base64编码的ASCII码文件,有类似”—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–”的头尾标记。服务器认证证书,中级认证证书和私钥都可以储存为PEM格式(认证证书其实就是公钥)。Apache和nginx等类似的服务器使用PEM格式证书。
- DER (Distinguished Encoding Rules) 格式
与PEM不同之处在于其使用二进制而不是Base64编码的ASCII。扩展名为.der,但也经常使用.cer用作扩展名,所有类型的认证证书和私钥都可以存储为DER格式。Java是其典型使用平台。
CSR (Certificate Signing Request)
它是网站向CA机构申请数字身份证书时使用的请求文件,最常见的格式是PKCS。在生成请求文件前,网站需要准备一对非对称密钥。私钥信息自己保存,请求中会附上公钥信息以及国家,城市,域名,Email等信息,csr中还会附上签名信息。当网站准备好CSR文件后就可以提交给CA机构,等待他们给我们签名,签好名后我们会收到crt文件,即证书。
生成CSR文件,开始签名,然后去 CA机构请求 CRT文件
1 2 3 4 5 6 7 8 9 10 11 12
| openssl ca -h
# 先生成一个CA根证书 openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout key_ca_rsa -out ca.crt
# 使用CA的证书签名 密钥,CSR文件,生成 domain.crt文件 openssl ca -policy policy_anything -days 365 -cert ca.crt -keyfile key_rsa -in domain.csr -out domain.crt
# 可能会出错,因为缺少一些必要文件 mkdir -p demoCA/newCerts touch demoCA/index.txt echo -n "01" > demoCA/serial
|
或者自己直接生成CRT文件。
1 2 3 4 5 6 7 8
| # 生成证书和私钥 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key_rsa -out key.crt # 从已存在的私钥生成生成证书 openssl req -x509 -new -days 365 -key domain.key -out domain.crt
# 检查证书信息 openssl x509 -text -noout -in domain.crt
|