apache ssl - não é possível obter o certificado do emissor local

10

De alguma forma, apenas hoje de repente meu cliente seafile lançou esse erro. Não acredito que seja um problema do arquivo seafile, porque o meu openssl gera exatamente o mesmo erro:

user@nb-user:~$ echo |openssl s_client -connect seafile.mydomain.ch:443
CONNECTED(00000003)
depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 2 Primary Intermediate Server CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/description=5RygJ9fx8e2SBLzw/C=CH/ST=Thurgau/L=Frauenfeld/O=mydomain GmbH/CN=*.mydomain.ch/[email protected]
   i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
 1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
   i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGqzCCBZOgAwIBAgIDAjmGMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ
TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0
[... some more lines]
-----END CERTIFICATE-----
subject=/description=5RygJ9fx8e2SBLzw/C=CH/ST=Thurgau/L=Frauenfeld/O=mydomain GmbH/CN=*.mydomain.ch/[email protected]
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
---
No client certificate CA names sent
---
SSL handshake has read 3997 bytes and written 431 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 96E1F6B9E123F8F8C1C1E8FB0DBACDBBE76ECB3E2CF5C46C1FD2CF46833C8212
    Session-ID-ctx: 
    Master-Key: 25837E1786B0CC60E676D0694319641CD0887F9CAF48A820F1C0D6ABA6FDE0742551816ACD2A4885B0D3FC143716B1F6
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 88 15 c0 c5 30 04 63 d6-ff 7c 72 c4 12 84 7b d6   ....0.c..|r...{.
    0010 - 73 33 8d 91 7c da ce 22-23 d0 31 fb c1 7f 1c 9c   s3..|.."#.1.....
    [... some more lines]

    Start Time: 1424953937
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE

Para mim, a parte da corrente parece exatamente o que deveria. O apache conf também deve estar ok:

root@i-can-haz-data ~ # cat /etc/apache2/sites-enabled/seafile.conf

<VirtualHost *:443>

    ServerName seafile.mydomain.ch
    DocumentRoot /opt/seafile/www

    [... seafile specific things]

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on
    SSLCertificateFile      /etc/ssl/custom/wildcardmydomain.ch.crt
    SSLCertificateKeyFile   /etc/ssl/custom/wildcardmydomain.ch.key
    SSLCertificateChainFile /etc/ssl/custom/wildcardmydomain.ch.chain.crt

    [... seafile specific things]

</VirtualHost>

Não consigo encontrar qual é o meu problema ... (o certificado ca está instalado no meu lubuntu 14.04). Seu site não é aplicável porque eles vincularam seu certificado de Classe 1, mas o meu é emitido por sua Classe 2.

Dionísio
fonte
Qual sistema operacional? Atualizou os certificados ca recentemente? Houve atualizações para o Ubuntu em 23/02/2015. E se você adicionar -CApath /etc/ssl/certs/ou onde seus certificados estão armazenados? Talvez você esteja perdendo o certificado raiz na cadeia?
sebix
Uau, você me aponta para a direção certa. Obrigado! echo | openssl s_client -connect seafile.mydomain.ch:443 -CApath / etc / ssl / certs / -> Verifique o código de retorno: 0 (ok) DISTRIB_DESCRIPTION = "Ubuntu 14.04.2 LTS". Atualização do sistema: 0 atualizado, 0 recém-instalado, 0 para remover e 0 não atualizado. Pacote: ca-certificates ii 20141019ubuntu0.14.04.1
Dionísio

Respostas:

19
verify error:num=20:unable to get local issuer certificate

Esse erro do OpenSSL significa que o programa não conseguiu verificar o emissor do certificado ou o certificado mais alto de uma cadeia fornecida. Isso pode acontecer em alguns casos, por exemplo:

  • A cadeia de certificados para o certificado não foi fornecida pelo outro lado ou não possui uma (é autoassinada).
  • O certificado raiz não está no banco de dados local de certificados raiz confiáveis.
  • O banco de dados local de certificados raiz confiáveis ​​não foi fornecido e, portanto, não foi consultado pelo OpenSSL. Para fornecer o caminho para os certificados explicitamente, use a opção -CApathou -CAfilePara Debian e Ubuntu, é por exemplo:

    -CApath /etc/ssl/certs/
    -CAfile /etc/ssl/certs/ca-certificates.crt
    

    resultando em

    openssl s_client -connect example.com:443 -CApath /etc/ssl/certs/
    openssl s_client -connect example.com:443 -CAfile /etc/ssl/certs/ca-certificates.crt
    

Este último precisa de mais informações. Há um relatório de bug aberto para o OpenSSL no Ubuntu desde 2009:

O uso de -CApath parece definir -CAfile como o padrão de /etc/ssl/certs/ca-certificates.crt.

Não importa o que você indicar como caminho -CApath, ele pode funcionar, porque -CAfiletambém é definido como seu valor padrão (que estava vazio anteriormente). Portanto, não confie no comportamento padrão do OpenSSL na verificação de certificados por um banco de dados de certificados local, pois pode ser falso!

sebix
fonte
Então, você quer dizer que a configuração do meu servidor e do meu notebook não está errada (porque está tudo bem com a opção -CApath)? Bem, então, é uma falha do seafile-client notificando-me esse erro? Talvez seja esse problema: github.com/haiwen/seafile-client/issues/93 - Mas obrigado, marcado como resolvido :)
Dionísio
Eu mergulhei mais no comportamento do OpenSSL, veja meu post atualizado. Você também pode considerar upvoting;)
sebix