4
好吧,我想用客户端证书来验证一个Nginx服务器的Python客户端。以下是我试过到目前为止:做SSL客户端身份验证是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 -new -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 -new -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配置中
server { listen 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 on; location/{ uwsgi_pass unix:///tmp/uwsgi.socket; include uwsgi_params; } }
创建PEM客户端文件
cat client.crt client.key ca.crt > client.pem
创建了一个测试python脚本
import ssl import http.client context = 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() response = conn.getresponse() print(response.read())
现在我得到400来自服务器的SSL证书错误。我究竟做错了什么?
它看起来像我的问题可能是自签名的证书。看起来像nginx支持的客户端验证的唯一选项是全自动在自签名上失败,而optional_no_ca允许客户端即使没有提供证书。有没有办法让nginx需要有效的客户端证书而不检查可信任的CA?或者让它信任我的本地CA? –