我试图在Python服务器和Android客户端应用程序之间实现双向SSL身份验证。我可以访问服务器和客户端,并希望使用自己的证书实现客户端身份验证。到目前为止,我已经能够验证服务器证书并在没有客户端身份验证的情况下进行连接。在
客户端需要什么类型的证书?在握手过程中,如何让它自动发送到服务器?这是我目前为止得到的客户端和服务器端代码。我的方法错了吗?在
服务器代码while True: # Keep listening for clients
c, fromaddr = sock.accept()
ssl_sock = ssl.wrap_socket(c,
keyfile = "serverPrivateKey.pem",
certfile = "servercert.pem",
server_side = True,
# Require the client to provide a certificate
cert_reqs = ssl.CERT_REQUIRED,
ssl_version = ssl.PROTOCOL_TLSv1,
ca_certs = "clientcert.pem", #TODO must point to a file of CA certificates??
do_handshake_on_connect = True,
ciphers="!NULL:!EXPORT:AES256-SHA")
print ssl_sock.cipher()
thrd = sock_thread(ssl_sock)
thrd.daemon = True
thrd.start()
我怀疑我可能用错了认证文件。。。?在
客户代码
^{pr2}$
我已经使用openssl生成了一个客户端私钥、一个客户端证书、一个服务器私钥和一个服务器证书。然后我将客户机证书添加到keystore.bks(存储在/res/raw/keystore.bks)中,然后将服务器证书添加到truststore.bks
所以现在当客户机尝试连接时,我得到了一个错误服务器端:ssl.SSLError: [Errno 1] _ssl.c:504: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate
当我尝试在android客户端中执行此操作时SSLSession s = mSSLSocket.getSession();
s.getPeerCertificates();
我得到这个错误:javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
所以很明显,我使用的密钥库中似乎没有正确的对等证书,因此没有向服务器发送证书。在
我应该在密钥库中放些什么来防止这个异常?在
此外,这种双向SSL认证方法是否安全有效?在