如何在 python 中执行双向 SSL 身份验证?

use*_*370 5 python authentication ssl

我是python的初学者。我已经在python中实现了一种方式的SSL身份验证,下面是服务器端代码的一部分:

...
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 12345))
s.listen(5)
while True:
    (connection, address) = s.accept()
    connstream = ssl.wrap_socket(connection,
                                server_side=True,
                                certfile="ssl/server.crt",
                                keyfile="ssl/server.key",
                                )
    #print repr(connection.recv(65535));
    try:
        deal_with_client(connstream)
            ....
Run Code Online (Sandbox Code Playgroud)

下面是客户端代码:

import socket, ssl, pprint
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(s,
                       ca_certs="ssl/server.crt",
                       cert_reqs=ssl.CERT_REQUIRED)
ssl_sock.connect(('localhost', 12345))
print repr(ssl_sock.getpeername())
print ssl_sock.cipher()
print pprint.pformat(ssl_sock.getpeercert())
while 1:
ssl_sock.write("boo!")
s.close()
Run Code Online (Sandbox Code Playgroud)

其实我想执行两种方式的SSL认证,然后我使用openssl工具生成了ca和client的证书以及client和ca的私钥。现在我有以下六个文件:

ca.crt
server.crt
client.crt
ca.key
server.key
client.key
Run Code Online (Sandbox Code Playgroud)

那么现在如何修改服务器端和客户端代码以执行双向双向 SSL 身份验证?

对不起我的英语,请帮忙。

yeg*_*ger 0

您只需在客户端和服务器中执行相同的操作:

#server
ssl.wrap_socket(connection,
                            server_side=True,
                            certfile="ssl/server.crt",
                            keyfile="ssl/server.key",
                            ca_certs="ssl/client.crt"
                            )


#client
ssl_sock = ssl.wrap_socket(s,
                   ca_certs="ssl/server.crt",
                   cert_reqs=ssl.CERT_REQUIRED,
                   certfile="ssl/client.crt",
                   keyfile="ssl/client.key"
                   )
Run Code Online (Sandbox Code Playgroud)

我知道这是一个旧问题,但我也在寻找同样的东西,但没有找到答案。