即使是非对称加密系统,也不能保证公钥的分发是可靠的. 为了防范公钥分发过程中的中间人攻击,需要一个可信的"始祖"公证人,这就是CA机构存在的意义.
由CA签发证书认证网站的过程
- CA机构生成密钥对: 公钥 ca.cer 和 私钥 ca.key
- 浏览器/操作系统携带证书ca.cer
- 网站生成私钥 cert.key
- 网站将公钥及网站信息(域名/组织等),提交给CA机构
- CA机构使用私钥ca.key签发网站证书cert.cer
- 网站运营商通过cert.key和 cert.cer运行https
- 用户访问网站,获得cert.cer,由于该证书使用CA机构的私钥签发,因此可以通过保存在本地的公钥ca.cer验证
- 验证通过并得到了公钥-> 显示绿色https标志; 否则,提示用户风险信息
- 用户通过公钥与网站服务器交换对称加密密钥,进行正式的SSL会话
通过上述步骤可以看出,只要能保证网站公钥的可靠性即可,所以如果客户端直接存放了网站的证书,那么也是可以保证https正常进行的.
但是无论是何种证书,都需要可靠的分发到客户端才能保证安全.在开发过程中我们可能有各种各样的服务端,相较于为每一个服务端向客户端分发证书,还不如直接分发根证书,这样只需一次分发,客户端就可以完成后续的签发过程.
自认证CA根证书生成及签发
证书生成过程可以通过openssl完成.为了简化操作,我写了一个shell脚本,只需两步即可生成根证书及使用根证书签发网站证书
保存以下代码为gen_crt.sh,然后按照帮助内容使用即可.
-
生成根证书
./gen_crt.sh root aes128 2048 365 "/CN=MyCA"此时目录下有ca.key及ca.cer两个文件,ca.cer需要发布到客户端
为了保证私钥的安全,生成过程中需要一个对ca.key加密的密码 -
签发网站证书
./gen_crt.sh sign aes128 2048 365 "/CN=www.mysite.com" ca.key ca.cer
为了保证私钥的安全,生成过程中需要一个对cert.key加密的密码.