2009-10-05 23 views
8

Estaba intentando averiguar cómo puedo verificar un certificado autofirmado por un servidor en python. No pude encontrar mucha información en google También quiero para asegurarse de que la URL del servidorVerificación de pares en SSL usando python

Gracias de antemano por cualquier idea.

Respuesta

10

De los comentarios a mi primera respuesta veo que hay un malentendido general de lo que significa 'verificar un certificado'. Trataré de escribir una breve explicación aquí para eliminar algunas de las ilusiones.

control del certificado es acerca de la comprobación de una firma en el certificado de metadatos (es decir, tema, período de validez, extensiones y tal) en contra de algunos firma criptográfica.

Si todo lo que tiene para la validación es un certificado autofirmado, no puede distinguirlo de otro certificado autofirmado con exactamente los mismos metadatos, pero la clave diferente, a menos que conozca la clave del certificado clave con anticipación. Y no olvide que establece todo este procedimiento de verificación para eliminar el requisito de tener este conocimiento precompartido. Con la verificación regular del certificado, no puede eliminar por completo el requisito de tener algún conocimiento precompartido, que es un conjunto de certificados de terceros, también conocidos como 'certificados de CA'. Dado que este conocimiento se comparte previamente, esos certificados pueden estar autofirmados, pero recuerde que ha recibido información sobre la validez de esos certificados, no del proceso de verificación, sino de algún conocimiento externo.

Cuando se tiene un conjunto de confianza '' certificados de CA distribuidos entre pares, se pueden utilizar aquellos para firmar otros certificados y comprobar las firmas en contra de que el conocimiento pre-compartida de CA de confianza.

Pero si no tiene conocimiento adicional sobre un certificado autofirmado excepto el certificado en sí mismo, no puede hacer suposiciones sobre la confianza de este certificado en particular, ya que puede ser emitido por algún hacker malvado o por su servidor confiable.

Por favor, obtenga algunos conocimientos sobre Man in the middle attack, Public key infrastructure y Public key cryptography en general antes de implementar cualquier tipo de proceso de verificación de certificados.

Por favor, comprenda que la verificación ciega de un certificado autofirmado no lo protegerá ni siquiera de un hacker inteligente en su propia red, ni siquiera considerando la seguridad de Internet en general.

Editar:: el autor de la pregunta aclaró que en realidad estaba buscando cómo verificar una firma de verisign (u otra CA) en un certificado que utiliza enlaces M2Crypto. He aquí dos ejemplos:

from M2Crypto import X509, SSL 

# manual validation of a signature on a certificate using a given CA cert: 
ca = X509.load_cert('/path/to/ca_cert.pem') 
cert = X509.load_cert('certificate_to_validate.pem') 
print "Verification results:", cert.verify(ca.get_pubkey()) 

# adding a given CA cert to the SSL Context for verification 
ctx = SSL.Context() 
# load a certificate from file 
ctx.load_verify_locations(cafile='/path/to/ca_cert.pem') 
# or use all certificate in a CA directory 
ctx.load_verify_locations(capath='/path/to/ca/dir') 
# or you can specify both options at the same time. 

Si va a utilizar un directorio con muchos certificados de CA (que a menudo es más conveniente), debe cambiar el nombre de cada certificado de <hash>.0 donde <hash> es el hash del asunto del certificado (obtenido con openssl x509 -noout -hash -in cert.pem).

+0

Lo siento, mi pregunta fue incorrecta. – Bhargava

+0

Estaba buscando una verificación de certificado firmada por Verisign usando M2Crypto. – Bhargava

+0

He actualizado la respuesta con ejemplos de M2Crypto. – abbot

0

Es imposible verificar un certificado autofirmado, debido a su propia naturaleza: es autofirmado.

Debe firmar un certificado de otro tercero de confianza para poder verificar algo, y después de esto puede agregar el certificado de ese tercero a la lista de sus CA confiables y luego podrá verificar los certificados firmado por ese certificado/CA.

Si desea obtener recomendaciones sobre cómo hacer esto en Python, debe proporcionar el nombre de la biblioteca SSL que está utilizando, ya que hay una selección de bibliotecas SSL para Python.

+0

Todos los certificados de CA de nivel superior son autofirmados y no hay problema para no verificarlos (confiar) en ellos. –

+0

, por supuesto, puede verificar un certificado autofirmado, solo necesita que el certificado se haya copiado localmente. Básicamente es una autenticación de clave pública/privada en ese punto. Muchos sistemas de autenticación locales funcionan de esta manera, verificando que el host sea legítimo utilizando el certificado x.509. Consulte certmaster y func para ejemplos de python – JimB

2

Supongo que usa algún enlace OpenSSL. Veo 2 maneras de resolver su problema.

  1. Usted puede añadir su certificado al directorio de OpenSSL (ejecutar openssl version -d que verlo por el sistema). Esto afectará a todos los programas que usan openssl en su máquina.
  2. certificado Cargar y agregarlo en tiempo de ejecución (el dibujo de código siguiente es para pyOpenSSL, pero debería ser similar para otros enlaces):

.

x509 = OpenSSL.crypto.load_certificate(...) 
ctx = OpenSSL.SSL.Context(...) 
store = ctx.get_cert_store() 
store.add_cert(x509) 
ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, ...) 
+0

Al usar este código no está verificando el certificado autofirmado, lo está agregando explícitamente a un almacén de certificados de confianza, por lo que se 'comprobará'. Agregar el certificado al directorio de openssl hace exactamente lo mismo. Nuevamente, es imposible verificar un certificado autofirmado: cualquier certificado autofirmado superará su prueba de verificación. – abbot

Cuestiones relacionadas