好的,我正在尝试使用客户端证书向Nginx服务器认证python客户端。这是我到目前为止尝试过的:
创建一个本地CA
openssl genrsa -des3 -out ca.key 4096 openssl req -new -x509 -days 365 -key ca.key -out ca.crt
创建的服务器密钥和证书
openssl genrsa -des3 -out server.key 1024 openssl rsa -in server.key -out server.key openssl req-新-key server.key -out server.csr openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
使用类似的过程来创建客户端密钥和证书
openssl genrsa -des3 -out client.key 1024 openssl rsa -in client.key -out client.key openssl req-新-key client.key -out client.csr openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
将这些行添加到我的Nginx配置中
服务器{
听443;
ssl on;
server_name dev.lightcloud.com;
keepalive_timeout 70;
access_log /usr/local/var/log/nginx/lightcloud.access.log;
error_log /usr/local/var/log/nginx/lightcloud.error.log;
ssl_certificate /Users/wombat/Lightcloud-Web/ssl/server.crt;
ssl_certificate_key /Users/wombat/Lightcloud-Web/ssl/server.key;
ssl_client_certificate /Users/wombat/Lightcloud-Web/ssl/ca.crt;
ssl_verify_client;
地点 / {
uwsgi_pass unix:///tmp/uwsgi.socket;
包括uwsgi_params;
}
}
创建了PEM客户端文件
cat client.crt client.key ca.crt> client.pem
创建了一个测试python脚本
进口ssl 导入http.client 上下文= ssl.SSLContext(ssl.PROTOCOL_SSLv23) context.load_verify_locations(“ ca.crt”) context.load_cert_chain(“ client.pem”) conn = http.client.HTTPSConnection(“ localhost”,context = context) conn.set_debuglevel(3) conn.putrequest('GET','/') conn.endheaders() 响应= conn.getresponse() 打印(response.read())
现在,我从服务器收到400 SSL证书错误。我究竟做错了什么?
看来我的问题是我没有正确创建CA,并且没有以正确的方式对密钥进行签名。需要对CA证书进行签名,如果您假装为顶级CA,则需要对CA证书进行自签名。
openssl req -new -newkey rsa:2048 -keyout ca.key -out ca.pem openssl ca -create_serial -out cacert.pem -days 365 -keyfile ca.key -selfsign -infiles ca.pem
然后使用ca命令对请求进行签名
openssl genrsa -des3 -out server.key 1024 openssl req-新-key server.key -out server.csr openssl ca -out server.pem -infiles server.csr