客户端证书在tls

时间:2012-09-06 23:56:59

标签: python openssl ssl

我已经坚持了几天,但仍然无法理解。我只想在python中构建一个简单的TLS c / s通信。对于服务器我使用EC2,客户端我使用自己的笔记本电脑。我设置并测试正常的套接字通信,一切正常。

当我从官方文档中尝试this tutorial时,我遇到了问题。对于以下客户端代码:

# require a certificate from the server
ssl_sock = ssl.wrap_socket(s,
                           ca_certs="/etc/ca_certs_file",
                           cert_reqs=ssl.CERT_REQUIRED)

据我所知,部分/etc/ca_certs_file应该是来自CA的一些证书。我很困惑应该在哪里寻找它们。我实际上在EC2服务器上的/etc/ssl/certs中找到了一些.pem文件,但客户端,笔记本电脑上没有任何内容。

我还尝试根据this tutorial on openssl生成用户证书,我按照步骤操作,为服务器生成cakey.pemcacert.pemuserkey.pem,{{1}对于客户端,所有都在我的EC2服务器的同一目录中。当我执行usercert-req.pem时,它输出错误:

openssl ca -in usercert-req.pem -out usercert.pem

那么实际上该如何生成此证书文件?在服务器端生成,然后等待客户端通过无线方式请求它们,或者在客户端生成,或者从第三方获取并直接在客户端使用?

有人可以提供任何指导吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

这将创建一个自签名证书对,私钥将在同一个文件中:

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem

然后从服务器端的python开始:

new_client_socket, address = server_socket.accept()
secured_client_socket = ssl.wrap_socket(new_client_socket,
                                        server_side=True,
                                        certfile='cert.pem',
                                        keyfile='cert.pem',
                                        ssl_version=ssl.PROTOCOL_TLSv1)

客户端应用程序:

unsecured_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket = ssl.wrap_socket(unsecured_client_socket,
                                ca_certs='cert.pem',
                                cert_reqs=ssl.CERT_REQUIRED,
                                ssl_version=ssl.PROTOCOL_TLSv1)