Usando o OpenSSL s_client para conectar em sites seguros com SSL ou STARTTLS

Autor:
Criado em: Qua, 06 Jul 2016 19:26:45 GMT


Introdução

Neste tutorial você irá aprender o uso básico do OpenSSL com conexões SSL ou STARTTLS. Para conectar a um site SSL ou um serviço em geral, tendo um terminal no estilo telnet, você usará o seguinte, aonde example.com é o destino e 443 é a porta padrão do protocolo HTTPS:

openssl s_client -connect example.com:443

Se você estiver usando um certificado assinado por você mesmo (self signed certificate), você pode dizer ao OpenSSL para usar sua própria CA para autenticar com o comando abaixo, aonde ca.crt é o seu certificado da CA:

openssl s_client -CAfile ca.crt -connect example.com:443

Se você precisa checar um serviço STARTTLS, como por exemplo POP3, IMAP ou SMTP, você pode usar o seguinte, aonde cada linha é um exemplo de serviço:

openssl s_client -starttls smtp -connect mail.example.com:25
openssl s_client -starttls pop3 -connect mail.example.com:110
openssl s_client -starttls imap -connect mail.example.com:143

Entendendo a saída do comando OpenSSL s_client

Quando você conectar ao servidor você terá bastante informação, como por exemplo tentando enviar um email pelo gmail usando TLS e SMTP:

ds@localhost ~ $ openssl s_client -connect smtp.gmail.com:587 -starttls smtp
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = smtp.gmail.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
 i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIIfMman9+czWkwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTYwNjMwMTQ1ODM5WhcNMTYwOTIyMTQ1MzAw
WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOc210
cC5nbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCG2pVu
NQl/MS3rRXTfsvMVqRwnq1Wp5lfZQzirPFDq5zVPZdUjFuvXWSARG3jTgWQmImxF
5LHadoDT/1hUcvXdHVMDToGidd7oS34uB0tJMzg5V5EYngpNapk5tG+1RnmATMGp
/FadP/ua5w4SQSy+HelVQDLEPBw69vaCvwVUpE/++36fJejxd3PFQTgOyxzfK7hO
q6kjD5CU22lhdg+/DBlO6jt/3k3s0870JJDzG5yPhRTQray/q82W0rdi7nSIBrpz
q0QjwrcqeTvEXn+WIMTKNar2pYMJ+3FM/IzMLxOZBdbkDIeC8hdOfc4nDCRHF9xr
GCBaa1mIoVWfOatlAgMBAAGjggFLMIIBRzAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwGQYDVR0RBBIwEIIOc210cC5nbWFpbC5jb20waAYIKwYBBQUHAQEE
XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
A1UdDgQWBBRuqJafObl4pMJL80jVAaHoQvtvyTAMBgNVHRMBAf8EAjAAMB8GA1Ud
IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHW
eQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29n
bGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAZWAOHh4qrhVxHqfZ
kZGrVKOksEZcjqB1sS1R3vue7L9BcReufk/SsdQHn+Uo3UKgC0BJpiP0cZ+Du4ni
T4vUFdylXdz+N8eHCOx9lct2rcg2cEZI9nVCiQxKjXDF0eHguOrSOMt5v7cnKFei
C8fM2kfpmXSNyWpj/P38AOtjskBHBwfzdNEnro9xODMRNnp66bnGWXnOlAgi3vup
uTzYMTID/qE+uBKuXEvX050AqMM/DcB1DKUy97iJe8MjyHwrELJbBkIqP5gkNQsY
jOJ6ZzgW2aeCVCCoBw/EfpDYXCL6oKnn/2NJalWAfwCL7hO+DVsCKoXRBJA+eTob
UmrB4g==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3979 bytes and written 469 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
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-AES128-GCM-SHA256
 Session-ID: B3DEDB08318E277FFEED0321D213F94D29FDBBAD2CD4B4FC5A8F71514B5C3549
 Session-ID-ctx: 
 Master-Key: 7EADA15AF7DEBBEF1DBC4E7A5FB62C38C9278A40908B21F6E857682F69AFDCFB721A2F6558174D52AC821E0072B42E53
 Key-Arg : None
 PSK identity: None
 PSK identity hint: None
 SRP username: None
 TLS session ticket lifetime hint: 100800 (seconds)
 TLS session ticket:
 0000 - a5 e8 45 fe 7d 0a 4a 4d-1e e8 e1 87 36 72 35 ab ..E.}.JM....6r5.
 0010 - d5 70 5e 33 53 fd a0 a7-a5 fd f1 00 d8 0a 9b ee .p^3S...........
 0020 - 2e c1 29 09 ad 07 4c 82-9f e7 ee 3e fc e0 b5 31 ..)...L....>...1
 0030 - 2b 96 59 79 77 81 70 73-71 5d dc 11 c2 90 27 7f +.Yyw.psq]....'.
 0040 - a4 34 20 c5 cf b8 95 a4-be 84 87 f4 24 39 95 63 .4 .........$9.c
 0050 - b5 3e f2 cf 09 20 5f 1a-f8 7a 2f 1b c7 8a ea af .>... _..z/.....
 0060 - e4 40 ad cb ce 39 1b bf-46 e8 33 2b 17 f9 97 82 .@...9..F.3+....
 0070 - 94 bb 6b 38 8a 32 28 50-6f 6f bc d0 8d cd 9e 3e ..k8.2(Poo.....>
 0080 - 31 b3 a2 d2 79 7c de fa-fe 95 13 f7 de 60 cf ae 1...y|.......`..
 0090 - 67 a4 7b 67 dc a3 5a fb-05 02 53 4a 9b b0 f8 cc g.{g..Z...SJ....
 00a0 - 43 8c e2 55 C..U

 Start Time: 1467831400
 Timeout : 300 (sec)
 Verify return code: 0 (ok)
---
250 SMTPUTF8

Isso é bastante informação! Vamos analisar parte por parte: Primeiro você tem a cadeia de certificados (certificate chain), que é o certificado do servidor e todas as CAs que o identificam como confiável, de forma pura e processada pelo OpenSSL:

depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = smtp.gmail.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
 i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---

Isso diz que o certificado é o seguinte:

0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com

E ele é certificado ou assinado pelas CAs:

i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Em seguida você tem o arquivo do certificado, lembre do tutorial sobre gerar um certificado auto assinado pelo OpenSSL, o certificado é sempre público, então aqui esta o certificado do gmail no momento que escrevi este tutorial:

Server certificate
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIIfMman9+czWkwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTYwNjMwMTQ1ODM5WhcNMTYwOTIyMTQ1MzAw
WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOc210
cC5nbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCG2pVu
NQl/MS3rRXTfsvMVqRwnq1Wp5lfZQzirPFDq5zVPZdUjFuvXWSARG3jTgWQmImxF
5LHadoDT/1hUcvXdHVMDToGidd7oS34uB0tJMzg5V5EYngpNapk5tG+1RnmATMGp
/FadP/ua5w4SQSy+HelVQDLEPBw69vaCvwVUpE/++36fJejxd3PFQTgOyxzfK7hO
q6kjD5CU22lhdg+/DBlO6jt/3k3s0870JJDzG5yPhRTQray/q82W0rdi7nSIBrpz
q0QjwrcqeTvEXn+WIMTKNar2pYMJ+3FM/IzMLxOZBdbkDIeC8hdOfc4nDCRHF9xr
GCBaa1mIoVWfOatlAgMBAAGjggFLMIIBRzAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwGQYDVR0RBBIwEIIOc210cC5nbWFpbC5jb20waAYIKwYBBQUHAQEE
XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
A1UdDgQWBBRuqJafObl4pMJL80jVAaHoQvtvyTAMBgNVHRMBAf8EAjAAMB8GA1Ud
IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHW
eQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29n
bGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAZWAOHh4qrhVxHqfZ
kZGrVKOksEZcjqB1sS1R3vue7L9BcReufk/SsdQHn+Uo3UKgC0BJpiP0cZ+Du4ni
T4vUFdylXdz+N8eHCOx9lct2rcg2cEZI9nVCiQxKjXDF0eHguOrSOMt5v7cnKFei
C8fM2kfpmXSNyWpj/P38AOtjskBHBwfzdNEnro9xODMRNnp66bnGWXnOlAgi3vup
uTzYMTID/qE+uBKuXEvX050AqMM/DcB1DKUy97iJe8MjyHwrELJbBkIqP5gkNQsY
jOJ6ZzgW2aeCVCCoBw/EfpDYXCL6oKnn/2NJalWAfwCL7hO+DVsCKoXRBJA+eTob
UmrB4g==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---

Depois você tem informações sobre a conexão e o certificado que o cliente usou para conectar, como não usamos um certificado de cliente não tem muita coisa:

---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---

Então você tem informações técnicas sobre as cifragens usadas para criptografar e descriptografar os dados, e o estado da compactação, isso nos diz também qual versão do SSL e TLS esta sendo usada nesta conexão:

---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE

Neste caso temos um TLS versão 1, SSL versão 3, informações sobre cifragem e o tamanho da chave que é 2048bits. A cifragem é o algoritmo usado para criptografar e descriptografar os dados, esta é uma parte importante para o pessoal técnico, nós não vamos cobrir este assunto pois é muito avançado para este tutorial.

Finalmente temos a conexão aberta e a primeira linha enviada pelo servidor de forma segura usando o protocolo TLS/SSL:

--- 250 SMTPUTF8

Depois disto você pode enviar comandos SMTP, como por exemplo "EHLO dominio.com.br" ou comandos RCPT/MAIL/DATA, estes são todos comandos do protocolo SMTP e não serão explicados neste tutorial.

A parte importante é que após o trabalho do openssl s_client você terá uma conexão como teria usando um telnet normal, mas de forma segura usando TLS/SSL, então você pode enviar informações importantes como sua senha de forma segura, aliás muitos servidores de email não permitem mais autenticação sem criptografia, portanto para testar a autenticação nestes servidores você terá de usar algo como o que fizemos aqui.