生成自签名 TLS 证书
由 HTTPS 看 TLS 握手过程
TLS 的握手过程如下:
- 第一次握手,约定加密算法,TLS 的版本
- 第二次握手,交换证书。服务器把证书发送给客户端,客户端验证证书合法性,如果有
必要,客户端也可以发送自己的证书给服务端 - 第三次握手,交换对称秘钥。客户端用服务端证书携带的公钥加密对称秘钥,发送给服
务端,服务端用私钥解密。 之后双方通过这个对称秘钥进行加密通信 。
上面的过程有两个关键:
- 客户端需要验证证书合法性
- TLS 的握手阶段是采用非对称加密,而真正通信仍然是对称加密的
第二点比较容易解释,因为对称加密更快,所以不会用非对称加密来加密真正需要传播的信
息。
对于第一点,首先,证书本质是一个文本文件,它携带了服务器的若干信息,比如所属公司,
所属公司的地址,域名,还有公钥。同时,证书的合法性是由另一个证书保证的,更高一级
的证书可以对其他证书进行签名(Signature)。数字签名就是利用私钥加密一端摘要,验
证签名时用公钥解密,如果解密后的摘要和原来的相同,则为合法证书。
数字签名的过程和非对称加密的区别在于,数字签名使用私钥加密,而加密通信是使用公钥
加密。
高级证书为下一级证书签名,做“担保”,那么高级证书自身也需要被证明合法性,这就产生
了自举问题。所以最高级的证书,也就是根证书,都是自签名的,最终形成一条证书链。
根证书由一些权威机构保证安全,比如 Symantec,GoDaddy,并且它们会被预先安装到浏览
器中。当验证证书合法性时,会沿着证书链条,一直上溯到根证书。
对于个人来说,没有必要申请根证书的签名,但是现在一些应用会要求使用 TLS 加密,办法
有两个:1. 使用 Let’s Encrypt;2. 使用自签名证书。
自签名过程
Prosody 是一个支持 XMPP 协议的通信服务器,以 Prosody 为例,来生成一个可以使用的
私钥和证书。
进入 /etc/ssl/private
目录:
生成根秘钥匙
1
openssl genrsa -out cakey.pem 2048
利用根秘钥签名,生成根证书。需要填写地区,公司,域名,邮箱等信息
1
openssl req -new -x509 -key cakey.pem -out cacert.pem
下面用根证书来签名需要使用的证书:
生成应用的私钥
1
openssl genrsa -out prosody.key 2048
用应用私钥生成证书请求
1
openssl req -new -key prosody.key -out prosody.csr
用根证书,根据证书请求对应用证书进行签名
1
2
3# 该命令会根据 /etc/ssl/openssl.cnf 中根证书的位置,去查找需要使用的根证书
# 在这个例子里,就是 cacert.pem 的位置
openssl ca -in prosody.csr -out prosody.crt