最近一直在使用OpenSSL生成證書守屉,供tornado使用讥邻,tornado本身是支持使用SSL證書的,所有現(xiàn)在只需生成正確的證書就可以正常使用了蜒什,經(jīng)過自己的一番倒騰测秸,走了很多彎路,終于是可以使用了灾常,所以將步驟記錄下來霎冯,以便于自己查看,要是能對大家有幫助那就更好啦8诒铩(以下步驟親測有效肃晚,遇到的坑也會在下文提到,望高手指教W懈辍)
1关串、安裝OpenSSL
本來準備直接放一個鏈接在這的拧廊,但是感覺不是特別的準確,所以借鑒這個在寫詳細一些晋修。
(1)OpenSSL下載( [https://www.openssl.org/source/(https://www.openssl.org/source/))沒有提供windows版本的安裝包吧碾,可以選擇其他開源平臺提供的工具。例如 http://slproweb.com/products/Win32OpenSSL.html
根據(jù)你的系統(tǒng)來選擇不同的版本下載安裝
點擊運行文件后直接下一步就可以了墓卦,沒有什么特殊設(shè)置倦春。
(2)設(shè)置環(huán)境變量,例如工具安裝在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)來匹配域名和網(wǎng)站證書骂维。如果直接按照下面的步驟生成的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
新增最后一行內(nèi)容 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 的數(shù)量可以自己加
[ 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
這里需要填寫一些基本信息:
服務(wù)器端
- 生成私鑰(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的簽名才可形成證書.可將此文件發(fā)送到verisign等地方由它驗證,要交一大筆錢,何不自己做CA呢.
1项阴、在bin目錄下新建目錄 demoCA、demoCA/certs笆包、demoCA/certs环揽、demoCA/newcerts
2、在demoCA建立一個空文件 index.txt
3庵佣、在demoCA建立一個文本文件 serial, 沒有擴展名歉胶,內(nèi)容是一個合法的16進制數(shù)字,例如 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中使用了粥谬,詳情請看下一節(jié)python tornado使用OpenSSL生成的證書。
資料:
http://www.yeolar.com/note/2015/04/30/tornado-ssl-https/
http://blog.51cto.com/colinzhouyj/1566438