2012-09-06 301 views
1

我堅持了幾天,仍然無法弄清楚。我只想在python中構建一個簡單的TLS c/s通信。對於我使用EC2的服務器,客戶端使用我自己的筆記本電腦。我設置和測試正常的套接字通信,一切正常。tls客戶端證書

當我從官方文檔中嘗試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生成一個用戶證書,我遵循的步驟,在我的EC2服務器產生cakey.pemcacert.pem服務器,userkey.pemusercert-req.pem客戶端,都在同一個目錄下。當我執行openssl 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 

所以實際上應該如何獲取生成此證書文件?在服務器端生成,然後等待客戶端通過無線請求,或者在客戶端生成,或者從第三方獲取並直接在客戶端使用?

任何人都可以提供任何指導?任何幫助表示讚賞。

回答

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) 
+0

感謝您的回覆。那麼通過命令,我們是否會生成兩個具有相同名稱的.pem文件,以便將所有信息保存在一個文件中? – Yulong

+0

是的,兩個密鑰將被放置在同一個文件中,無論您在何處生成該文件,只需將其複製到另一側,以便客戶端和服務器都將使用該文件。 順便說一句,如果你指定了兩個不同的文件名,這些鍵當然會放在兩個不同的文件中。 – andrean

+0

我明白了。我得到了它的工作。非常感謝你! – Yulong