关于证书
- 证书是用来实现https通信加密的基础,有证书才能够进行相关的TLS层的加密处理. 本文简要讲解一下证书的申请,创建以及使用等.
第一部分: PKI
公共密钥基础
其实有很多家企业在做PKI, 他们的根密钥一般都是线下管理的. 一般能够现上处理的密钥都是根ca认证的2级后者是3级证书, 这样比较安全不会出现密钥泄漏问题.
国际的大厂有:DigiCert Symantec 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编码的.
- csr Certificate 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格式的证书信息
- PFX Public Key Cryptography Standards #12,PKCS#12 一般公司下发的都是这种证书,一般会通过一个密码来保护, 里面包含公钥私钥还有证书信息.
注意 公钥私钥证书的区别.
私钥 就是你自己持有的一个key 不能给别人, 给了别人就会造成数据泄露. 就跟银行的usb key 类似.
公钥 就是与你自己私钥成对出现的非对称加密的另外一半, 其他人用这个公钥进行加密, 只有你的私钥才能正确解密, 也就保证了信息的私密性,给你的只有你才能看到.
证书 ca 给你的公钥盖章, 根据你的公钥和ca证书的私钥进行加密, 然后其他人收到证书, 利用CA的公钥进行解密, 验证解出来的结果就是你证书宣称的内容, 匹配就说明你的证书是你的而不是比人纂改的. 这里可以用到hash算法,保证你的公钥信息未被人进行修改.
备注 以上只是个人理解.
另外一个需要注意的地方
https 的加解密只有 协议开始阶段使用了 非对称加密
在协商完协议之后 就会自动 使用堆成加密技术进行处理.
http 3.0 好像可以实现0 RTT 实时发送数据, 应该使用的就是上一次hand shake 时留公私钥加解密留下来的密钥信息.
第四部分: 操作系统信任以及浏览器信任
第一部分: 浏览器添加
使用Windows机器是可以直接打开浏览器的属性就可以添加受信任证书了
注意一点, 如果是ca 证书 需要添加到受信任的根证书颁发机构, 这样的话如果该ca签发了一个新的证书,可以自动进行信任, 也就是浏览器会出现一个 绿色的小锁
需要注意的一定是 操作系统和浏览器都会带一个默认的一些证书. 这些证书是一些默认安全的基石, 不要随意引入不受信任的证书.避免出现安全问题
也不需要随意安装来路不明的软件, 可以给自己的操作系统安装一些 自建的ca , 那么再出现钓鱼软件时 可能就会提示网站是安全的了.
第二部分 windows系统直接添加
certmgr.msc
一般情况下可以通过浏览器来添加, 也可以使用 如上命令进行添加.
Windows 一般用的都比较熟悉, 这里就不再多费口舌了
第三部分 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请求了.
第六部分 总结
太困了 先不总结了..