OpenSSL não está escolhendo CAs na pasta certs

9

Estamos com problemas em curl não se 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 o 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   

i.e. parece que o problema é que ele não confia em /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA . No entanto, esse certificado está instalado: é /etc/ssl/certs/GeoTrust_Global_CA.pem e, se em vez disso, eu executo

  

openssl s_client -connect the-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem

então tudo funciona. O certificado também está presente como um arquivo com nome hash b0f3e76e.0 e está em ca-certificates.crt . No entanto, tanto quanto eu posso ver, nem curl nem openssl estão tentando ler os certificados; se eu strace , então não há nenhuma tentativa de ler /usr/lib/ssl/certs ou /etc/ssl/certs , nem mesmo com erros. Ele lê o 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 um 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 eu posso vê-lo lendo o arquivo de certificado em strace . Não há acesso ao arquivo equivalente no mesmo ponto nos straces do Ubuntu. Se eu copiar o arquivo openssl.cnf da VM do CentOS 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, ou seja, deve abrir e enrolar as CAs instaladas automaticamente a partir da linha de comando? Como isso é configurado? Obrigado!

Outro ponto de dados: em uma instalação limpa do servidor 13, curl seleciona o arquivo de certificados e funciona bem. openssl s_client ainda não, no entanto. Por que isso seria?

    
por Rup 02.05.2013 / 10:02

1 resposta

4

Existem várias bibliotecas criptográficas no seu sistema:

  • OpenSSL (o padrão ouro, com uma licença estilo BSD (muito grátis) que inclui uma cláusula problemática (impedindo a compatibilidade GPL, mas nada de “ruim”) limitando sua adoção no mundo GNU)
  • GnuTLS (a substituição da FSF; vem em dois tipos, licenciada pela LGPLv2 (mas sem manutenção) e licenciada pela LGPLv3 (e portanto incompatível com programas somente da GPLv2), historicamente não tão cheia quanto OpenSSL, um pouco mais bugs, mas mais estrito também, o que aumenta a segurança)
  • NSS (biblioteca do Netscape / Mozilla, raramente usada fora; demora para adotar novos padrões)
  • menores como PolarSSL, MatrixSSL, NaCl / Salt

Todos eles têm, é claro, semelhanças e diferenças. O software que os usa (para fins criptográficos ou para usar SSL / TLS) às vezes suporta o uso de mais de uma dessas bibliotecas (por exemplo, o Lynx, normalmente vinculado ao OpenSSL, mas também suporta o GnuTLS (não tão bom) para apaziguar o povo GNU).

O cURL também é um dos projetos que apóiam o uso de uma das três principais bibliotecas de criptografia. Isto é principalmente porque cURL é, primário, uma biblioteca destinada a ser usada por outros programas quando eles querem baixar (ou até carregar) coisas usando conexões http, ftp, etc. A ferramenta de linha de comando curl pode vir de uma dessas variantes.

Agora, tenho quase certeza de que o problema que você está vendo no sistema não recém-instalado é o seguinte:

O OpenSSL e o GnuTLS suportam o uso de diretórios CA no estilo /etc/ssl/certs/<hash>.<number> . No entanto, o OpenSSL versão 0.xe o GnuTLS usam um algoritmo diferente para calcular o hash mencionado que o OpenSSL versão 1.x usa. (Ambos podem coexistir em um sistema; se certificados diferentes tiverem o mesmo hash você apenas usa um número diferente para eles. Mas por algum motivo, o pacote ca-certificates do Debian / Ubuntu Além disso, algumas versões do GnuTLS não suportavam o uso do diretório, mas apenas o uso de um arquivo /etc/ssl/certs/ca-certificates.crt (que também é normalmente gerenciado pelos scripts do mantenedor do pacote ca-certificates , mas pode desviar); parece que você está usando uma versão mais antiga, então essa pode ser a coisa que você bateu.

openssl s_client por padrão (ou seja, sem a opção -CApath ou -CAfile ) não parece em qualquer lugar para certificados.

Seu curl da instalação atualizada provavelmente usa uma biblioteca de criptografia diferente da curl da nova instalação.

Teste openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443 além de openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443 para imitar o comportamento de versões antigas do GnuTLS.

Verifique novamente se existe um OpenSSL 1.x em qualquer lugar no seu sistema (o Ubuntu é conhecido por esconder grandes atualizações mesmo em versões LTS), e se sim, verifique o hash do arquivo:

openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem

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.

Eu posso atualizar esta postagem depois de fornecer feedback de depuração.

    
por mirabilos 01.03.2014 / 23:44

Tags