2015-10-01 2 views
3

J'essaie de construire un serveur simple en python en utilisant mon certificat auto-signé. J'ai créé des fichiers .cer, .pfx, .pvk en utilisant makecert.ssl avec certificat auto-signé utilisant python

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) 
context.load_cert_chain(certfile="ServerSSL.cer") 

Traceback (most recent call last): 
    File "ssl_server.py", line 4, in <module> 
    context.load_cert_chain(certfile="ServerSSL.cer") 
ssl.SSLError: [SSL] PEM lib (_ssl.c:2580) 

Qu'est-ce que j'ai fait de mal? J'ai aussi essayé de convertir mon fichier cer en pem en changeant le suffixe et j'ai eu la même erreur.

+0

Quelle version de Python est utilisée? – HelloWorld

+0

Ma version python est 2.7.10 32bit –

+0

Avez-vous vérifié ceci (https://docs.python.org/2/library/ssl.html) – Olu

Répondre

1

Lorsque vous jetez un oeil à la source d'origine de _ssl.c:2580, vous pouvez voir que SSL_CTX_use_certificate_chain_file a échoué. Comme ni pw_info.error ni errno n'est défini, il n'est pas facile de trouver la cause. Le problème peut être provoqué par le fichier crt. Ouvrez-le dans un éditeur de texte et vérifiez si le fichier ressemble exactement à ce qu'il devrait ressembler - vérifiez également les nouvelles lignes. Si elles ne correspondent pas exactement, l'appel de fonction échouera.

2567: PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); 
2568: r = SSL_CTX_use_certificate_chain_file(self->ctx, certfile_bytes); 
2569: PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); 
2570: if (r != 1) { 
2571:  if (pw_info.error) { 
2572:   ERR_clear_error(); 
2573:   /* the password callback has already set the error information */ 
2574:  } 
2575:  else if (errno != 0) { 
2576:   ERR_clear_error(); 
2577:   PyErr_SetFromErrno(PyExc_IOError); 
2578:  } 
2579:  else { 
2580:   _setSSLError(NULL, 0, __FILE__, __LINE__); 
2581:  } 
2582:  goto error; 

Le documentation dit aussi:

Les certificats doivent être au format PEM et doivent être triés en commençant par le certificat du sujet (client réel ou certificat de serveur), suivi par des certificats d'autorité de certification intermédiaire le cas échéant, et se terminant au plus haut niveau (racine) CA.