apache ssl - невозможно получить сертификат локального эмитента

10

Каким-то образом как раз сегодня мой клиент-морефайл неожиданно выдал эту ошибку. Я не верю, что это проблема с морским файлом, потому что мой openssl выдает точно такую ​​же ошибку:

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/emailAddress=postmaster@mydomain.ch
   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/emailAddress=postmaster@mydomain.ch
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

Для меня часть цепи выглядит именно так, как и должна. Apache conf также должен быть в порядке:

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>

Я не могу найти, в чем моя проблема ... (CA-сертификаты установлены на моем lubuntu 14.04). Их сайт не применим, потому что они связали свой сертификат класса 1, но мой выдан их класс 2.

Дионисий
источник
Какая операционная система? Недавно обновили CA-сертификаты? Были обновления для Ubuntu 2015-02-23. Что, если вы добавите -CApath /etc/ssl/certs/или где хранятся ваши сертификаты? Возможно, вам не хватает корневого сертификата в цепочке?
Sebix
Вау, ты указываешь мне правильное направление. Спасибо! echo | openssl s_client -connect seafile.mydomain.ch:443 -CApath / etc / ssl / certs / -> Проверить код возврата: 0 (хорошо) DISTRIB_DESCRIPTION = "Ubuntu 14.04.2 LTS". Обновление системы: 0 обновлено, 0 недавно установлено, 0 для удаления и 0 не обновлено. Пакет: II CA-сертификаты 20141019ubuntu0.14.04.1
Дионисий

Ответы:

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

Эта ошибка OpenSSL означает, что программе не удалось проверить издателя сертификата или самый верхний сертификат предоставленной цепочки. Это может произойти в некоторых случаях, например:

  • Цепочка сертификатов для сертификата не была предоставлена ​​другой стороной или не имеет ее (она подписана самостоятельно).
  • Корневого сертификата нет в локальной базе данных доверенных корневых сертификатов.
  • Локальная база данных доверенных корневых сертификатов не была предоставлена ​​и поэтому не запрашивалась OpenSSL. Чтобы явно указать путь к сертификатам, используйте параметр -CApathили -CAfile. Для Debian и Ubuntu это, например:

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

    в результате чего либо

    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
    

Последнему нужно больше информации. Существует открытый отчет об ошибках для OpenSSL в Ubuntu с 2009 года:

Использование -CApath, по-видимому, устанавливает -CAfile в значение по умолчанию /etc/ssl/certs/ca-certificates.crt.

Независимо от того, что вы указываете как путь -CApath, он может работать, потому что для -CAfileнего также установлено значение по умолчанию (которое было пустым заранее). Так что не полагайтесь на поведение OpenSSL по умолчанию при проверке сертификатов локальной базой сертификатов, это может быть поддельным!

sebix
источник
Таким образом, вы имеете в виду, что в конфигурации моего сервера и системы ноутбука нет ничего плохого (потому что с опцией -CApath все в порядке)? Что ж, это вина пользователя-клиента, уведомившего меня об этой ошибке? Может быть, это проблема: github.com/haiwen/seafile-client/issues/93 - Но спасибо, помечено как решенное :)
Дионисий
Я больше копался в поведении OpenSSL, смотрите мой обновленный пост. Вы также можете рассмотреть возможность голосования;)
Sebix