Validación local de certificados X.509

Haciendo experimentos de los míos, de esos inconfesables, a veces tengo que verificar el correcto funcionamiento de certificados X.509 generados de forma local.

Los pasos que suelo dar son los siguientes:

  1. Comprobamos qué opina OpenSSL sobre nuestro certificado. Para ello empleo el comando openssl verify.

  2. Hacemos una conexión TLS local con Python:

    1. En una ventana ejecutamos este comando OpenSSL para lanzar un servidor TLS con el certificado que estamos probando:

      $ openssl s_server -cert XXXX.jcea.es.cert -key XXXX.jcea.es.key
      
    2. En otra ventana ejecutamos el siguiente código Python:

         #!/usr/bin/env python3
      
         import ssl, urllib.request
      
         context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
         context.options = ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
         context.verify_mode = ssl.CERT_REQUIRED
         context.check_hostname = False
         context.load_verify_locations(cafile="XXXXX.jcea.es.cert")
      
         urllib.request.urlopen("https://127.0.0.1:4433/", context=context)
      

Este código se conecta al servidor local lanzado en el punto 1, forzando TLS 1.2 o superior. Se verificará el certificado pero se ignorará la comprobación del nombre de servidor.

Si esta conexión tiene éxito podemos estar razonablemente seguros de que el certificado X.509 va a funcionar en producción.