Управление сертификатом для imaplib и poplib python
Вопрос
Я использую iMaplib и POPLib для выполнения коллекции электронной почты, используя IMAPS и POP3S для безопасного подключения.Но из того, что я смог определить, ни одна библиотека не использует CA для подтверждения действия получения сертификата.Это так верно?Если это так, возможно ли установить iMaplib или Poplib для использования CA?
Если это не правда, и они используют CA, могут кто-то, пожалуйста, скажите мне, как IMAPLIB / POPLIB это делают?
спасибо.
Решение
Быстрая проверка imaplib.py показывает, что он использует ssl.wrap_socket () для реализации вызова imap_ssl ().Вызов Call to Wrap_socket () содержит только 3-параметры, и не передает необходимый параметр
Вы можете наследовать от IMAP4_SSL, и переопределить метод Open () для передачи в требуемом
Возможно, что-то вроде:
class IMAP4_SSL_CA_CHECKER(IMAP4_SSL):
def open(self, host = '', port = IMAP4_SSL_PORT, ca_certs = None):
self.host = host
self.port = port
self.sock = socket.create_connection((host, port))
self.sslobj = ssl.wrap_socket(self.sock, self.keyfile,
self.certificate, ca_certs=ca_certs)
self.file = self.sslobj.makefile('rb')
. Другие советы
Если вы, если вы работаете над системой, которая уже установлена Mozilla / Firefox, Mate Matore, вероятно, будет правильно настроен.Но это не так, ты собираешься бороться за несколько дней, пытаясь сделать это, чтобы правильно работать.
Эта ссылка помогла нам чрезвычайно: http://www.madboa.com/geek/OpenssSL// a>
Особенно обращать внимание на эту ссылку: http://www.madboa.com/Geek / OpenSSL / # Verify-System
Любые разработчики, работающие с OpenSSL, должны добавить закладки этого сайта.Это немного на стороне обработки, но каждая одна запись стоит того вес в золоте!
Потому что imap4ssl.Open вызывается из IMAP. <Сильные> init Раствор выше не помогает, потому что пользователь не вызывает открыть (). Вы можете перезаписать IMAP. init to ...
Короткое: расширение только параметр для открытия () недостаточно.
Я использовал впрыск:
def IMAP4SSL_open(self, host = '', port = imaplib.IMAP4_SSL_PORT):
... own implementation ...
wrap_socket( ... cert_reqs=ssl.CERT_REQUIRED ... )
imaplib.IMAP4_SSL.__dict__['open']=IMAP4SSL_open
. Я в настоящее время строю что-то в этом направлении.
Следующий код добавляет starttls
для IMAP.Просто позвоните server.starttls()
после подключения.Обязательно подключитесь к нормальному порту IMAP.
import imaplib,ssl
def IMAP_starttls(self, keyfile=None, certfile=None,cert_reqs=ssl.CERT_NONE,ca_certs=None):
if not 'STARTTLS' in self.capabilities:
raise self.error("STARTTLS extension not supported by server.")
(resp, reply) = self._simple_command("STARTTLS")
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile,cert_reqs=cert_reqs,ca_certs=ca_certs)
self.file = self.sock.makefile('rb')
imaplib.IMAP4.__dict__['starttls']=IMAP_starttls
imaplib.Commands['STARTTLS']=('NONAUTH',)
.
PS: я хотел добавить это как комментарий, но код должен был длительно для комментариев.