2016-09-16 23 views
0

私はpythonスクリプトを使って電子メールを自動送信しようとしています。私は現在、openssl s_clientを使用してサーバーに接続するためのexpectスクリプトを使用しています。現在は、ユーザー名のパスワードとともに証明書ファイルのみを使用しており、電子メールを送信することができます。私は別の質問を発見しましたが、Pythonでは、暗号化されたCA証明書ファイルだけを使用するために、smtpクラスのハックまたはラッパーが必要です。キーファイルはありません。Pythonを使用してTLS経由で電子メールを送信

>>> smtpobj = smtplib.SMTP("mymailserver.com",465) 
Traceback (innermost last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Program Files (x86)\Python35-32\lib\smtplib.py", line 251, in __init__ 
(code, msg) = self.connect(host, port) 
    File "C:\Program Files (x86)\Python35-32\lib\smtplib.py", line 337, in connect 
(code, msg) = self.getreply() 
    File "C:\Program Files (x86)\Python35-32\lib\smtplib.py", line 390, in getreply 
+ str(e)) 
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [WinError 10054] An existing connection was forcibly closed by the remote host 

私が今直面している問題は、私がPythonでサーバーに接続できないことです。

私は

smtplib.SMTP_SSL(myserver, port, certfile="mycert.cert") 

を介して接続するために証明書ファイルを使用する場合、それは次のようなエラーがスローされます。

ssl.SSLError: [Errno 336265225] _ssl.c:339: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib 

私は、certファイルなしでthunderbirdを使用してサーバーに接続できます。任意のアイデア、どのように私は電子メールを送信するためにpython smtp(tls)を使用することができますか?

あなたが使用して最初のキーパスフレーズを削除する必要が

答えて

0
smtpobj = smtplib.SMTP("mymailserver.com",465) 
smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [WinError 10054] An existing connection was forcibly closed by the remote host 

このエラーは、証明書の検証とは何の関係もありません。暗黙的なTLS(開始からTLS)を必要とするポートでは、明示的なTLS(プレーン接続ではSTARTTLSコマンド)を使用しています。代わりにこれを試してみてください。それから離れて

smtpobj = smtplib.SMTP_SSL("mymailserver.com",465) 

...あなたのどちらかが唯一のCA証明書ファイルではなく、キーファイルを(使用するようにハッキングまたはSMTPクラスのラッパーが必要私は持っていない)。

私はあなたには、いくつかの概念を混同だと思う:

  • CA証明書を:これは、サーバーの証明書を検証するために必要な信頼されたルートが含まれています。あなたはこの証明書の鍵を持っておらず、あなたはそれを必要としません。
  • ローカル証明書、ローカルキー:サーバーでクライアント証明書による認証が必要な場合に使用されます。この場合、証明書と鍵の両方が必要です

おそらく指定する必要があるのは、サーバー証明書を検証するためのCA証明書です。残念ながら、smtplibはこのCA証明書を指定する方法を提供していません。 certfileを試しましたが、これはクライアント証明書認証用のローカル証明書を指定するために使用され、キーファイルが必要です。

良いニュースはです。smtplibはサーバ証明書を全く検証しないため、CA証明書を指定せずに動作します。悪い知らせは:サーバー証明書の確認がないので暗号化された接続に対する中間の攻撃の男性は簡単です

+0

これをクリアしていただきありがとうございます! SMTP_SSLは魅力的に機能しました – Sanjay

0

-

openssl rsa -in key.pem -out tempkey.pem 

そしてもう一度パスフレーズを入力 -

openssl rsa -in mycert.pem -out tempkey.pem 
openssl x509 -in mycert.pem >>tempkey.pem 

は、詳細はthisを参照してください。

+0

私はキーを持っていません(もしあれば、私の証明書に埋め込まれています)。 – Sanjay

関連する問題