Necesito verificar que mi CA personalizada haya firmado un certificado. El uso de OpenSSL utilidades de línea de comandos que esto es fácil de hacer:¿Cómo verifico un certificado SSL en python?
# Custom CA file: ca-cert.pem
# Cert signed by above CA: bob.cert
$ openssl verify -CAfile test-ca-cert.pem bob.cert
bob.cert: OK
Pero tengo que hacer lo mismo en Python, y realmente no quieren llamar a utilidades de línea de comandos. Por lo que sé, M2Crypto es el contenedor de Python "más completo" para OpenSSL, ¡pero no puedo entender cómo lograr lo que hace la herramienta de línea de comandos!
Haciendo referencia a this question para saber cómo lograr esta misma tarea en código C, he podido llegar a la mitad. Los nombres de variable que elegí son los mismos que se usan en el código fuente para la utilidad de línea de comandos de verificación de openssl, vea openssl-xxx/apps/verify.c
.
import M2Crypto as m2
# Load the certificates
cacert = m2.X509.load_cert('test-ca-cert.pem') # Create cert object from CA cert file
bobcert = m2.X509.load_cert('bob.cert') # Create cert object from Bob's cert file
cert_ctx = m2.X509.X509_Store() # Step 1 from referenced C code steps
csc = m2.X509.X509_Store_Context(cert_ctx) # Step 2 & 5
cert_ctx.add_cert(cacert) # Step 3
cert_ctx.add_cert(bobcert) # ditto
# Skip step 4 (no CRLs to add)
# Step 5 is combined with step 2...I think. (X509_STORE_CTX_init: Python creates and
# initialises an object in the same step)
# Skip step 6? (can't find anything corresponding to
# X509_STORE_CTX_set_purpose, not sure if we need to anyway???)
#
# It all falls apart at this point, as steps 7 and 8 don't have any corresponding
# functions in M2Crypto -- I even grepped the entire source code of M2Crypto, and
# neither of the following functions are present in it:
# Step 7: X509_STORE_CTX_set_cert - Tell the context which certificate to validate.
# Step 8: X509_verify_cert - Finally, validate it
Así que estoy a mitad de camino, pero me parece que no puede conseguir realmente la validación hecho! ¿Me estoy perdiendo de algo? ¿Hay alguna otra función que debería usar de M2Crypto? ¿Debería estar buscando un contenedor de Python completamente diferente de OpenSSL? ¿Cómo puedo lograr esta tarea en Python?
Tenga en cuenta que estoy usando certificados para cifrar/descifrar ARCHIVOS, por lo que no estoy interesado en usar la verificación de certificado de par basado en la conexión SSL (que tiene already been answered), porque no tengo ninguna conexión SSL yendo.
¿Hay alguna razón por la que no desee llamar a las utilidades de línea de comandos? Parece que podría ahorrarse un poco de dolor de cabeza ... – katrielalex
Sí, esto es para software que se implementará en muchos sistemas operativos diferentes, nuevos y antiguos, grandes y pequeños, incluidos los sistemas potencialmente integrados (lo suficientemente grandes como para incluir Python en ellos)) Quiero la máxima portabilidad y el máximo rendimiento. No quiero hacer potencialmente miles de llamadas a la línea de comandos si es que puedo evitarlo.Un gran número de certificados están involucrados. – Nathan
relacionado http://stackoverflow.com/q/2626792/4279 – jfs