新浪博客

利用openssl生成证书—增加subjectaltname字段(SANs)

2014-12-02 13:46阅读:
最近工作一在搞https,其中生成证书遇到了很多问题,通过查询资料基本解决了需求,希望总结一下自己遇到的难点,以便能帮助以后遇到问题的人。
1.Https其实就是http的加密版,对http明文进行了对称加密传输,对称加密密钥通过https之前的握手协商(TLS流程)生成
2.TLS流程用于生成本次https会话使用的对称加密密钥,TLS流程是一个非对称加密协商的过程,客户端会将随机生成一个会话对称密钥,并且用证书中的公钥对对称密钥加密,传给https服务端,服务端通过只有自己知道的私钥解开客户端加密的消息,获得客户端的对称密钥,以后传输https消息都用对称密钥加密消息传输,达到了消息的保密安全传输。具体TLS协商流程网上已经有很多说明了。
3.证书是https实现加密的必要途径,一般的https服务都是单向认证的过程,单向认证就是对服务器的认证,保证服务器的可靠性,正确的生成证书的方式是服务器(也就是https服务的提供者)生产私钥和公钥对,然后将公钥交给CA(就是证书颁发结构),CA会给用户的公钥进行签名生成证书,然后将证书颁发给服务端,这样用户访问https服务的时候,就能获得服务端的证书,由于是第三方可靠的CA进行签名过的证书,客户端就会信任https网站,并且不做安全提醒,如果证书不是由第三方受信任的CA机构颁发,客户端就会提示服务器危险信息。
4.一般模拟测试都是用openssl和jdk工具生成模拟证书,生成证书要注意的生成的证书要是自己服务器的ip或者域名
5.https也有双向认证,双向认证需要客户端也生成证书,客户端检查服务器的证书,服务器检查客户端的证书,一般都不做客户端的检查认证,所以基本都是单向认证。
6.jdk自带的keytool工具可以生成证书库,但是keytool生成的证书库不方便提取私钥,需要编程才能从keystore文件中提取私钥,不方便wireshark解密https抓包,openssl比较方便提取私钥,建议使用
7.模拟生成测试证书可以按照网上的说明进行
http://blog.csdn.net/jasonhwang/article/details/2344768
思路是先生成自签名CA证书,在用生成的CA证书签发自己的证书
8.由于项目中需要证书中携带subjectaltname字段,我也不太清楚这个字段是做什么的,网上有人说这个是用来扩展域名用的,我也不太清楚,我把自己用到的所有ip和域名都配置进去了
主要注意以下命令(还是按照CSDN生成证书的基本思路):
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config '$HOME/testcabsk/conf/gentestca.conf' -extensions v3_req
openssl pkcs12 -export -in servercert.pem -inkey serverkey.pem -out tomcat.p12 -name tomcat -CAfile '$HOME/testca/cacert.pem' -caname root -chain -extensions v3_req



-extensions v3_req---------v3_req 是配置文件中的配置,附上配置文件
[req]req_extensions = v3_req
[ v3_req ]
basicConstraints = CA:TRUE
subjectAltName = @alt_names
[alt_names]
IP.1=your ip
DNS.1 = your domain
DNS.2 = your domain

我的更多文章

下载客户端阅读体验更佳

APP专享