Estamos com problemas para curl
não conectar a um servidor HTTPS:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 é SSL_R_TLSV1_UNRECOGNIZED_NAME
em ssl.h
.
Se eu tentar, openssl s_client -connect the-problem-site.com:443
então eu vejo
CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
ou seja, parece que o problema é que não confia /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
. No entanto, esse certificado está instalado: é /etc/ssl/certs/GeoTrust_Global_CA.pem
, e se eu correr
openssl s_client -conecte o-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
então tudo funciona. O cert também está presente como um arquivo chamado hash b0f3e76e.0
e está em ca-certificates.crt
. No entanto, tanto quanto posso ver, nem curl nem openssl estão tentando ler nenhum certificado; se eu strace
eles, então não há nenhuma tentativa de ler /usr/lib/ssl/certs
ou /etc/ssl/certs
de todo, nem mesmo com erros. Ele lê openssl.cnf embora. Nós corremos update-ca-certificates
.
Este é o Ubuntu 10.04 com o openssl 0.9.8k. Podemos reproduzir o problema em duas instalações separadas (embora seja possível que seja um clone do outro no caminho de volta). Se eu tentar o mesmo teste em uma VM do CentOS com o openssl 0.9.8e, ele funcionará bem e posso vê-lo lendo o arquivo de certificado strace
. Não há acesso equivalente a arquivos no mesmo ponto nos traços do Ubuntu. Se eu copiar o openssl.cnf
arquivo da CentOS VM para as máquinas Ubuntu, não faz diferença. Não há nada óbvio no ambiente ou em um arquivo .rc que possa estar causando isso.
Alguma idéia do que estou fazendo de errado? Isso deve funcionar, isto é, o openssl e o curl selecionam as CAs instaladas automaticamente na linha de comando? Como isso está configurado? Obrigado!
Outro ponto de dados: em uma instalação limpa de 13 servidores, curl
pega o arquivo de certificados e funciona bem. openssl s_client
ainda não, no entanto. Por que isso seria?
Respostas:
Existem várias bibliotecas criptográficas no seu sistema:
Todos eles têm, é claro, semelhanças e diferenças. O software que os utiliza (para fins criptográficos ou para usar SSL / TLS) às vezes suporta o uso de mais de uma dessas bibliotecas (por exemplo, Lynx, o navegador da web, normalmente está vinculado ao OpenSSL, mas também suporta o GnuTLS (não tão bom) em para apaziguar o povo GNU).
O cURL também é um dos projetos de suporte ao uso de uma das três principais bibliotecas de criptografia. Isso ocorre principalmente porque o cURL é, principalmente, uma biblioteca destinada a ser usada por outros programas quando eles querem baixar (ou até carregar) coisas usando conexões http, ftp, etc. A
curl
ferramenta de linha de comando pode vir de qualquer uma dessas variantes.Agora, tenho certeza de que o problema que você está enfrentando com o sistema não recém-instalado é o seguinte:
O OpenSSL e o GnuTLS suportam o uso de
/etc/ssl/certs/<hash>.<number>
diretórios CA de estilo. O OpenSSL versão 0.xe GnuTLS, no entanto, usam um algoritmo diferente para calcular o hash mencionado acima do OpenSSL versão 1.x. (Ambos podem coexistir em um sistema; se certificados diferentes tiverem o mesmo hash, basta usar um número diferente para eles. Mas, por alguma razão, oca-certificates
pacote Debian / Ubuntu parece não fazer isso.) Além disso, algumas versões do GnuTLS não suporte usando o diretório, mas apenas usando um arquivo/etc/ssl/certs/ca-certificates.crt
(que geralmente também é gerenciado pelosca-certificates
scripts de manutenção do pacote, mas pode se desviar); você parece estar usando uma versão mais antiga; portanto, essa pode ser a coisa que você acertou.openssl s_client
por padrão (ou seja, sem a opção-CApath
ou-CAfile
), não procura certificados em nenhum lugar .Seu
curl
partir da instalação atualizada provavelmente usa uma biblioteca de criptografia diferente do que ocurl
da instalação do zero.openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443
Além deopenssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443
imitar o comportamento de versões mais antigas do GnuTLS, tente .Verifique novamente se há um OpenSSL 1.x em qualquer lugar do seu sistema (o Ubuntu é conhecido por apresentar grandes atualizações mesmo nas versões LTS) e, se sim, verifique o hash do arquivo:
Normalmente, o segundo e o terceiro comando devem falhar (OpenSSL 0.x) ou o primeiro e o terceiro comando devem exibir o mesmo hash, mas o segundo deve exibir um hash diferente (OpenSSL 1.x). O GnuTLS usaria a saída do segundo comando (se o OpenSSL 1.x estiver instalado); se o OpenSSL 0.x estiver instalado, é o mesmo hash. Você pode criar esses links simbólicos manualmente.
Posso atualizar esta postagem assim que você fornecer comentários sobre a depuração.
fonte