Domanda

Sto usando IMAPLIB e POPLIB per eseguire la raccolta e-mail usando IMAPS e POP3S per una connessione sicura.Ma da quello che sono stato in grado di determinare, né la libreria utilizza una CA per confermare la validità del certificato ricevuto.È vero?Se lo è, è possibile impostare IMAPLIB o POPLIB per utilizzare un CA?

Se non è vero e usano una CA, può qualcuno per favore dimmi come iMAPLIB / POPLIB lo fa?

Grazie.

È stato utile?

Soluzione

Un controllo rapido di Imaplib.py mostra che utilizza SSL.Wrap_Socket () per implementare la chiamata IMAP_SSL ().La chiamata a wrap_socket () fornisce solo 3 parametri e non passa il parametro richiesto Ca_Cert che è ciò che è necessario per convalidare la CA.

È possibile ereditare da IMAP4_SSL e sovrascrivere il metodo Apri () per passare nel Responsabile> Ca_Cert .Check out http://docs.python.org/library/sl.html per altroInfo.

Forse qualcosa come:

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')
.

Altri suggerimenti

Un altro pensiero mi è venuto in mente da menzionare.La biblioteca SSL Python è costruita in cima a OpenSSL.Se si avrà inizio a richiedere al server di fornire certificati e che siano validi, si effettuano rapidamente in questioni su vari sapori di UNIX relativi al negozio di certificati.

Se ti capita di lavorare su un sistema che ha già installato Mozilla / Firefox, il negozio Cert sarà probabilmente impostato correttamente.Ma no, hai intenzione di lottare per alcuni giorni a cercare di farlo funzionare correttamente.

Questo link ci ha aiutato immensamente: http://www.madboa.com/geek/opensl/

Prestare particolare attenzione a questo link: http://www.madboa.com/Geek / OpenSSL / # Verify-System

Eventuali sviluppatori che lavorano w / opensl dovrebbe segnare quel sito.È un po 'sul lato piatto, ma ogni singola voce vale il suo peso in oro!

Poiché IMAP4SSL.Open è chiamato da IMAP. Init La soluzione sopra non aiuta, poiché l'utente non chiama aperto (). Puoi sovrascrivere IMAP. Init per ...

corto: estendere solo il parametro per aperto () non è sufficiente.

Ho usato l'iniezione:

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
.

Attualmente sto costruendo qualcosa in questa direzione.

Il seguente codice aggiunge starttls a IMAP.Basta chiamare server.starttls() dopo il collegamento.Assicurati di connetterti alla normale porta 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: Volevo aggiungere questo come un commento, ma il codice era a lungo per un commento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top