初识ssl协议, openssl的简单应用(建议PC浏览器打开)
—-SSL篇—-
SSL TLS个人理解:
1.SSL是一种加密协议(安全套接字层), 实现在第四层的TCP/IP协议之上, 对上层协议透明, 应用层(会话层, 表示层, 应用层)在接收或传输数据的时(数据加密解密, 通信秘钥的协商), 不会对ssl有任何感知
2.TLS是在SSL协议之上更加标准化的一种数据加密传输协议, 由ISOC组织接替Netscape(网景)在SSL协议基础之上改进而来
3.SSL已退役, 我们现在所说的SSL就是TLS
4.与HTTP协议一样, SSL同样是一种标准, 是一种具体的概念, 而ssl的实现为openssl, openssl是C语言开发的开源软件, 开发者可以使用openssl生成用于支持SSL协议通讯的相关文件
HTTPS协议:
架构在ssl协议之上的HTTP协议
证书:
(摘自百度百科)包括电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。
SSL协议秘钥协商过程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
----定义----
S : 服务端 S的证书中的公钥对外公开, S上存有SSL公钥证书与对应的KEY
C : 客户端
CA: 证书签证机构, 上帝视角的第三方公证, 用户把生成的CSR(下文中有对CSR的解释)
文件提交给CA后, CA用它的私钥对CSR进行签名之后, 生成的产物就是用户的证书,
CA类机构的本身也有证书, 它的证书会被更高等级的认证机构签名, 反复循环, 一
直到最后, 会存在一个自签名的根证书, 形成一条公钥认证链
----过程----
1. C 发送hello请求告知 S 它所支持的加密算法, 支持的ssl版本并附带一个随机数(生成秘钥用),
S 确认后, 选择加密算法其中一种,也生成一个随机数(生成秘钥用), 把随机数信息附带 S 的证书回传给 C
2. C 使用 CA (证书认证机构)的公钥解密 S 的证书(根据服务器的信息以及域名信息, 得到 S 的证书内信息,
即: 解密成功),解密后的证书信息如果与 S 公开的信息相匹配, 则 C 信任 S
3. C 生成一个随机数(生成秘钥用), 本次的随机数使用 S 的公钥对做加密,防止信息泄露, 附带前几次的通讯
报文所产生HASH发送给 S , S使用本地存储的KEY(私钥)解密被C加密的随机数(这个随机数是通过一种算法生成的,
不展开讨论, 感兴趣可以搜索相关资料 PreMaster Key), S验证数据的准确性, 随后切换到与客户端相同的加密套件,
通知C后秘钥协商结束, 开始进行信息交互
秘钥协商得到的最终产物:
1.C单方面信任S (如果有需要, 也可以验证C, 比如银行系统的KEY宝) 2.C保存了秘钥 (保证信息传输的保密性, 完整性) 3.S保存了秘钥 (保证信息传输的保密性, 完整性) 4.早期的SSL协商过程中不存在随机数, 会在第三步的时候, 由客户端C生成对称秘钥, 使用公钥加密发给服务端S
—-openssl篇—-
使用以下后缀名结尾文件说明:
.key: 秘钥原始文件(私钥)
.csr: 证书签名请求文件 (里面包含了申请者(你)的用户信息, 公钥信息, 域名信息等, 可以把该文件交给权威认证机构, 比如赛门铁克, 认证机构使用机构自己的公钥对你的csr文件做签名, 得到的就是你的证书文件)
.cer: 证书文件(公钥), 常见于windows
.crt: 证书文件(公钥), 常见于linux或unix或二者的子分支系统下
.pem: 还是证书文件(公钥), 以pem标准编码(开发常见)
.der: 依旧是证书文件(公钥), der标准的二进制格式证书(不常用)
上述总结: 一共有三种类型的文件, 1: 私钥(KEY) 2.csr(签名请求, 苹果开发的兄弟应该很熟悉) 3.其余的都是证书, 证书内有申请者的公钥和其他信息(用户信息, 域名)
pfx/p12: 用于存放 证书(公钥) + 私钥,这种文件通常包含保护密码,2进制方式存储
使用openssl生成ssl相关文件
1.生成一个key和csr文件, 输入以下命令, 按提示输入表单信息 注意: 其中 Common Name 属性, 要填你域名, exp: www.gomyck.com
1
2
$ openssl req -new -nodes -newkey rsa:2048 -keyout demo.key -out demo.csr
2.如果生成时候输入了密码。可以使用导出命令导出无密码的秘钥:
1
2
3
$ mv demo.key temp.key
$ openssl rsa -in temp.key -out demo.key
$ rm temp.key
3.这里申请者把自己本身当做CA, 为自己颁发证书文件(大部分第三方机构是要给钱的, 赛门铁克有免费的证书, 最高期限是1年)
用 证书请求文件(csr) 和 私钥(key) 生成 cer| crt 证书(CA自签名证书, 即根证书), 365是证书有效期
1
$ openssl x509 -req -days 365 -in demo.csr -signkey demo.key -out demo.cer
1
$ openssl x509 -req -days 365 -in demo.csr -signkey demo.key -out demo.crt
当前输出产物:
demo.key (私钥, 保管好) demo.cer || demo.crt (公钥, 对外暴露) demo.crt (证书请求文件, 自签名或提交CA使用)
应用服务器可以使用的文件: demo.key demo.cer|demo.crt
因为当前的证书文件是使用的自己的私钥签名, 所以在性质上, 属于根证书状态, 如下图:
被浏览器信任的证书:
自签名的证书:
未受信任的证书在访问时, 浏览器会提示你有风险, 需要用户手动确认
注意图一上被信任的证书, 其上面是有一条证书链的, 顶级根证书是权威认证机构(如果它的私钥泄露或被破解, 会对整个公钥链造成信息安全问题)
可以看到自制的签名证书(图二), 是显示不被信任的(根证书信任与否在浏览器上内置, 被信任的机构名单以及该机构的证书在浏览器内置, 客户的证书因为被受信任的证书签过名, 所以在认证时, 按照公钥链和签名链, 来一层层向上验证, 最终被信任)
openssl的一点点命令(openssl实在太强大, 学不动)
生成.pem文件:
1
2
$ openssl rsa -in demo.key -out demo.pem
$ openssl x509 -in demo.crt -out demo.pem
从pxf文件中提取pem(PFX转X509) :
1
2
3
4
5
$ openssl pkcs12 -in demo.pfx -out demo.pem -nodes
#从pfx提取的key包含公钥也包含私钥, 所以需要单独提取
$ openssl pkcs12 -in demo.pfx -out all.key -nocerts -nodes
$ openssl rsa -in all.key -out demo_private.key
$ openssl rsa -in all.key -pubout -out demo_public.key
pem文件分别生成key和证书:
1
2
$ openssl rsa -in demo.pem -out demo.key
$ openssl x509 -in demo.pem -out demo.crt
生成pfx文件命令(X509转PFX):
1
2
3
$ openssl pkcs12 -export -out demo.pfx -inkey demo.key -in demo.crt -certfile demo.crt
$ openssl pkcs12 -export -out demo.pfx -inkey demo.key -in demo.cer -certfile demo.cer
p12格式转成pem
1
2
3
$ openssl pkcs12 -clcerts -nokeys -out demo.pem -in demo.p12
$ openssl pkcs12 -nocerts -out demo.pem -in demo.p12
pem格式转成p12
1
$ openssl pkcs12 -export -inkey demo.key -in demo.pem -out demo.p12
快速生成自签名的 PFX 测试文件
1
2
3
4
$ openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048
$ openssl req -new -key private.key -out certificate.csr -subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=CommonName"
$ openssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt
$ openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile certificate.crt