Teste de cliente/servidor SSL/TLS com openssl

Servidor OpenSSL

O OpenSSL pode atuar como um proxy SSL entre o servidor e um servidor que não suporte SSL. Para criar um certificado auto-assinado:

$ openssl req -x509 -newkey rsa:2048 -keyout chave.pem -out certificado.pem -days 365 -nodes

E para iniciar o servidor SSL:

$ openssl s_server -key chave.pem -cert certificado.pem -accept 44330 -www

Agora, você está terá um Servidor SSL sendo executado pela própria ferramenta openssl. Para verificar a conexão, pode ser usado o cliente ssl:

$ openssl s_client -connect localhost:44330
depth=0 C = BR, ST = ES, L = Vila Velha, O = Internet, OU = Informatica, CN = guiafoca.org, emailAddress = gleydson@guiafoca.org
verify error:num=18:self signed certificate

Cliente OpenSSL

Quando está depurando um problema dificil, e precisa de alguma forma de te ajudar a entender o que está ocorrendo de errado, eis que aparece novamente o canivete suiço openssl. Ele te auxiliará a entender o que está ocorrendo de errado, mesmo quando o problema ocorrer em um fluxo DevOps ou ferramenta automatizada. O openssl pode ser o que precisa para fazer a depuração:

Para conectar em um servidor usando a ferramenta openssl:

openssl s_client -connect www.terra.com.br:443
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = guiafoca.org
verify return:1
---
Certificate chain
 0 s:CN = guiafoca.org
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgISBJ4tiXeoEMBd4GkU3uKR4AKFMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA2MDIxMTU0MDFaFw0y
MDA4MzExMTU0MDFaMBcxFTATBgNVBAMTDGd1aWFmb2NhLm9yZzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAL3QP1H9r0/ulOb0RNHkQ5oyu3lxKAG6lNqL
Xpw8ITe8hBoOg+mDPcOhnZOgPys6ucMZ0jdgsIfU3oQM0cM+djWNyHpvF0BD9dKL
yZA2fZgUQDZKdxS5w+RVw3oVdSxcSgCGDozAQSwqpd3oroGyZ2GkKO17s4/SanVA
6ReIkenzG1Hg7hEJJDvaPnzWVcKNh/scNEyMsnE0OXYbVAjr16Ff7EkMVu+B/5gO
x92cxkeKmOfqzvW3pnpkhhTFJVA6svCSpJp4fouxHK3DRguU60j2hMGABz9Gb46H
xrhOLrcid10TTrviHck6cPHwF6wwhyVEoQChbHDwebSTESkzrbECAwEAAaOCAnMw
ggJvMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
AwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUQsysavyg8sJPqUIayfBlOhfMjUYw
HwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEEYzBh
MC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
LzApBgNVHREEIjAgggxndWlhZm9jYS5vcmeCEHd3dy5ndWlhZm9jYS5vcmcwTAYD
VR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYa
aHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEEBgorBgEEAdZ5AgQCBIH1BIHy
APAAdgDnEvKwN34aYvuOyQxhhPHqezfLVh0RJlvz4PNL8kFUbgAAAXJ1GIayAAAE
AwBHMEUCIQCtrH4CxUi8/9Az+yjXfaAs5zt2qMldNNWFfH/sy2ruagIgGnnOKp+y
1b64brS04pL4cCXakjkNnluqR2HHPjUdQKkAdgAHt1wb5X1o//Gwxh0jFce65ld8
V5S3au68YToaadOiHAAAAXJ1GIb4AAAEAwBHMEUCIQDqLLTizQQRkF6hN3IPVsDF
x3W2JeaiVc2v4XZFcF8BFgIgPrKYGiBpY5Hiykq0szjwFYaUApOb8z3NNM4Sxqtj
rbEwDQYJKoZIhvcNAQELBQADggEBAFb20LagN6e1bcc1wwa9qkaKXr8xG2x78I6t
FsfuruSbOVZWUIQDsJhKuZFH84gKnsqzI46k7u04DTYuD2BGnu+9UhUyTHU306CZ
cJPzTqHesgo3ir/D8uZGPU3D6Dhv4rfJPIsJAdOKdbayhpiaWn46XvD0xwOAJspF
zNTWYWEatIx52wAW3vQ0D7h/6mWslPQJzpDp/crJk/2hsVUov8NqYTNkqHFR3vlS
zbn3Oi4Rs6K9nDLXFjPYY7OXtebLj3aXafHo/KtBtjPX8DfZFv0FSNHb1Iu9Yn38
XdQGYAk1hP2/sFSqiNJjwkt040gsARCR4OdypuuV7OrsqTJCujM=
-----END CERTIFICATE-----
subject=CN = guiafoca.org

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3121 bytes and written 388 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Caso ele reclamar de um certificado auto-assinado (self-signed), utilize o parametro -CAfile para indicar um arquivo de CA para leitura:

Agora, com o cliente conectado, você poderá executar os seguintes comandos:

  • q - Finaliza a coexão SSL mas ainda aceita novas conexões

  • Q - Finaliza a conexão SSL atual e encerra.

  • r - Renegocia a conexão SSL

  • R - Renegocia a sessão SSL e requisita um certificado de cliente.

  • P - Envia algum texto plano na conexão TCP: isto deve fazer o cliente desconectar devido a violação de protocolo.

  • S - Mostra dados de utilização do cache de status.

Cadeia de Confiança

É possível também analisar a cadeia de segurança do certificado SSL sendo testado com a ferramenta openssl. Ainda continuando a análise do comando: openssl s_client -connect www.terra.com.br:443:

Certificate chain
 0 s:CN = guiafoca.org
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3

Mostra a relação entre issuer e subject no certificado. Caso aparecerem números longos hexadecimais no subject, significa que o OpenSSL não possui o OID em sua base de mapeamento, exibindo o hexadecimal em seu lugar. Os OIDS são únicos e identificações que não se repetem, usados entre outras coisas para validação de certificados de validação extendida (EV).

Por padrão o openssl mostra apenas o certificado final. Caso deseje mostrar toda a cadeia, use a opção -showcerts: echo Q | openssl s_client -connect www.guiafoca.org:443 -showcerts

CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = guiafoca.org
verify return:1
---
Certificate chain
 0 s:CN = guiafoca.org
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgISBJ4tiXeoEMBd4GkU3uKR4AKFMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA2MDIxMTU0MDFaFw0y
MDA4MzExMTU0MDFaMBcxFTATBgNVBAMTDGd1aWFmb2NhLm9yZzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAL3QP1H9r0/ulOb0RNHkQ5oyu3lxKAG6lNqL
Xpw8ITe8hBoOg+mDPcOhnZOgPys6ucMZ0jdgsIfU3oQM0cM+djWNyHpvF0BD9dKL
yZA2fZgUQDZKdxS5w+RVw3oVdSxcSgCGDozAQSwqpd3oroGyZ2GkKO17s4/SanVA
6ReIkenzG1Hg7hEJJDvaPnzWVcKNh/scNEyMsnE0OXYbVAjr16Ff7EkMVu+B/5gO
x92cxkeKmOfqzvW3pnpkhhTFJVA6svCSpJp4fouxHK3DRguU60j2hMGABz9Gb46H
xrhOLrcid10TTrviHck6cPHwF6wwhyVEoQChbHDwebSTESkzrbECAwEAAaOCAnMw
ggJvMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
AwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUQsysavyg8sJPqUIayfBlOhfMjUYw
HwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEEYzBh
MC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQub3Jn
LzApBgNVHREEIjAgggxndWlhZm9jYS5vcmeCEHd3dy5ndWlhZm9jYS5vcmcwTAYD
VR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYa
aHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEEBgorBgEEAdZ5AgQCBIH1BIHy
APAAdgDnEvKwN34aYvuOyQxhhPHqezfLVh0RJlvz4PNL8kFUbgAAAXJ1GIayAAAE
AwBHMEUCIQCtrH4CxUi8/9Az+yjXfaAs5zt2qMldNNWFfH/sy2ruagIgGnnOKp+y
1b64brS04pL4cCXakjkNnluqR2HHPjUdQKkAdgAHt1wb5X1o//Gwxh0jFce65ld8
V5S3au68YToaadOiHAAAAXJ1GIb4AAAEAwBHMEUCIQDqLLTizQQRkF6hN3IPVsDF
x3W2JeaiVc2v4XZFcF8BFgIgPrKYGiBpY5Hiykq0szjwFYaUApOb8z3NNM4Sxqtj
rbEwDQYJKoZIhvcNAQELBQADggEBAFb20LagN6e1bcc1wwa9qkaKXr8xG2x78I6t
FsfuruSbOVZWUIQDsJhKuZFH84gKnsqzI46k7u04DTYuD2BGnu+9UhUyTHU306CZ
cJPzTqHesgo3ir/D8uZGPU3D6Dhv4rfJPIsJAdOKdbayhpiaWn46XvD0xwOAJspF
zNTWYWEatIx52wAW3vQ0D7h/6mWslPQJzpDp/crJk/2hsVUov8NqYTNkqHFR3vlS
zbn3Oi4Rs6K9nDLXFjPYY7OXtebLj3aXafHo/KtBtjPX8DfZFv0FSNHb1Iu9Yn38
XdQGYAk1hP2/sFSqiNJjwkt040gsARCR4OdypuuV7OrsqTJCujM=
-----END CERTIFICATE-----
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
---
Server certificate
subject=CN = guiafoca.org

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3121 bytes and written 388 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
DONE

Analisando a saída acima, a parte mais importante é o TLS 1.3 e o cipher suite usado: ECDHE-ECDSA-AES256-GCM-SHA384. Também é possível determinar se o servidor enviou um ID e ticket de sessão TLS

No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3121 bytes and written 388 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 

Note que para o TLS 1.2 a saída é um pouco diferente, como a abaixo:

---
SSL handshake has read 3966 bytes and written 434 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 645725145319CFB1FE33ECEF9D41AFDA605C34F66266582700742BC1C672E90B
    Session-ID-ctx: 
    Master-Key: 13464E7438098F2463BCAB0605FF225D5EBA37D438C75161247975A3C787AA7F1729CDA160B4001C032C90A01DAE0C23
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7300 (seconds)
    TLS session ticket:
    0000 - 00 00 0e 86 64 dc a9 6a-66 81 4a 74 ef 81 28 ce   ....d..jf.Jt..(.
    0010 - 28 b7 a9 41 c5 26 8e e5-b3 a5 3d d0 27 2b 75 59   (..A.....=.'+uY
    0020 - 9b 99 8c c7 2b 6e 21 89-22 e4 2a da 50 cc 00 af   ....+n!.".*.P...
    0030 - b0 c2 2a 8d 22 a4 4a 3f-d7 63 07 9b 30 bc 0e 89   ..*.".J?.c..0...
    0040 - 70 70 6a a2 d5 09 10 a7-7a 58 73 88 29 e6 f0 b4   ppj.....zXs.)...
    0050 - 0d c4 fa da 14 6f a1 0f-6e 28 b9 2f b1 8a 69 be   .....o..n(./..i.
    0060 - eb 07 58 21 ce cc 7c ed-3e 99 b6 3d d4 9a 9d 5e   ..X!..|.>..=...^
    0070 - dd 10 a3 85 ae ad f6 09-e6 77 20 4e 83 44 a5 7a   .........w N.D.z
    0080 - f0 c4 79 9c e1 3e 4f 15-22 49 a7 20 d8 d5 e0 47   ..y..>O."I. ...G
    0090 - c3 ac 3d 8e 78 e9 d9 0d-e8 fa 75 f7 ac cc f9 2e   ..=.x.....u.....
    00a0 - 64 9a b3 b8 28 ba 04 e2-f9 a5 0c 07 a1 9d da d3   d...(...........

    Start Time: 1594518720
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no

Testando protocolos que fazem upgrade para TLS

Quando é usado com o HTTP, o TLS troca toda a comunicação para HTTPS. Mas alguns protocolos iniciam como texto plano, e eles fazem upgrade para criptografia. Se quiser testar esse tipod e protocolo, é necessário especificar a opção -starttls, indicando que o protocolo pode fazer upgrade por si próprio. :

openssl s_client -connect gmail-smtp-in.l.google.com:25 -starttls smtp

A saída será a seguinte:

CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = mx.google.com
verify return:1
---
Certificate chain
 0 s:C = US, ST = California, L = Mountain View, O = Google LLC, CN = mx.google.com
   i:C = US, O = Google Trust Services, CN = GTS CA 1O1
 1 s:C = US, O = Google Trust Services, CN = GTS CA 1O1
   i:OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHJDCCBgygAwIBAgIRAJI+8dkxpHmxCAAAAABH8A4wDQYJKoZIhvcNAQELBQAw
QjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczET
MBEGA1UEAxMKR1RTIENBIDFPMTAeFw0yMDA2MTcxNDI5NDZaFw0yMDA5MDkxNDI5
NDZaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgTExDMRYwFAYDVQQDEw1t
eC5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJ2cnRpnaoWs2
bzNvXchIDzxPpg6MZAgSc8FQwAiRkNXnYJMmuHwkUjcsUBva/ax8SLkO/Ax/Kilp
BU187FIGMaOCBLkwggS1MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEF
BQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBS/odoeByJYt5WTZU/HTnSXg9Vr
KzAfBgNVHSMEGDAWgBSY0fhuEOvPm+xgnxiQG6DrfQn9KzBoBggrBgEFBQcBAQRc
MFowKwYIKwYBBQUHMAGGH2h0dHA6Ly9vY3NwLnBraS5nb29nL2d0czFvMWNvcmUw
KwYIKwYBBQUHMAKGH2h0dHA6Ly9wa2kuZ29vZy9nc3IyL0dUUzFPMS5jcnQwggJ1
BgNVHREEggJsMIICaIINbXguZ29vZ2xlLmNvbYIXYWx0MS5hc3BteC5sLmdvb2ds
ZS5jb22CH2FsdDEuZ21haWwtc210cC1pbi5sLmdvb2dsZS5jb22CHWFsdDEuZ21y
LXNtdHAtaW4ubC5nb29nbGUuY29tghdhbHQyLmFzcG14LmwuZ29vZ2xlLmNvbYIf
YWx0Mi5nbWFpbC1zbXRwLWluLmwuZ29vZ2xlLmNvbYIdYWx0Mi5nbXItc210cC1p
bi5sLmdvb2dsZS5jb22CF2FsdDMuYXNwbXgubC5nb29nbGUuY29tgh9hbHQzLmdt
YWlsLXNtdHAtaW4ubC5nb29nbGUuY29tgh1hbHQzLmdtci1zbXRwLWluLmwuZ29v
Z2xlLmNvbYIXYWx0NC5hc3BteC5sLmdvb2dsZS5jb22CH2FsdDQuZ21haWwtc210
cC1pbi5sLmdvb2dsZS5jb22CHWFsdDQuZ21yLXNtdHAtaW4ubC5nb29nbGUuY29t
ghJhc3BteC5sLmdvb2dsZS5jb22CFWFzcG14Mi5nb29nbGVtYWlsLmNvbYIVYXNw
bXgzLmdvb2dsZW1haWwuY29tghVhc3BteDQuZ29vZ2xlbWFpbC5jb22CFWFzcG14
NS5nb29nbGVtYWlsLmNvbYIaZ21haWwtc210cC1pbi5sLmdvb2dsZS5jb22CEWdt
ci1teC5nb29nbGUuY29tghhnbXItc210cC1pbi5sLmdvb2dsZS5jb22CDW14MS5z
bXRwLmdvb2eCDW14Mi5zbXRwLmdvb2eCDW14My5zbXRwLmdvb2eCDW14NC5zbXRw
Lmdvb2cwIQYDVR0gBBowGDAIBgZngQwBAgIwDAYKKwYBBAHWeQIFAzAzBgNVHR8E
LDAqMCigJqAkhiJodHRwOi8vY3JsLnBraS5nb29nL0dUUzFPMWNvcmUuY3JsMIIB
AwYKKwYBBAHWeQIEAgSB9ASB8QDvAHUAsh4FzIuizYogTodm+Su5iiUgZ2va+nDn
sklTLe+LkF4AAAFywuaIaAAABAMARjBEAiALLdlXTf//fnFVtu3WnnsDzrnyshIO
6Ika3/12hYaquQIgVwOF3Psb8cx4if4Lr6wvlUshfpM0TspYpjx/b+Fg//QAdgBe
p3P531bA57U2SH3QSeAyepGaDIShEhKEGHWWgXFFWAAAAXLC5ohmAAAEAwBHMEUC
IQDqLbrAjESKIMs1p78PEwKYgPUdJ108bdsdpeGc/ZqY9QIgd06p3NR46wGcsThR
fyoOyC4SMYng3ImFXXW7bFYlcjowDQYJKoZIhvcNAQELBQADggEBAGYdR+ajEHgr
5Dmw5dxTkXm5rTKWxT8RZV4hpj7WS5jd01h8I/IGbafisJA6oij7LvAkcqoH2F3i
xPVUt0cRRL4K1LNH146fjvp1tiEevxqXK9rAYRluZw38EvCVIeLrlg0XCIUYBFPS
PMt9lZ71yehlB5KnbLEJjchlgQz986lpcvOu8jtJWBzTHe+BFVIjOciEX3Bgb+3F
JyVBEWY6DfxIVKd6dyoAhoYVSeZwdfAGZJ6kr6J19oDtX9P18VTrOF5zVsMsHW31
wFubVkS8zKplQBdOa1z2qxENdrYi/T1FkQfW0BfFmBRcx+ObNlL4FZav6gFcb0uZ
tk6NlovNPPU=
-----END CERTIFICATE-----
subject=C = US, ST = California, L = Mountain View, O = Google LLC, CN = mx.google.com

issuer=C = US, O = Google Trust Services, CN = GTS CA 1O1

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3496 bytes and written 431 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
250 SMTPUTF8

O upgrade de conexão é suportado para os protocolos SMTP, POP3, IMAP, FTP, e XMPP.

Extraindo o certificado remoto do cliente

Utilize o seguinte comando do openssl para extrair o certificado de cliente diretamente de um domínio:

$ echo | openssl s_client -connect www.guiafoca.org:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > www.guiafoca.org.crt

Usando formatos diferentes de HandShake de conexão

Em alguma situações, durante os tests do OpenSSL, suas tentativas podem falhar (mesmo que saiba que o servidor utiliza TLS, vendo ele funcionando pelo navegador). Uma possivel causa é quando o servidor não suporta o handshake antigo do SSL 2.

Como OpenSSL tenta negociar todos os protocolos que conhece e como o o SSL2 pode ser negociado apenas usando o antigo handshake SSL2, ele usa este handshake como padrão.

Mesmo que ele esteja associado com um protocolo muito antigo e inseguro, o formato de handshake antigo não é inseguro. Ele suporta upgrades, o que significa que um protocolo melhor pode ser negociado. No entanto, esta formato de handshake não suporta muitas características de conexão que foram criadas após o SSL 2.

Desta forma, para forçar o OpenSSL a usar um novo formato de conexão, faça isso desativando o SSL2 :

openssl s_client -connect www.guiafoca.org:443 -no_ssl2

Uma forma alternativa de fazer o mesmo, é especificar o servername na linha de comando:

openssl s_client -connect www.guiafoca.org:443 -servername www.guiafoca.org

A opção -servername [nome] permite o habilitar a conexão usaando SNI (Server Name Indicator), o que forçará o uso do novo padrão SSL3.

Testando o suporte a uma versão específica de protocolo SSL

Por padrão, o openssl s_client tentará usar o melhor protocolo para falar com o servidor remoto e reportará a versão negociada na saída:

Protocol : TLSv1.2

Caso precise testar o suporte a uma versão específica, então você terá duas opções.

  1. Especificar explicitamente qual deseja usar entre as opções: -ssl2, -ssl3, -tls1, -tls1_1, -tls1_2, -tls1_3

  2. Especificar que protocolos você NÂO deseja testar usando uma das opções: -no_ssl2, -no_ssl3, -no_tls1, -no_tls1_1, -no_tls1_2

# Caso o client não suportar a opção, você receberá o retorno:

$ openssl s_client -connect www.guiafoca.org:443 -showcerts -tls1_1
s_client: Option unknown option -tls1_1
s_client: Use -help for summary.

OBS: A versão OpenSSL 1.1.0f e mais novas, apenas suportam o TLS e a opção -no_ssl3.

Caso o servidor não suportar uma versão de protocolo, o seguinte retorno será mostrado:

$ openssl s_client -connect www.guiafoca.org:443 -tls1_2
CONNECTED(00000003)
140455015261856:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3↩
_pkt.c:340:

Testando o suporte a um conjunto de Ciphers

A configuração do Cipher é feita ao selecionar os ciphers que deseja usar, mas se especificar somente um conjunto de Ciphers e fizer o handshake com sucesso no servidor, claramente significa que ele suporta o conjunto. Se o handshake falhar, saberá que não tem suporte a àquele conjunto:

Para testar se o o servidor suporta RC4-SHA:

openssl s_client -connect www.guiafoca.org:443 -cipher RC4-SHA

Para obter uma lista de todos os tipos suportados por um servidor, inicie com o comando:

# openssl ciphers ALL

Para obter uma lista de todos os ciphers ssl suportados por sua versão e envie-os um a um para teste individual, possivelmente usando um script. Observe que você somente pode testar com Ciphers também suportados por sua versão de SSL.

Testando servidores que requerem SNI

Como o SSL e o TLS inicialmente foram feitos para suportar um website por IP, o SNI é uma extensão do TLS que permite usar mais de um certificado com o mesmo endpoint IP. Isso é importante principalmente para provedores de hospedagem que utilizam IPV4, devido a escassez de endereços IP.

Pra que isso ocorra, o TLS usa a extensão para enviar o nome designado e os servidores TLS utilizam para selecioanr o certificado correto para responder. Em resumo, o SNI permite o uso de hospedagens de forma segura.

Caso tentar conectar sem SNI em servidor com SNI, uma das três coisas acontecerão:

  • A mais frequente, você receberá o mesmo certificado que obteria caso os dados SNI não forem fornecidos

  • O servidor reponderá com um certificado diferente do site que fará o teste

  • Muito raramente, o servidor abortará o handshake e recusará a conexão

Você pode ativar o teste de SNI no s_client com a opção -servername:

openssl s_client -connect www.guiafoca.org:443 -servername www.guiafoca.org

Desta forma, a conexão resolvera o IP do parametro passado por -connect e enviará o nome indicado por -servername.

Você pode determinar se o site requer SNI testando ele com e sem o parametro -servername e comparando os resultados. Caso não forem, o SNI é requerido.

Algumas vezes, se o nome requisitado não estiver disponível, o servidor mostrará isso com um alerta TLS:

openssl s_client -connect www.guiafoca.org:443 -servername www.guiadofoca.org
CONNECTED(00000003)
1255:error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112):s23_clnt.c:596:

Testando reuso de conexão no SSL

O parâmetro -reconnect faz o teste de reuso de sessão. Neste modo, o openssl s_client conectará no destino sez vezes, a primeira será a nova conexão e tentará reutilizar a conexão nas próximas cinco.

echo | openssl s_client -connect www.guiafoca.org:443 -reconnect

Na primeira:

New, TLSv1.3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit

Nas tentativas seguintes:

Reused, TLSv1.3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Secure Renegotiation IS supported

Caso o reuso de conexão não estiver ativado, você receberá o seguinte retorno:

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)

OBS: Para desativar o uso de tickets de sessão, caso o cliente não utilize essa característica, desative com a opção -no_ticket

Validação de revogação OCSP

O OCSP significa Online Certificate Status Protocol (Protocolo de status online do Certificado), descrito na RFC2560, ajuda a elevar a segurança de publicação de certificados, através da verificação do seatus de validade do certificado.

Se o responder OCSP estiver com mal funcionamento, geralmente é dificil entender o porque. A verificação do status da revogação do certificado pela linha de comando é possível, mas nem sempre fácil. Ela pode ser feita da seguinte forma:

  • Obtenha um certificado que deseja verifica a revogação

  • Obtenha o certificado do emissor

  • Determine a URL do reponder OCSP

  • Envie uma requisição OCSP e observe a resposta

Para os primeiros dois passos, conecte no servidro com a opção -showcerts como especificado:

openssl s_client -connect www.guiafoca.org:443 -showcerts

Para obter somente o endereço do responder OCSP, utilize o seguinte comando no certificado baixado localmente:

openssl x509 -in fd.crt -noout -ocsp_uri

Agora, você poderá enviar a requisição OCSP:

openssl ocsp -issuer issuer.crt -cert fd.crt -url http://www.guiafoca.org/ -CAfile issuer.crt
WARNING: no nonce in response
Response verify OK
fd.crt: good
        This Update: Feb 18 17:59:10 2020 GMT
        Next Update: Feb 18 23:59:10 2020 GMT

Testando o suporte a OCSP Stapling

O OCSP Stapling é um recurso opcional que permite ao certificado do servidor ser acompanhado por uma resposta OCSP que prova sua validade. Porque a resposta OCSP é entregue através de uma conexão existente, o cliente não precisa pega-la separadamente.

O OCSP Stapling é usado somente se requisitado pelo cliente, que envia a extensão status_request em uma requisição handshake. O servidor que suporta o OCSP stapling responderá incluindo uma requisião OCSP como parte do handshake.

Quando utiliza a ferramenta s_client, o OCSP stapling é requisitado com a opção -status:

$ echo | openssl s_client -connect www.guiafoca.org:443 -status

Dados relacionados com o OCSP serão mostrados no inicio da conexão de saída. Por exemplo, se o servidor não suportar stapling, você verá essa linha no topo da saída:

CONNECTED(00000003)
OCSP response: no response sent

Com um servidor que suporta stapling, você verá a resposta na saída:

OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: C = US, O = "GeoTrust, Inc.", CN = RapidSSL OCSP-TGV Responder
    Produced At: Jan 22 17:48:55 2014 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: 534F7A75EAC6542FED58B2BD2B15802865301E0E
      Issuer Key Hash: 65693D6A18424ADD8F026539FD35248678911630
      Serial Number: 0FA476
    Cert Status: good
    This Update: Jan 22 17:48:55 2020 GMT
    Next Update: Jan 29 17:48:55 2020 GMT
[...]

O certificado retornando o status good, indica que ele não foi revogado.

Verificando a revogação de CRL

O teste de CRL é bem mais interessante que fazer o mesmo via OCSP. Para fazer a verificação de certificado CRL do servidor, execute os seguintes passos:

  • Acesse o servidor que possui o certificado .crt e execute o seguinte comando: openssl x509 -in fd.crt -noout -text | grep -A 5 CRL

  • >

    Obtenha o certificado do emissor

  • Baixe e verifique a CRL da CA. No caso, faremos um teste usando o RapidSSL: wget -nd http://rapidssl-crl.geotrust.com/crls/rapidssl.crl

    Aproveite esta etapa após baixar o CRL e execute uma validação para ter certeza que o certificado é assinado pelo issuer (emissor):

         $ openssl crl -in rapidssl.crl -inform DER -CAfile issuer.crt -noout
    verify OK
         
  • Confira se o serial do Certificado está definido na CRL:

    openssl x509 -in fd.crt -noout -serial
    serial=0FA476
          

Após o procedimento, se desejar visualizar o certificado em formato legível, vamos converter o CRL e analisar seus parâmetros:

openssl crl -in rapidssl.crl -inform DER -text -noout
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=US/O=GeoTrust, Inc./CN=RapidSSL CA
        Last Update: Jan 25 11:03:00 2014 GMT
        Next Update: Feb  4 11:03:00 2014 GMT
        CRL extensions:
            X509v3 Authority Key Identifier:
                keyid:6B:69:3D:6A:18:42:4A:DD:8F:02:65:39:FD:35:24:86:78:91:16:30

            X509v3 CRL Number:
                92103
Revoked Certificates:
    Serial Number: 0F38D7
        Revocation Date: Nov 26 20:07:51 2013 GMT
    Serial Number: 6F29
        Revocation Date: Aug 15 20:48:57 2011 GMT
[...]
    Serial Number: 0C184E
        Revocation Date: Jun 13 23:00:12 2013 GMT
    Signature Algorithm: sha1WithRSAEncryption
         95:df:e5:59:bc:95:e8:2f:bb:0a:4f:20:ad:ca:8f:78:16:54:
         35:32:55:b0:c9:be:5b:89:da:ba:ae:67:19:6e:07:23:4d:5f:
         16:18:5c:f3:91:15:da:9e:68:b0:81:da:68:26:a0:33:9d:34:
         2d:5c:84:4b:70:fa:76:27:3a:fc:15:27:e8:4b:3a:6e:2e:1c:
         2c:71:58:15:8e:c2:7a:ac:9f:04:c0:f6:3c:f5:ee:e5:77:10:
         e7:88:83:00:44:c4:75:c4:2b:d3:09:55:b9:46:bf:fd:09:22:
         de:ab:07:64:3b:82:c0:4c:2e:10:9b:ab:dd:d2:cb:0c:a9:b0:
         51:7b:46:98:15:83:97:e5:ed:3d:ea:b9:65:d4:10:05:10:66:
         09:5c:c9:d3:88:c6:fb:28:0e:92:1e:35:b0:e0:25:35:65:b9:
         98:92:c7:fd:e2:c7:cc:e3:b5:48:08:27:1c:e5:fc:7f:31:8f:
         0a:be:b2:62:dd:45:3b:fb:4f:25:62:66:45:34:eb:63:44:43:
         cb:3b:40:77:b3:7f:6c:83:5c:99:4b:93:d9:39:62:48:5d:8c:
         63:e2:a8:26:64:5d:08:e5:c3:08:e2:09:b0:d1:44:7b:92:96:
         aa:45:9f:ed:36:f8:62:60:66:42:1c:ea:e9:9a:06:25:c4:85:
         fc:77:f2:71

O CRL inicia com metadados, que são seguidos de uma lista de certificados revogados, finalizando com uma assinatura. Se o serial do servidor estiver na lista, significa que foi revogado.

Se não quiser procurar o serial visualmente, utilize o grep para fazer a filtragem. openssl crl -in rapidssl.crl -inform DER -text -noout | grep FE760

Verificando vulnerabilidade HeartBleed

A ferramenta openssl possui um código interno que permite verificar vulnerabilidade de segurança em servidores remotos, como a HeartBleed. Para utiliza-la, execute o OpenSSL com o parametro -tlsextdebug: $ openssl s_client -connect www.guiafoca.org:443 -tlsextdebug

CONNECTED(00000003)
TLS server extension "renegotiation info" (id=65281), len=1
0001 - <SPACES/NULS>
TLS server extension "EC point formats" (id=11), len=4
0000 - 03 00 01 02                                       ....
TLS server extension "session ticket" (id=35), len=0
TLS server extension "heartbeat" (id=15), len=1

Caso a saída do comando mostrar heartbeat ele está vulnerável ao ataque HeatBleed.

Determinando o tamanho de parametros DH

No OpenSSL 1.0.2 e mais novos, quando você se conecta ao servidor utilizando o parametro s_client, ele exibe mostra o tamanho da chave DH usada. Assim para determinar o tamanho de parametros DH, precisa conectar a ele utilizando ciphers que usam o DH para troca de chave: openssl-1.0.2 s_client -connnect www.guiafoca.org:443 -cipher kEDH

[...]
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
[...]