2016-09-16 3 views
0

Я пытаюсь автоматизировать отправку электронной почты с помощью скрипта python. В настоящее время я использую сценарий ожидания для использования openssl s_client для подключения к серверу. В настоящее время мы используем только файл сертификата вместе с паролем имени пользователя, и он позволяет мне отправить электронное письмо. Я нашел еще один вопрос, в котором упоминалось, что в python вам нужно либо взломать, либо оболочку вокруг класса smtp использовать только файл сертификата CA, а не файл ключа (которого у меня нет).Использование 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 

Обратите внимание, что я могу подключиться к серверу с помощью 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 (т. Е. Команду STARTTLS для простого соединения) на порту, который требует неявного TLS (TLS от запуска). Попробуйте вместо этого:

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

Помимо этого:

... вам необходимо либо хак к или обертку класса Smtp использовать только CERT файл CA, а не ключевой файл (которого у меня нет).

Я думаю, что вы путаете несколько понятий:

  • CA серто: это содержит доверенный корень, который необходим для проверки сертификата сервера. У вас нет ключа для этого сертификата, и он вам не нужен.
  • локальный сертификат, локальный ключ: они используются, если сервер требует аутентификации с сертификатом клиента. В этом случае необходимы оба сертификата и ключ

Возможно, вы хотите указать сертификат CA, чтобы проверить сертификат сервера. К сожалению, smtplib не дает вам возможности указать этот сертификат CA. Вы попробовали certfile, но это используется для указания локального сертификата для проверки подлинности сертификата клиента, и для этого требуется файл ключа.

Хорошая новость: работает без указания сертификата CA, поскольку smtplib просто не проверяет сертификат серверов вообще. Плохая новость заключается в следующем: потому что нет проверки сертификата сервера человек в средней атаке против зашифрованного соединения легко.

+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

Смежные вопросы