做 SSL 客户端认证是 python

Posted

技术标签:

【中文标题】做 SSL 客户端认证是 python【英文标题】:Doing SSL client authentication is python 【发布时间】:2016-02-03 22:30:12 【问题描述】:

好的,我正在尝试使用客户端证书向 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 -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 配置中

服务器 听443; 开启ssl; 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() 打印(响应。读取())

现在我从服务器收到 400 SSL 证书错误。我做错了什么?

【问题讨论】:

看来我的问题可能是自签名证书。看起来 nginx 支持的客户端验证的唯一选项是完全打开(在自签名时失败)和 optional_no_ca(即使没有提供证书也允许客户端进入)。有没有办法让 nginx 需要有效的客户端证书而不检查受信任的 CA?还是让它信任我当地的 CA? 【参考方案1】:

看来我的问题是我没有正确创建 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 -new -key server.key -out server.csr openssl ca -out server.pem -infiles server.csr

【讨论】:

以上是关于做 SSL 客户端认证是 python的主要内容,如果未能解决你的问题,请参考以下文章

NGINX 配置 SSL 双向认证

求助delphi实现ssl验证客户端证书

SSL双向认证和单向认证的区别是啥?

关于java的SSL https协议

(chap8 确认访问用户身份的认证) SSL客户端认证

国密证书双向认证客户端发送哪个