2015-05-07 4 views
10

Ich versuche, an eine andere Partei Python 3 asyncio Modul zu verwenden zu verbinden und diesen Fehler:Was bedeutet "SSLError: [SSL] PEM lib (_ssl.c: 2532)" mit der Python-ssl-Bibliothek?

 36  sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1) 
---> 37  sslcontext.load_cert_chain(cert, keyfile=ca_cert) 
    38 

SSLError: [SSL] PEM lib (_ssl.c:2532) 

Die Frage ist nur, was der Fehler bedeuten. Mein Zertifikat ist korrekt, die Schlüsseldatei (CA-Zertifikat) möglicherweise nicht.

+0

Sie erwähnen, dass die Schlüsseldatei möglicherweise nicht korrekt ist. Das Laden von Zertifikaten schlägt fehl, wenn das Zertifikat (öffentlicher Schlüssel) nicht mit der richtigen Datei für den privaten Schlüssel übereinstimmt. – Prabhu

+0

Sie haben 'keyfile = ca_cert', was wahrscheinlich falsch ist (oder Sie haben schreckliche Variablennamen gewählt). Enthält Ihr 'ca_cert' wirklich einen privaten Schlüssel? – larsks

+0

@larks Wie kann die Auswahl schrecklicher Variablennamen zu Fehlern im Code führen? Irgendwelche Vorschläge (oder Konvention), wie man sie nennt? Die Datei ca_cert beginnt mit '----- BEGIN CERTIFICATE -----', was ein gültiger verschlüsselter Schlüssel zu sein scheint, und endet mit '----- END CERTIFICATE -----'. Sollten Kopfzeile und Fußzeile etwas anderes sagen? – sargas

Antwort

14

diese Version Unter der Annahme 3.4 verwendet wird:

See: https://github.com/python/cpython/blob/3.4/Modules/_ssl.c#L2529-L2535

PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); 
r = SSL_CTX_check_private_key(self->ctx); 
PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); 
if (r != 1) { 
    _setSSLError(NULL, 0, __FILE__, __LINE__); 
    goto error; 
} 

sagen, es ist Was ist das SSL_CTX_check_private_key fehlgeschlagen; Daher ist der private Schlüssel nicht korrekt.

+0

Einverstanden. Du bist zur Quelle gegangen und hast die richtige Antwort gefunden. –

+0

Ich las es vorher, hatte aber keine Ahnung, was das bedeutete. Ich denke, es verwendet _openssl_ (auf Unix-Systemen) und meldet den Fehler auf Systemebene. Das erklärt, warum der Fehler von dieser Zeile in der Quelle erzeugt wird, oder? – sargas

8

In Ihrem Code, den Sie anrufen:

sslcontext.load_cert_chain(cert, keyfile=ca_cert) 

Vom documentation:

Load a private key and the corresponding certificate. The certfile string must be the path to a single file in PEM format containing the certificate as well as any number of CA certificates needed to establish the certificate’s authenticity. The keyfile string, if present, must point to a file containing the private key in. Otherwise the private key will be taken from certfile as well. See the discussion of Certificates for more information on how the certificate is stored in the certfile.

Basierend auf den Namen der Argumente in Ihrem Beispiel, es sieht aus wie Sie ein CA-Zertifikat sind vorbei zum keyfile Argument. Das ist falsch, Sie müssen den privaten Schlüssel übergeben, der zum Generieren Ihres lokalen Zertifikats verwendet wurde (andernfalls kann der Client Ihr Zertifikat nicht verwenden). Eine private Schlüsseldatei wird in etwa so aussehen:

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-128-CBC,9BA4973008F0A0B36FBE1426C198DD1B 

...data... 
-----END RSA PRIVATE KEY----- 

Sie nur das CA-Zertifikat benötigen, wenn Sie versuchen, die Gültigkeit von SSL-Zertifikaten, um zu überprüfen, die von diesem Zertifikat signiert wurden. In diesem Fall würden Sie wahrscheinlich SSLContext.load_verify_locations() verwenden, um das CA-Zertifikat zu laden (obwohl ich vor kurzem nicht mit dem SSL-Modul gearbeitet habe, nehmen Sie mir deshalb nichts vor).

Verwandte Themen