关于SSL证书的学习与总结

青春须早为,岂能长少年。这篇文章主要讲述关于SSL证书的学习与总结相关的知识,希望能为你提供帮助。
关于证书

证书是用来实现https通信加密的基础,
有证书才能够进行相关的TLS层的加密处理.
本文简要讲解一下证书的申请,创建以及使用等.

第一部分: PKI
公共密钥基础

其实有很多家企业在做PKI, 他们的根密钥一般都是线下管理的.
一般能够现上处理的密钥都是根ca认证的2级后者是3级证书,
这样比较安全不会出现密钥泄漏问题.

国际的大厂有:DigiCertSymantec TrustAsia
国内的大厂有:信安世纪、格尔软件、吉大正元
证书又分很多类 比如DV OV EV 等
一般的密钥算法有 RSA和椭圆曲线算法.
简单的以RSA为例, 他利用大质的相乘比较容易,但是大质数乘积的分解特别难的特性来处理.
或者公钥和私钥对 进行使用.

第二部分: 密钥的生成
  • 主要工具如下:
openssl
以及cfssl
windows上面有 certmgr.exe
这里简单使用 openssl 介绍一下CA和证书的创建过程
mkdir cert
# 在nginx 二进制文件的同级目录上面创建一个目录.
openssl genrsa -out ca.key 4096
# 创建CA的私钥
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
# 创建CA的证书
scp /usr/local/ssl/ssl/openssl.cnf .
#复制配置文件过来.
注意需要修改一下openssl.conf的配置文件.
重要的是增加 如下的配置节
[alt_names]
IP.1 = xxx.xxx.xxx.xxx
IP.2 = xxx.xxx.xxx.xxx
将你需要的地址添加进来, 就可以生成证书了.
openssl req -new -nodes -keyout server.key -out server.csr -config openssl.cnf
# 生成服务器证书申请csr文件.
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 36000 -extfile openssl.cnf -extensions v3_req
# 生成服务起证书. 默认100年有效期.
openssl x509 -text -in server.crt--noout
注意查看证书信息包含的地址.

  • 注意里面文件种类比较多.
第三部分 证书相关文件分类
key 文件顾名思义 就是核心的私钥信息.
一般nginx里面都会有key 用来进行验证.
应该也是BASE64编码的.
csrCertificate Signing Request 证书申请文件.
一般通过输入后者是配置文件来说明证书的CN以及其他配置信息.
crt 证书文件 用来颁发的一半就是 crt文件,
但是他有多种变种可以使用. 一般linux里面就是使用如上3种文件

其他证书文件
pem Privacy Enhanced Mail 注意这类文件可以保存公钥私钥以及证书信息.
一般是base64编码,可以用来放其他证书文件里面添加.
DER Distinguished Encoding Rules 应该是不带前后信息的公私钥以及证书信息.
可以与pem进行互相转换.
CRL Certification Revocation List 保证安全的nginx后者是需要客户端认证的配置时需要添加吊销列表,
验证无效的证书不能进行访问.
OCSP Online Certificate StatusProtocol在线证书状态协议
据说有时会造成性能问题
CER 据说是DER格式的证书信息
PFXPublic Key Cryptography Standards #12,PKCS#12 一般公司下发的都是这种证书,
一般会通过一个密码来保护, 里面包含公钥私钥还有证书信息.

公钥私钥证书的区别.
私钥 就是你自己持有的一个key 不能给别人, 给了别人就会造成数据泄露. 就跟银行的usb key 类似.

公钥 就是与你自己私钥成对出现的非对称加密的另外一半, 其他人用这个公钥进行加密,
只有你的私钥才能正确解密, 也就保证了信息的私密性,给你的只有你才能看到.

证书 ca 给你的公钥盖章, 根据你的公钥和ca证书的私钥进行加密, 然后其他人收到证书, 利用CA的公钥进行解密,
验证解出来的结果就是你证书宣称的内容, 匹配就说明你的证书是你的而不是比人纂改的.
这里可以用到hash算法,保证你的公钥信息未被人进行修改.

  • 备注 以上只是个人理解.
另外一个需要注意的地方
https 的加解密只有 协议开始阶段使用了 非对称加密
在协商完协议之后 就会自动 使用堆成加密技术进行处理.
http 3.0 好像可以实现0 RTT 实时发送数据, 应该使用的就是上一次hand shake
时留公私钥加解密留下来的密钥信息.

第四部分: 操作系统信任以及浏览器信任第4.1部分: 浏览器添加
使用Windows机器是可以直接打开浏览器的属性就可以添加受信任证书了
注意一点, 如果是ca 证书 需要添加到受信任的根证书颁发机构,
这样的话如果该ca签发了一个新的证书,可以自动进行信任,
也就是浏览器会出现一个 绿色的小锁

需要注意的一定是 操作系统和浏览器都会带一个默认的一些证书.
这些证书是一些默认安全的基石, 不要随意引入不受信任的证书.避免出现安全问题

也不需要随意安装来路不明的软件, 可以给自己的操作系统安装一些 自建的ca ,
那么再出现钓鱼软件时 可能就会提示网站是安全的了.

第4.2部分 windows系统直接添加
certmgr.msc
一般情况下可以通过浏览器来添加, 也可以使用 如上命令进行添加.
Windows 一般用的都比较熟悉, 这里就不再多费口舌了

第4.3部分 linux系统的处理
一般情况下不同操作系统的证书文件不一样, 我这里选择一个常见的地址进行处理.
注意需要使用 > > 进行添加, 不然文件被覆盖了 很多文件都会提示不授信了.

openssl x509 -in ca.crt -out ca.pem -outform PE
# 将ca 证书转换成 pem 格式后缀
cat ca.pem> > /etc/pki/tls/certs/ca-bundle.crt
# 添加到操作系统授信CA证书列表中.
可以使用curl 某一个自建的https 连接, 如果没有在授信列表里面可能提示错误,
如果添加了 就可以直接使用curl后去https的内容了.

第五部分 jdk的Keytool 相关
jdk自己有一个keytool的工具用来管理自己的密钥信息
一个简单的例子,可以讲我nginx内的密钥添加到jdk的授信密钥库中

keytool -import -alias myca -keystore /yourjdk/server/runtime/java/x86_64-linux/
jre/lib/security/cacerts -file /server.crt-trustcacerts

注意 这个cacerts 的默认密码是
changeit
# 注意加入这个密钥对之后才可以信任你的根证书才能够进行相关的TLS层的通信加密处理.
# 可以保留这个文件, 直接放到新的jdk 里面就可以直接使用 这个证书发送tls请求了.

第六部分 简单的实现nginx双向SSL的过程
一般情况下linux机器都会自带openssl的工具链,所以可以直接使用.
跟前面描述的一致,需要使用openssl.cnf 进行描述自己需要将哪些域名进行生成证书.
可以在最后面使用 DNS9 = www.example.com 的方式来处理.

当然第一步还是形成ca
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt

genrsa和 req 是openssl 的两个工具链. -days 描述证书有效时间. -key指代导入的私钥信息 -out 指代导出的文件.
-new 生成 -x509 指代格式一般只需要记住就可以了, 不需要特别复杂的说明

第六部分 简单的实现nginx双向SSL的过程
制作服务器端证书:
openssl req -new -nodes -keyout server.key -out server.csr -config openssl.cnf
# 这里使用了刚才说的配置文件, 注意如果不在当前目录,需要指代完整目录.
# 注意这一步同时生成了 key和 csr 证书申请文件.
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial /
-out server.crt -days 36000 -extfile openssl.cnf -extensions v3_req
# 生成证书申请. x509 也是命令工具链.
# 注意这里使用的是 ca证书进行验证.
openssl x509 -text -in server.crt
# 这个命令可以使用 文本方式查看证书的信息以及支持的域名等.

第六部分 简单的实现nginx双向SSL的过程
制作客户端证书
openssl genrsa -out test01.key 4096
# 生成私钥信息, 这一步跟ca 一样
# 但是跟server的不太一样, 因为server有较多的描述信息
openssl req -new -key test01.key -out test01.csr
# 这里需要输入很多信息, 手工描述即可.
# 也可以写一个别的 openssl.cnf 文件进行描述, 但是可能没一个客户端都得写一个
openssl x509 -req -days 36500 -CA ca.crt -CAkey ca.key -CAcreateserial /
-in test01.csr -out test01.crt
# 证书有效期较长, 注意这个里面使用的是 ca 证书进行了眼前, 所以如果验证
# 证书是否是有效, 需要使用ca的证书来进行验证
openssl pkcs12 -export -out test01.pfx -inkey test01.key -in test01.crt
# 注意这一步 建议输入密码.
# pkcs 里面包含了私钥和公钥 以及证书, 是一个完整的证书链.
# 客户端有私钥来证明我是我.

第六部分 简单的实现nginx双向SSL的过程
listen443 ssl;
server_namewww.example.com;
ssl_certificate/opt/gscloudnginx/cert/server.crt;
# server证书公钥, 注意不能选择csr 一般选择 crt
# 如果crt带密码可能比较麻烦一些, 所以不建议crt加密码
ssl_certificate_key/opt/gscloudnginx/cert/server.key;
# server私钥 注意这个里面必须是key.
ssl_client_certificate /opt/gscloudnginx/cert/ca.crt;
# 根级证书公钥,用于验证各个二级client
# 需要注意这个选择.openssl x509 -req -days 36500 -CA ca.crt -CAkey ca.key /
# -CAcreateserial -in test01.csr -out test01.crt
# 与这个命令息息相关.
ssl_verify_client on;
# 开启客户端证书验证 不开启就是单向, 开启了就是双向, 客户端必须有证书.

第六部分 简单的实现nginx双向SSL的过程
浏览器的处理
nginx开启双向认证之后,客户端必须也得使用证书来证明自己身份.
所以需要导入证书, 如果打开了 ssl_verify_client on 的参数.
但是没设置证书, 就会有如下的错误提示.
400 Bad Request
No required SSL certificate was sent

导入证书一般也分为两部分.
第一部分 导入证书的ca, 也就是将颁发自己测试证书的ca证书添加到系统的:
"受信任的根证书颁发机构"
注意这一步比较重要, 如果没有这一步, 很多浏览器就会进行告警, 每次都比较繁琐.

第二部分是 导入自己的证书.
我对这块的理解是这样的.
ca 可以仅导入证书, 但是client的证书不仅要导入证书,还要导入私钥.
所以导入一个test账户的crt文件是不够的, 建议处理为 pfx 文件进行导入.

第六部分 简单的实现nginx双向SSL的过程
注意导入个人证书:
可以使用 chrome 打开设置:
搜索安全, 打开高级或者是证书管理
进入证书管理界面.
打开个人.选择导入进行处理
将选择的文件从crt修改为 pfx 等. 然后导入test账户的pfx文件.
注意需要将 openssl pkcs12 -export导出时设置的密码进行输入.
导入证书后, 需要查看一下个人证书是否正常.

可以查看高级, 将用于 "客户端身份验证" 的选项打开.
注意需要查看一下 证书的证书路径
如果已经导入了ca 那么证书是不会有黄色叹号或者是其他符号的.

打开页面就可以选择证书进行访问了.



【关于SSL证书的学习与总结】


    推荐阅读