2011-02-24 24 views
1

連接到支持STARTTLS並獲得服務器SSL證書的SMTP服務器的最簡單方法是什麼?我知道它可以使用OpenSSL的這樣使用Python獲取smtp服務器證書

openssl s_client -starttls smtp -crlf -connect 192.168.0.1:25 

我怎麼能做到這一點從內Python和我不想叫OpenSSL和分析其輸出來完成的東西。我查看了一個openssl封裝的M2Crypto,但據我所知,它不支持starttls。非常感謝如何用Python庫做到這一點的一個例子。

+0

這真的很難。截至目前,Python的本地SSL不會讓您獲取無效證書的詳細信息。它只會返回有效證書的證書信息。 :(你需要使用第三方庫,如PyOpenSSL或M2Crypto。在這裏看到一個相關的帖子:http://stackoverflow.com/questions/7689941/how-can-i-retrieve-the-ssl-certificate-information- for-a-connection-whether-its – SilentSteel 2013-09-04 02:16:34

回答

0

你可以嘗試這樣的:

import ssl 
cert = ssl.get_server_certificate(('imap.gmail.com',993)) 

獲得服務器證書

+0

對於普通的SSL連接,比如通過SSL,https等使用imap,但沒有需要使用STARTTLS啓動的連接。 – mozza 2011-02-24 18:54:25

+0

@mozza:啊,我明白了。在openssl包裝庫在https://launchpad.net/pyopenssl?和afais,你更感興趣的是根ca本身,而不是隻通過smtp發送郵件,對吧? – 2011-02-24 19:23:58

+0

謝謝 - 只是想知道如何獲得服務器的證書 – mozza 2011-02-24 19:30:44

1

這將返回以二進制格式(DER編碼)的證書:

import socket, ssl 
s = socket.socket() 
s.connect(("host", 25)) 
s.send("STARTTLS\n") 
s.recv(1000) 
ss = ssl.wrap_socket(s) 
certificate_der = ss.getpeercert(True) 

這是理所當然的給你一個想法,錯誤處理等。如果你想解碼來自證書的信息,你必須爲可接受的CA提供證書頒發機構的bundle /目錄(getpeercert()將在這種情況下返回一個有意義的字典),或者使用更強大的ssl庫,例如M2Crypto。

相關問題