Центр сертификации для imaplib и poplib python - PullRequest
2 голосов
/ 15 марта 2012

Я использую imaplib и poplib для сбора электронной почты, используя IMAPS и POP3S для безопасного соединения. Но из того, что я смог определить, ни одна библиотека не использует ЦС для подтверждения действительности полученного сертификата. Это правда? Если это так, возможно ли настроить imaplib или poplib для использования CA?

Если это не так, и они используют ЦС, кто-нибудь может сказать мне, как это делает imaplib / poplib?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 15 марта 2012

Быстрая проверка imaplib.py показывает, что он использует ssl.wrap_socket () для реализации вызова IMAP_SSL (). Вызов wrap_socket () вызывает только 3 параметра и не передает обязательный параметр ca_cert , который вам нужен для проверки CA.

Вы можете наследовать от IMAP4_SSL и переопределить метод open () для передачи требуемого ca_cert . Проверьте http://docs.python.org/library/ssl.html для получения дополнительной информации.

Возможно, что-то вроде:

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')
1 голос
/ 25 апреля 2012

Поскольку IMAP4SSL.open вызывается из IMAP. init Решение выше не помогает, потому что пользователь не вызывает open (). Вы можете перезаписать IMAP. init на ...

Short: Расширение только параметра для open () недостаточно.

Я использовал Инъекцию:

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
1 голос
/ 22 марта 2012

Мне пришла в голову еще одна мысль. Библиотека Python ssl построена поверх OpenSSL. Если вы начнете требовать, чтобы сервер предоставлял сертификаты и чтобы они были действительными, вы быстро столкнетесь с проблемами в различных вариантах Unix, связанных с хранилищем сертификатов.

Если вы работаете в системе, в которой уже установлен Mozilla / Firefox, хранилище сертификатов, скорее всего, будет настроено правильно. Но это не так, вы будете бороться в течение нескольких дней, пытаясь заставить это работать правильно.

Эта ссылка очень помогла нам: http://www.madboa.com/geek/openssl/

Особо обратите внимание на эту ссылку: http://www.madboa.com/geek/openssl/#verify-system

Любые разработчики, работающие с openssl, должны добавить этот сайт в закладки. Это немного лаконично, но каждая запись стоит на вес золота!

0 голосов
/ 25 апреля 2012

Я сейчас что-то строю в этом направлении.

Следующий код добавляет 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: я хотел добавить это как комментарий, но код был длинным для комментария.

...