最近一直在使用OpenSSL生成证书,供tornado使用,tornado本身是支持使用SSL证书的,所有现在只需生成正确的证书就可以正常使用了,经过自己的一番倒腾,走了很多弯路,终于是可以使用了,所以将步骤记录下来,以便于自己查看,要是能对大家有帮助那就更好啦!(以下步骤亲测有效,遇到的坑也会在下文提到,望高手指教!)
1、安装OpenSSL
本来准备直接放一个链接在这的,但是感觉不是特别的准确,所以借鉴这个在写详细一些。
(1)OpenSSL下载( [https://www.openssl.org/source/(https://www.openssl.org/source/))没有提供windows版本的安装包,可以选择其他开源平台提供的工具。例如 http://slproweb.com/products/Win32OpenSSL.html
根据你的系统来选择不同的版本下载安装
点击运行文件后直接下一步就可以了,没有什么特殊设置。
(2)设置环境变量,例如工具安装在C:\OpenSSL-Win64,则将C:\OpenSSL-Win64\bin;复制到Path中
这个路径需要写自己的安装路径呀,exe在bin文件中,所以记得加上bin
部分借鉴:https://blog.csdn.net/kitok/article/details/72957185
2、生成证书
在bin(bin文件在安装目录里面)文件中打开cmd,依次输入以下命令:
注意:这里有一个大坑,我也是爬了好久的,所以先跟大家说明一下,再详细说命令。
由于Chrome 58 及以上版本只会使用 subjectAlternativeName 扩展程序(而不是 commonName)来匹配域名和网站证书。如果直接按照下面的步骤生成的ssl证书是不能直接在谷歌正常使用的,会说证书无效,并报错:NET::ERR_CERT_COMMON_NAME_INVALID 。
以下是谷歌对这个错误的说明(https://support.google.com/chrome/a/answer/7391219?hl=zh-Hans)
所以需要先解决这个问题,以下为解决步骤:
主要修改在openssl.cnf(该文件在bin文件中)
确保req下存在以下2行(默认第一行是有的,第2行被注释了)
[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req
确保req_distinguished_name下没有 0.xxx 的标签,有的话把0.xxx的0. 去掉
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = ShangHai
localityName = Locality Name (eg, city)
localityName_default = ShangHai
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = Domain Control Validated
commonName = Internet Widgits Ltd
commonName_max = 64
新增最后一行内容 subjectAltName = @alt_names(前2行默认存在)
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
新增 alt_names,注意括号前后的空格,DNS.x 的数量可以自己加
[ alt_names ]
DNS.1 = abc.example.com
DNS.2 = dfe.example.org
DNS.3 = ex.abcexpale.net
DNS.4 = localhost
以上是为了添加‘使用者备用名称(DNS)’,在下面的命令中会用到v3_req 也就是这几个DNS,证书里面才会多一个‘使用者备用名称’,如图:
借鉴:http://blog.51cto.com/colinzhouyj/1566438
客户端
- 生成私钥(key文件):
openssl genrsa -out client.key 2048
- 生成csr文件
openssl req -new -key client.key -out client.csr -config openssl.cnf
这里需要填写一些基本信息:
服务器端
- 生成私钥(key文件):
openssl genrsa -out server.key 2048
- 生成csr文件
openssl req -new -key server.key -out server.csr -config openssl.cnf
这里的Common Name 写主要域名就好了(注意:这个域名也要在openssl.cnf的DNS.x里)
CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.
1、在bin目录下新建目录 demoCA、demoCA/certs、demoCA/certs、demoCA/newcerts
2、在demoCA建立一个空文件 index.txt
3、在demoCA建立一个文本文件 serial, 没有扩展名,内容是一个合法的16进制数字,例如 0000
4、生成ca.key并自签署
openssl req -new -x509 -days 3650 -keyout ca.key -out ca.crt -config openssl.cnf
用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -extensions v3_req -config openssl.cnf
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -extensions v3_req -config openssl.cnf
到这里证书就生成好了,下一步就是在tornado中使用了,详情请看下一节python tornado使用OpenSSL生成的证书。
资料:
http://www.yeolar.com/note/2015/04/30/tornado-ssl-https/
http://blog.51cto.com/colinzhouyj/1566438