Python2.7双向认证
一、生成SSL证书
生成CA根证书
- 准备ca配置文件,得到ca.conf
vi ca.conf
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Sy
localityName = Locality Name (eg, city)
localityName_default = Sy
organizationName = Organization Name (eg, company)
organizationName_default = Sheld
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = CA Test
-
生成ca秘钥,得到ca.key
openssl genrsa -out ca.key 4096 -
生成ca证书签发请求,得到ca.csr
openssl req -new -sha256 -out ca.csr -key ca.key -config ca.conf
配置文件中已经有默认值,shell交互时一路回车就行。
- 生成ca根证书,得到ca.crt
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
生成终端用户证书
- 准备配置文件,得到server.conf
vi server.conf
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Sy
localityName = Locality Name (eg, city)
localityName_default = Sy
organizationName = Organization Name (eg, company)
organizationName_default = Sheld
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = www.xxx.com
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.xxx.com
DNS.2 = www.xxx1.com
IP = 10.10.127.12
Chrome 58以后不再使用CN校验地址(就是就是浏览器地址栏URL中的那个地址host)了,而是使用SAN,注意配置里写对。IE 11还是使用CN
- 生成秘钥,得到server.key
openssl genrsa -out server.key 2048
- 生成证书签发请求,得到server.csr
openssl req -new -sha256 -out server.csr -key server.key -config server.conf
配置文件中已经有默认值了,shell交互时一路回车就行。
- 用CA证书生成终端用户证书,得到server.crt
openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -extensions req_ext -extfile server.conf
验证
-
配置web服务器
python manage.py runserver_plus --cert-file server.crt --key-file server.key 0.0.0.0:8000
把生成好的server.crt和server.key文件放在与应用同一目录下。 -
添加CA根证书
右键ca.crt安装,安装到“受信任的根证书颁发机构”(不然server.crt还是不受信任的) -
改hosts
客户端机器,Windows系统本地测试,改下hosts以访问域名
C:\Windows\System32\drivers\etc\hosts
添加如下内容
127.0.0.1 www.xxx.com
-
启动web服务,Chrome浏览器访问https://www.xxx.com
FireFox配置参照网上教程导入ca证书即可。
二、验证SSL证书
生成pem证书
通过ca.crt证书生成PEM证书
openssl x509 -in ca.crt -out mycert.pem -outform PEM
python2.7 mock
vim mock.py
import json
import requests
url='https://IP地址:8000/接口路径'
req_data = {参数列表}
requests.packages.urllib3.disable_warnings()
resp = requests.request('POST', url, data=json.dumps(req_data), verify='mycert.pem')
print(resp)
响应结果:
经过多次尝试将requests中verify设置为True,传递cert为元组方式返回结果都是异常。所以为了避免这种现象才采取了verify方式。如有大神通过cert方式实现,请不吝赐教,在此感激不尽~
参考资料
感谢以上博主!