2012-05-17 68 views
1

我有以下簡單Python代碼,其目的是執行SSL握手並驗證客戶端和服務器之間的證書:python中的這個ssl錯誤是什麼意思?

ssl_test.py:

import ssl 
import socket 

s = socket.socket() 
print "connecting..." 
#logging.debug("Connecting") 
# Connect with SSL mutual authentication 
# We only trust our server's CA, and it only trusts user certificates signed by it 
c = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, 
        ssl_version=ssl.PROTOCOL_SSLv3, ca_certs='ca.crt', 
        certfile='user.crt', keyfile='user.key') 
c.connect((constants.server_addr, constants.port)) 

當我執行此,我得到以下錯誤。

>python ssl_test.py 
Traceback (most recent call last): 
    File "ssl_test.py", line 12, in <module> 
    c.connect(('192.168.1.82', 7070)) 
    File "C:\Python27\lib\ssl.py", line 331, in connect 
    self._real_connect(addr, False) 
    File "C:\Python27\lib\ssl.py", line 314, in _real_connect 
    self.ca_certs, self.ciphers) 
ssl.SSLError: [Errno 0] _ssl.c:340: error:00000000:lib(0):func(0):reason(0) 

這個錯誤是什麼意思,我該如何解決它?

回答

3

這看起來像http://bugs.python.org/issue2687,在下面的答案給出:

沒有,問題是在客戶端的「ca_certs」的說法。 您不能使用目錄。您必須使用包含多個 級聯證書的文件。我會加強文檔,使其更清晰。

我看到你的ca_certs是一個文件,而不是目錄,但也許這仍然有一些光。 ca.crt文件是否有效地格式化並放置在正確的位置?

+0

它可能已經格式錯誤。不知道這是怎麼發生的,但我直接從服務器上下載了證書(我有ssh訪問權限)並使用該證書,並能夠使其工作。謝謝! – ewok

+0

@ewok,如果您需要更一般的CA證書列表,您可以檢查[此問題](http://stackoverflow.com/q/10095676/372643)。 – Bruno

2

我是新來的Python,並在搜索原始ssl.SSLError後結束了這條線索。我知道這並不能幫助原來的海報,但它可以幫助其他人解決這個錯誤。大多數Python示例使用:

ca_certs="/etc/ca_certs_file" 

由於此文件不存在,因此會出現此錯誤。要在最新版本的Linux上使用系統CA證書,請使用:

ca_certs="/etc/ssl/certs/ca-certificates.crt"