2010-10-23 14 views
3

Comment puis-je empêcher OpenSSL (en particulier, le module ssl de Python) d'utiliser les autorités de certification du système?Empêcher OpenSSL d'utiliser des certificats système?

En d'autres termes, je voudrais à la confiance que les autorités de certification que je spécifions, et rien d'autre:

ssl_socket = ssl.wrap_socket(newsocket, server_side=True, certfile="my_cert.pem", 
          ca_certs=MY_TRUSTED_CAs, # <<< Only CAs specified here 
          cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1) 
+0

Pourquoi? Ce genre de chose se produit généralement lorsque vous essayez de faire l'authentification faire le travail d'autorisation. Ce ne sont pas la même chose. – EJP

+1

@EJP, cela peut être utile si vous ne voulez pas que la liste 'certificate_authorities' du message TLS' CertificateRequest' (celui qui demande le certificat client) inclue la liste que vous ne voulez pas (cette liste de DNs tend être rempli à partir de la liste des autorités de certification disponibles par défaut). En outre, il se peut que vous ne fassiez pas confiance à des autorités de certification par défaut sur votre système, même pour l'authentification uniquement. – Bruno

+0

J'utilise SSL pour authentifier les clients sur un réseau «fermé»: I (eh bien, mon autorité de certification) va signer tous leurs certificats, il n'y a donc aucune raison de faire confiance à une autre autorité de certification. –

Répondre

2

J'ai couru à seulement quelques tests, et l'inscription de votre sélection de CA dans le ca_certs paramètres est exactement ce dont vous avez besoin.

Le système sur lequel j'ai essayé est Linux avec Python 2.6. Si vous n'utilisez pas ca_certs, il ne vous utilisez laissez pas cert_reqs=ssl.CERT_REQUIRED:

Traceback (most recent call last): 
    File "sockettest.py", line 18, in <module> 
    cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1) 
    File "/usr/lib/python2.6/ssl.py", line 350, in wrap_socket 
    suppress_ragged_eofs=suppress_ragged_eofs) 
    File "/usr/lib/python2.6/ssl.py", line 113, in __init__ 
    cert_reqs, ssl_version, ca_certs) 
ssl.SSLError: _ssl.c:317: No root certificates specified for verification of other-side certificates. 

J'ai aussi essayé d'utiliser un client d'envoyer un certificat qui est pas d'un CA dans le paramètre ca_certs, et je reçois ssl_error_unknown_ca_alert (comme prévu). Notez que de toute façon, il n'y a pas de liste d'autorité de certification client d'envoi (dans la liste certificate_authorities dans le message TLS CertificateRequest), mais cela ne serait pas nécessaire. C'est seulement utile pour aider le client à choisir le certificat.

+0

Mais, lorsque le client envoie un CERT, l'AC est-elle approuvée par votre système? c'est-à-dire, si le certificat de 'MY_PERSONAL_CA' est approuvé par le système (dans mon cas, je l'ai ajouté au trousseau système OS X ... Je ne suis pas sûr de l'équivalent Linux) et' ca_certs = [ TESTING_CA] ', puis j'ai trouvé qu'un certificat signé par * soit * MY_PERSONAL_CA' * soit * TESTING_CA sera accepté. C'était Python 2.6 sur OS X 10.6. –

+0

Donc, je suppose, si Linux * n'a pas * une liste centrale d'AC de confiance (comme le trousseau OS X), ce n'est qu'un problème sur OS X? (et, puisque mes systèmes embarqués * ne vont pas exécuter OS X, je peux les ignorer en toute sécurité). –

+0

Un ami a suggéré que '/ usr/share/ca-certificates' est le référentiel central utilisé par certaines distributions Linux ... Quand j'aurai l'occasion, je verrai ce qui se passera avec ça. –