1

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

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

# 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 的一些证书。我很困惑我应该在哪里寻找它们。我实际上/etc/ssl/certs在 EC2 服务器上找到了一些 .pem 文件,但在客户端(我的笔记本电脑)上什么也没有。

我还尝试根据本教程在 openssl 上生成用户证书,我按照步骤为服务器生成cakey.pem,为客户端,所有这些都在我的 EC2 服务器的同一目录中。当我执行时,它输出错误:cacert.pemuserkey.pemusercert-req.pemopenssl ca -in usercert-req.pem -out usercert.pem

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
unable to load certificate
140420412405408:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:696:Expecting: TRUSTED CERTIFICATE

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

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

4

1 回答 1

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)
于 2012-09-07T06:39:22.047 回答