¿Por qué la conexión SSL no falla después de modificar el certificado en un editor como VIM o Gedit?

2

Quiero fallar la conexión SSL entre un servidor, alojado mediante el comando openssl s_server con un certificado emitido por una CA autofirmada y un cliente (navegador). Para ello, hay varias formas:

  1. Cambie la fecha del sistema que está fuera de la fecha efectiva del sistema; De esta manera, puedo obtener un error en el navegador que dice que el certificado no es válido para esta fecha.

  2. Intenté modificar el certificado del servidor en un editor como VIM, para ser específico, modifiqué el campo CN (nombre común), porque según el estándar SSL, se debe verificar el CN para asegurarse de que el cliente está hablando con el servidor real quiere hablar con, según RFC 2818 . Curiosamente, observo que después de reiniciar el servidor con este cliente de certificado modificado (Mozila Browser) aún es posible establecer una conexión SSL con el servidor. ¿No entiendo cómo?

Idealmente, según mi entendimiento, si se modifica un solo bit del certificado, la verificación del certificado debería fallar, ya que el cliente calculará el hash del contenido del certificado y lo comparará con el hash firmado descifrado de la clave pública de CA, como el certificado CN es El hash modificado del contenido del certificado será diferente, por supuesto.

¿Me estoy perdiendo algún concepto importante o estoy haciendo algo mal para fallar esa conexión?

Además de esto, si creo un nuevo certificado con un CN diferente de la misma CA y lo uso en lugar del certificado original, la conexión SSL falla al decir Unable to communicate securely with peer: requested domain name does not match the server's certificate

Información de configuración de prueba:

  1. Creó una CA raíz autofirmada, con una clave privada ca.key y un certificado ca.crt
  2. Creó una clave privada llamada server.key; generó un csr para esa clave privada CN como testserver.com; utilizando CA autofirmada, firmó el csr para generar un server.crt
  3. Server.key y server.crt anexados a un único archivo server.pem
  4. Se inició un servidor https openssl s_server -cert server.pem -www
  5. Se agregó 127.0.0.1 testserver.com en / etc / hosts
  6. Hit url https: testserver.com: 4433 'desde el navegador Firefox. El protocolo de enlace SSL está completo y es capaz de ver el conjunto de cifrado y la información de sesión
  7. Cree una copia de server.pem modified-server.pem y edite el campo CN del server.pem modificado a 'invalidtestserver.com en el editor vi y lo guardó.
  8. Reinicie el servidor con modified-server.pem, con el comando openssl s_server -cert modified-server.pem -www y el protocolo de enlace SSL aún es exitoso y puede ver la misma salida que la anterior en el navegador.
pregunta InvincibleWolf 09.09.2016 - 22:48
fuente

1 respuesta

4

Meta: no es una respuesta definitiva, pero necesita un formato (extenso).

¿Editaste un archivo en el formato que OpenSSL usa con frecuencia y se ve así?

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            d7:a9:8b:73:69:4f:fa:75
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=HI, O=Test Company, CN=test.example.com
        Validity
            Not Before: Sep 10 08:25:49 2016 GMT
            Not After : Oct 10 08:25:49 2016 GMT
        Subject: C=US, ST=HI, O=Test Company, CN=test.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b9:1c:c3:c5:ad:ed:cb:86:91:75:09:8c:3a:ce:
                    59:89:1d:35:68:52:63:8f:d5:63:25:f7:30:df:60:
                    8f:6c:b7:dd:28:d7:6b:05:1e:36:dc:b5:92:ef:8d:
                    a4:80:2c:59:2f:0d:d7:0b:d9:b8:cb:9b:d3:35:ff:
                    46:ae:3e:d9:fb:b2:a6:15:59:48:92:d7:0d:58:ae:
                    4b:70:04:72:b4:52:62:16:ab:8c:fb:5b:1f:ca:bc:
                    70:de:65:ba:cd:28:46:a3:aa:61:d1:6d:42:6a:15:
                    b9:5f:73:42:34:b0:7e:cd:ca:b6:1e:50:e4:4d:d2:
                    ae:60:ec:08:7c:c8:09:64:7e:d1:5c:35:7b:3a:db:
                    20:cd:27:1d:d0:0a:5b:c3:68:f7:20:10:0b:87:7e:
                    33:17:1d:e9:da:57:13:fd:e5:ab:a7:0e:dc:96:2b:
                    a0:72:a9:c9:16:31:b2:4e:10:c5:e8:06:28:89:d1:
                    5e:15:1e:b6:fb:0a:b3:1f:85:0d:d2:44:ff:da:fb:
                    36:bd:57:fa:b4:df:42:73:94:64:b0:19:44:68:38:
                    aa:cd:3d:54:48:8e:ba:18:58:61:bd:37:76:51:6b:
                    60:0c:93:9f:9a:c1:37:42:a4:89:63:21:cf:b3:7e:
                    ee:1f:83:e1:cf:8a:b2:21:05:08:22:54:4d:42:94:
                    15:df
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                74:81:FE:9F:5A:85:31:E8:FE:07:09:54:78:27:3B:1B:8B:3A:43:AA
            X509v3 Authority Key Identifier:
                keyid:74:81:FE:9F:5A:85:31:E8:FE:07:09:54:78:27:3B:1B:8B:3A:43:AA

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
        5e:87:9b:67:4c:87:01:24:ff:f2:7d:b1:d2:ab:09:4d:08:d8:
        ca:94:db:a1:0d:df:74:50:61:89:6e:3d:14:d4:b6:9d:86:1e:
        2c:8a:b0:42:fa:5f:bc:4d:ed:f8:7b:ec:24:f9:d3:4c:af:6e:
        04:6c:55:0a:86:17:71:87:a0:a1:65:5d:1e:03:f9:2e:74:68:
        ad:23:cb:a6:36:58:db:02:f1:21:64:a5:5d:62:70:83:e2:70:
        3c:ac:19:3d:62:df:6f:fc:e4:05:03:b6:7e:7c:84:2c:27:b0:
        1d:32:6b:93:15:fe:88:37:16:d1:fe:5e:c1:b9:b3:d2:ab:e4:
        ec:f7:1c:9c:42:d7:6e:3f:37:da:58:4b:b0:ea:e3:9d:7f:0e:
        6c:3a:8c:cf:3b:fb:16:c1:b5:7f:fb:1e:c1:e9:3e:40:cb:47:
        1a:84:f4:45:5c:68:16:c8:77:8f:14:b2:d7:57:8a:9d:31:d3:
        c4:ff:60:d4:cf:bb:d4:21:8d:40:e9:12:c9:43:a5:67:78:75:
        9e:ca:b5:0a:2a:00:d8:18:9d:c7:47:69:ce:f0:5f:c2:7a:b1:
        3e:bc:73:48:0a:dc:a1:d2:29:6a:b7:03:6f:8d:47:e6:e0:79:
        93:a8:fc:03:dd:a6:cd:37:09:09:6a:65:b2:4d:c6:94:56:fb:
        18:cb:be:f8
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIJANepi3NpT/p1MA0GCSqGSIb3DQEBBQUAMEwxCzAJBgNV
BAYTAlVTMQswCQYDVQQIDAJISTEVMBMGA1UECgwMVGVzdCBDb21wYW55MRkwFwYD
VQQDDBB0ZXN0LmV4YW1wbGUuY29tMB4XDTE2MDkxMDA4MjU0OVoXDTE2MTAxMDA4
MjU0OVowTDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkhJMRUwEwYDVQQKDAxUZXN0
IENvbXBhbnkxGTAXBgNVBAMMEHRlc3QuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC5HMPFre3LhpF1CYw6zlmJHTVoUmOP1WMl9zDf
YI9st90o12sFHjbctZLvjaSALFkvDdcL2bjLm9M1/0auPtn7sqYVWUiS1w1Yrktw
BHK0UmIWq4z7Wx/KvHDeZbrNKEajqmHRbUJqFblfc0I0sH7NyrYeUORN0q5g7Ah8
yAlkftFcNXs62yDNJx3QClvDaPcgEAuHfjMXHenaVxP95aunDtyWK6ByqckWMbJO
EMXoBiiJ0V4VHrb7CrMfhQ3SRP/a+za9V/q030JzlGSwGURoOKrNPVRIjroYWGG9
N3ZRa2AMk5+awTdCpIljIc+zfu4fg+HPirIhBQgiVE1ClBXfAgMBAAGjUDBOMB0G
A1UdDgQWBBR0gf6fWoUx6P4HCVR4JzsbizpDqjAfBgNVHSMEGDAWgBR0gf6fWoUx
6P4HCVR4JzsbizpDqjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQBe
h5tnTIcBJP/yfbHSqwlNCNjKlNuhDd90UGGJbj0U1Ladhh4sirBC+l+8Te34e+wk
+dNMr24EbFUKhhdxh6ChZV0eA/kudGitI8umNljbAvEhZKVdYnCD4nA8rBk9Yt9v
/OQFA7Z+fIQsJ7AdMmuTFf6INxbR/l7BubPSq+Ts9xycQtduPzfaWEuw6uOdfw5s
OozPO/sWwbV/+x7B6T5Ay0cahPRFXGgWyHePFLLXV4qdMdPE/2DUz7vUIY1A6RLJ
Q6VneHWeyrUKKgDYGJ3HR2nO8F/CerE+vHNICtyh0ilqtwNvjUfm4HmTqPwD3abN
NwkJamWyTcaUVvsYy774
-----END CERTIFICATE-----

y cambia los campos etiquetados Emisor y / o Asunto?

Si es así, eso no tuvo ningún efecto. El certificado real en formato PEM son las líneas desde ----BEGIN a -----END solo ; todo lo demás son datos de comentarios que posiblemente sean útiles para un lector humano, pero que los programas ignoran.

Para cambiar el certificado realmente usado en un programa, necesita cambiar los datos base64 dentro del bloque PEM. Esto no es fácil, y puede que te resulte más fácil generar diferentes certificados desde cero.

  • convierta el PEM / base64 a binario (que se abre un poco de forma imprecisa a DER), analice el binario como ASN.1 DER (que openssl solo llama a ASN1) para encontrar las posiciones del byte (s) que desea para cambiar, edite el binario para cambiar esos bytes y vuelva a convertir el resultado a PEM (opcionalmente, vuelva a agregar la información del comentario). OpenSSL puede hacer el primer segundo y el último fácilmente, y vim aparentemente puede hacer edición de hex con un poco de esfuerzo (no lo hago yo mismo) o existen herramientas alternativas.

    Si cambia un valor para que sea más largo o más corto, necesita cambiar varios campos de longitud en otros lugares en el certificado (ver el análisis de ASN.1), y si no los obtiene todos correctos, el resultado será inutilizable.

  • analice el PEM (directamente) como ASN.1 para encontrar las posiciones que desea cambiar; Esto es fácil con openssl. Convierta esas posiciones a posiciones en los fragmentos de 4 caracteres de base64 (requiere un poco de aritmética) y localice esos fragmentos de base64, conviértalos a binarios manualmente, calcule el cambio y vuelva a convertir a base64 de forma manual y vuelva a colocarlo en el blob base64.

    Este método no puede controlar el cambio en la longitud de un valor en absoluto.

Por otra parte, como comentó Steffen, si cambia algo en el cuerpo de un certificado pero deja la firma, entonces (con una probabilidad abrumadora) la firma no se verificará y el navegador u otra versión puede no mirar los otros campos. . A la inversa, si solo cambia la firma, al menos para RSA y DSA, el resultado generalmente no será una firma válida para el cualquier organismo de certificación. Si desea probar específicamente la fiabilidad del cambio de (a) campo (s) en el cuerpo, también necesita generar una nueva firma válida. Eso puede ser posible, pero deberá ser específico acerca de su jerarquía de CA, a menos que quiera decir que está utilizando un certificado de entidad autofirmado y no una CA en absoluto, y en cualquier caso yo Necesitaré un poco más de investigación que preferiría no hacer por especificación.

    
respondido por el dave_thompson_085 10.09.2016 - 11:03
fuente

Lea otras preguntas en las etiquetas