SSL协议入门以及openssl的简单使用

SSL X509 PEM P12 csr cer pfx

Posted by gomyck on June 26, 2019

初识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

因为当前的证书文件是使用的自己的私钥签名, 所以在性质上, 属于根证书状态, 如下图:

被浏览器信任的证书: image

自签名的证书: image

未受信任的证书在访问时, 浏览器会提示你有风险, 需要用户手动确认

注意图一上被信任的证书, 其上面是有一条证书链的, 顶级根证书是权威认证机构(如果它的私钥泄露或被破解, 会对整个公钥链造成信息安全问题)

可以看到自制的签名证书(图二), 是显示不被信任的(根证书信任与否在浏览器上内置, 被信任的机构名单以及该机构的证书在浏览器内置, 客户的证书因为被受信任的证书签过名, 所以在认证时, 按照公钥链和签名链, 来一层层向上验证, 最终被信任)

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