继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

亲测:windows使用OpenSSL生成证书(使用者备用名称(DNS))

慕虎7371278
关注TA
已关注
手记 1125
粉丝 201
获赞 871

最近一直在使用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
根据你的系统来选择不同的版本下载安装

webp

image.png


点击运行文件后直接下一步就可以了,没有什么特殊设置。
(2)设置环境变量,例如工具安装在C:\OpenSSL-Win64,则将C:\OpenSSL-Win64\bin;复制到Path中

webp

image.png


这个路径需要写自己的安装路径呀,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

webp

image.png


所以需要先解决这个问题,以下为解决步骤:
主要修改在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,证书里面才会多一个‘使用者备用名称’,如图:


webp

image.png


借鉴: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

这里需要填写一些基本信息:


webp

image.png

服务器端
  • 生成私钥(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.cnfopenssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -extensions v3_req -config openssl.cnf

到这里证书就生成好了,下一步就是在tornado中使用了,详情请看下一节python tornado使用OpenSSL生成的证书



作者:youfrweb
链接:https://www.jianshu.com/p/acbf23f86880


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP