Perché la connessione SSL non fallisce dopo aver modificato il certificato in editor come VIM o Gedit?

2

Voglio fallire la connessione SSL tra un server, ospitato usando il comando ssserver openssl con un certificato emesso dalla CA autofirmata e un client (Browser). Per fare ciò, ci sono vari modi:

  1. Modifica la data del sistema che esce dalla data di validità del sistema; in questo modo sono in grado di ottenere un errore nel browser dicendo che il certificato non è valido per questa data.

  2. Ho provato a modificare il certificato del server nell'editor come VIM, per essere specifico ho modificato il campo CN (nome comune), perché come per lo standard SSL CN deve essere verificato per assicurarsi che il client stia parlando con il server attuale vuole parlare, secondo RFC 2818 . Stranamente, osservo che dopo aver riavviato il server con questo client certificato modificato (Mozilla Browser) è ancora in grado di stabilire una connessione SSL con il server. Non capisco come?

Idealmente, secondo la mia opinione, se un singolo bit di certificato viene modificato la verifica del certificato dovrebbe fallire, il client calcolerà l'hash del contenuto del certificato e lo confronterà con l'hash firmato decrittato dalla chiave pubblica della CA, come il certificato CN è l'hash modificato del contenuto del certificato sarà sicuramente diverso.

Mi manca qualche concetto importante o faccio qualcosa di sbagliato per fallire questa connessione?

In aggiunta a questo se creo un nuovo certificato con CN diverso dalla stessa CA e lo utilizzi al posto del certificato originale, allora la connessione SSL non riesce a dire Unable to communicate securely with peer: requested domain name does not match the server's certificate

Informazioni sulla configurazione del test:

  1. Crea una CA radice autofirmata, con una chiave privata di ca. ca., e un certificato ca.crt
  2. Crea una chiave privata denominata server.key; generato un csr per quella chiave privata CN come testserver.com; utilizzando la CA autofirmata, ha firmato il csr per generare un server.crt
  3. Server.key e server.crt aggiunti a un singolo file server.pem
  4. Iniziato un server https openssl s_server -cert server.pem -www
  5. Aggiunto 127.0.0.1 testserver.com in / etc / hosts
  6. Hit url https: testserver.com: 4433 'dal browser Firefox. L'handshake SSL è completo e in grado di visualizzare le informazioni sulla suite di crittografia e sulla sessione
  7. Crea una copia di server.pem modified-server.pem e modifica il campo CN di modified-server.pem in "invalidtestserver.com nell'editor vi e lo hai salvato.
  8. Riavvia il server con modified-server.pem, con il comando openssl s_server -cert modified-server.pem -www e l'handshake SSL ha ancora successo e riesce a vedere lo stesso output di quello precedente nel browser.
posta InvincibleWolf 09.09.2016 - 22:48
fonte

1 risposta

4

Meta: non è una risposta definita, ma ha bisogno di una (estesa) formattazione.

Hai modificato un file nel formato che OpenSSL usa spesso come questo

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-----

e cambia i campi etichettati Emittente e / o Oggetto?

In tal caso, ciò non ha avuto alcun effetto. Il certificato in formato PEM effettivo è le righe da ----BEGIN a -----END solo ; tutto il resto sono dati di commento che potrebbero essere utili a un lettore umano, ma ignorati dai programmi.

Per modificare il certificato effettivamente utilizzato in un programma, è necessario modificare i dati di base64 all'interno del blocco PEM. Questo non è facile, e potresti trovare più semplice generare diversi certs da zero.

  • converti il PEM / base64 in binario (che apre un po 'imprecisamente chiama DER), analizza il file binario come ASN.1 DER (che apre semplicemente chiama ASN1) per trovare la / le posizione / i del / i byte / i che vuoi per cambiare, modificare il file binario per cambiare quei byte e convertire il risultato in PEM (aggiungendo facoltativamente le informazioni del commento). OpenSSL può fare il primo secondo e durare facilmente, e vim può apparentemente fare un editing esadecimale con un piccolo sforzo (io non lo faccio da solo) o ci sono strumenti alternativi.

    Se modifichi un valore più lungo o più corto, devi modificare diversi campi lunghezza in altri punti del certificato (vedi l'analisi ASN.1), e se non li ottieni tutti correttamente il risultato sarà inutilizzabile.

  • analizzare il PEM (direttamente) come ASN.1 per trovare la posizione (s) che si desidera modificare; questo è facile con openssl. Converti quelle posizioni in posizioni nei blocchi di 4 caratteri base64 (richiede un po 'di aritmetica) e individua quei blocchi base64, converti ciascun in binario manualmente, calcola la modifica e converti nuovamente in base64 manualmente e sostituisci nel blob base64.

    Questo metodo non può gestire affatto la modifica della lunghezza di un valore.

Inoltre, come ha commentato Steffen, se si cambia qualcosa nel corpo di un certificato, ma si lascia la firma, allora (con schiacciante probabilità) la firma non verrà verificata e il browser o altro relier potrebbe anche non guardare gli altri campi . Viceversa se si modifica solo la firma, almeno per RSA e DSA, il risultato di solito non sarà affatto una firma valida per qualsiasi corpo del certificato. Se si desidera testare specificamente il relier per modificare (un) campo (i) nel corpo, è necessario generare anche una nuova firma valida. Potrebbe essere possibile, ma dovrai essere specifico sulla tua gerarchia CA, a meno che tu non intenda usare un certificato entità autofirmato e non una CA affatto, e in entrambi i casi io Ho bisogno di ulteriori ricerche che preferirei non fare sulle specifiche.

    
risposta data 10.09.2016 - 11:03
fonte

Leggi altre domande sui tag