I am trying to get the SSL/TLS certificate for one of our load
balancers (Netscaler) using:
openssl s_client -showcerts -connect lb.example.com:443
Se é uma configuração moderna (algumas mãos a negar o que isso significa), use:
openssl s_client -connect lb.example.com:443 -tls1 -servername lb.example.com | \
openssl x509 -text -noout
CONNECTED(00000003)
write to 0x7fec7af0abf0 [0x7fec7b803a00] (130 bytes => 130 (0x82))
0000 - 80 80 01 03 01 00 57 00-00 00 20 00 00 39 00 00
...
Parece que há algum preâmbulo extra no byte 0 e 1. No byte 2, deve haver um tipo de registro. Nos bytes 3 e 4 deve haver um número de versão. Os bytes 5 e 6 devem ter um comprimento de 16 bits da carga útil.
Aqui está um exemplo de trabalho:
$ openssl s_client -connect www.googl.com:443 -tls1 -servername www.googl.com -debug
CONNECTED(00000005)
write to 0x7f7fe1c1fa30 [0x7f7fe2022000] (132 bytes => 132 (0x84))
0000 - 16 03 01 00 7f 01 00 00-7b 03 01 71 c0 12 35 98
...
Acima, o tipo de registro está na posição 0 e seu valor é 0x16. 0x16 é o tipo de handshake. A versão da camada de registro são os próximos dois bytes nas posições 2 e 3. Seus valores são 0x03 0x01
. O comprimento da carga útil é 0x007f
.
Veja também RFC 5246, a versão 1.2 do Protocolo TLS (Transport Layer Security) , página 18:
6.2.1. Fragmentation
The record layer fragments information blocks into TLSPlaintext
records carrying data in chunks of 2^14 bytes or less. Client
message boundaries are not preserved in the record layer (i.e.,
multiple client messages of the same ContentType MAY be coalesced
into a single TLSPlaintext record, or a single message MAY be
fragmented across several records).
struct {
uint8 major;
uint8 minor;
} ProtocolVersion;
enum {
change_cipher_spec(20), alert(21), handshake(22),
application_data(23), (255)
} ContentType;
struct {
ContentType type;
ProtocolVersion version;
uint16 length;
opaque fragment[TLSPlaintext.length];
} TLSPlaintext;
Seu problema pode ser o antigo tipo de registro compatível com SSLv2. Ou pode ser uma versão de baixo nível do OpenSSL, digamos 0.9.5 ou 0.9.8. É difícil dizer, e provavelmente precisamos de mais informações.
Mais informações incluirão o SO; Versão OpenSSL; se você tentou substituir a versão da plataforma do OpenSSL por sua própria versão do OpenSSL; se há uma caixa de firewall ou "web inspecionar" ou outra bondade de middleware em execução; e o que o servidor recebe.
Using -servername lb.example.com
doesn't help, and our sysadmin told me our load balancers don't use SNI anyway.
Isso soa meio incomum. Mas é uma extensão do TLS, então é ignorado se não for usado (e não produzirá um alerta fatal).
A regra prática em 2016: use sempre o TLS 1.0 ou superior e sempre use o SNI.