2013-02-22 155 views
3

如何驗證我的扭曲SSL客戶端中的SSL服務器證書?如何驗證扭曲SSL客戶端中的SSL服務器證書

我非常初學SSL,我已經通過了twisted SSL tutorials但我仍然對某些事情不清楚。

我的查詢是:

  • 我應該如何驗證使用twisted.internet.ssl模塊的SSL服務器證書,

  • 如何ssl.ClientContextFactory.getContext方法是在處理SSL有用,

  • 我怎麼能告訴扭曲的SSL客戶端有關公鑰文件的位置?

+0

請解釋您的意思是「驗證」。通常,執行「驗證」是底層SSL實施的工作。根據你的意思,這可能已經完成,或者你可能需要編寫額外的代碼來做到這一點。 – 2013-02-26 00:26:43

+0

驗證檢查有效時間,主機名和驗證證書的意義。 – 2013-02-26 06:16:37

+0

只有主機名檢查尚未完成。 – 2013-02-27 02:37:10

回答

4

由於扭曲14.0,optionsForClientTLS是做到這一點的最佳方式:

from twisted.internet.ssl import optionsForClientTLS 
from twisted.internet.endpoints import SSL4ClientEndpoint 

ctx = optionsForClientTLS(hostname=u"example.com") 
endpoint = SSL4ClientEndpoint(reactor, host, port, ctx) 
factory = ... 
d = endpoint.connect(factory) 
... 

optionsForClientTLS採取其它(任選的)參數,以及它也可以是有用的。

此前扭曲的14.0,這個過程有點更多地參與:建立連接

後和SSL握手已經成功完成(這意味着該證書目前是否有效基於其notBeforenotAfter價值觀和它是由您已表明是可信的),你可以從傳輸拿到證書認證機構的證書籤名:

certificate = self.transport.getPeerCertificate() 

證書被表示爲pyOpenSSL X509實例。它可以用來檢索證書的主題名稱的方法:

subject_name = certificate.get_subject() 

的主題名稱是一個專有名稱,表示爲pyOpenSSL X509Name實例。您可以檢查它的領域:

common_name = subject_name.commonName 

這是一個字符串,例如"example.com"

如果需要檢查subjectAltName,而不是(這很可能你做的),那麼你就可以在證書的擴展信息:

extensions = certificate.get_extensions() 

這是pyOpenSSL X509Extension實例的列表。你必須解析每一個找到subjectAltName及其值。

+0

如何指定「.pem」文件,即如何告訴將ssl客戶端關於我的「.pem」文件位置。 – 2013-02-27 04:31:35

+0

「.pem」文件可以包含任何數量的內容。我不確定你在問什麼。它是否包含服務器需要提供的確切證書?它是否包含必須簽署服務器證書的證書頒發機構證書?它是否包含證書鏈?查看pyOpenSSL Context文檔以查看處理這些需求的API。 – 2013-02-27 16:15:21

+0

它包含證書鏈。 – 2013-02-27 16:33:19