Назад | Перейти на главную страницу

версия 0.9.7a openssl сообщает «ошибка подписи сертификата», но версия 0.9.8e довольна

Я пытаюсь построить цепочку сертификатов openssl, которая будет работать со стандартной установкой CentOS 4 в качестве клиента. (Я знаю, что он очень старый, но это то, что использует наш клиент, поэтому нам необходимо его поддерживать).

Первая проблема заключается в том, что пакет CentOS 4 openssl CA не содержит всех современных сертификатов, в частности корневого сертификата GoDaddy.

/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority

Итак, я покопался, нашел сертификат Valicert для указанного выше сертификата и поместил его в цепочку. Бег openssl s_client в CentOS 5 (это openssl 0.9.8e) эта цепочка проверяет, но на CentOS 4 (это openssl 0.9.7a) она не проверяется.

Выход CentOS 5:

$ openssl s_client -CAfile /etc/pki/tls/certs/ca-bundle.crt -connect svn.example.org:443
CONNECTED(00000003)
depth=4 /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
verify return:1
depth=3 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
verify return:1
depth=2 /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
verify return:1
depth=1 /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
verify return:1
depth=0 /OU=Domain Control Validated/CN=*.example.org
verify return:1
---
Certificate chain
 0 s:/OU=Domain Control Validated/CN=*.example.org
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
 2 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
   i:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
 3 s:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
   i:/L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
---
Server certificate
-----BEGIN CERTIFICATE-----
[ SNIP ]
-----END CERTIFICATE-----
subject=/OU=Domain Control Validated/CN=*.example.org
issuer=/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
---
No client certificate CA names sent
---
SSL handshake has read 5697 bytes and written 319 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: [ SNIP ]
    Session-ID-ctx:
    Master-Key: [ SNIP ]
    Key-Arg   : None
    Krb5 Principal: None
    Start Time: 1394712184
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

На CentOS 4:

$ openssl s_client -CAfile /usr/share/ssl/certs/ca-bundle.crt -connect svn.example.org:443
CONNECTED(00000003)
depth=4 /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
verify return:1
depth=3 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
verify return:1
depth=2 /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
verify error:num=7:certificate signature failure
verify return:0
---
Certificate chain
 0 s:/OU=Domain Control Validated/CN=*.example.org
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
 2 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
   i:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
 3 s:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
   i:/L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com
---
Server certificate
-----BEGIN CERTIFICATE-----
[ SNIP ]
-----END CERTIFICATE-----
subject=/OU=Domain Control Validated/CN=*.example.org
issuer=/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
---
No client certificate CA names sent
---
SSL handshake has read 5697 bytes and written 343 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: [ SNIP ]
    Session-ID-ctx:
    Master-Key: [ SNIP ]
    Key-Arg   : None
    Krb5 Principal: None
    Start Time: 1394712595
    Timeout   : 300 (sec)
    Verify return code: 7 (certificate signature failure)
---
DONE

Немного смущен на этом этапе, любые идеи приветствуются.

Предполагая, что сертификат №3 в вашей цепочке находится на https://certs.godaddy.com/anonymous/repository.pki gdroot-g2_cross.crt с отпечатком SHA1 84 1D 4A 9F C9 D3 B2 F0 CA 5F AB 95 52 5A B2 06 6A CF 83 22, то есть подписано с использованием SHA256WithRSA. Итак, настоящий корень для Go Daddy Root Certification Authority - G2 который gdroot-g2.crt 47 BE AB C9 22 EA E8 0E 78 78 34 62 A7 9F 45 C2 54 FD E6 8B, а не тот, кого вы определили Go Daddy Secure Certificate Authority - G2 что явно промежуточное, очевидно gdig2.crt 27 AC 93 69 FA F2 52 07 BB 26 27 CE FA CC BE 4E F9 C3 19 B8.

(Один) OpenSSL 0.9.7, который у меня все еще есть в одной из моих систем, 0.9.7d, не поддерживает SHA-2. Он датирован 2004 годом, база 0.9.7, по-видимому, датируется декабрем 2002 года, а FIPS 180-2 был опубликован в августе 2002 года.

Я предлагаю вам проверить сертификат вашей сущности; он также может быть подписан с помощью SHA256. Ваш номер 1 по-видимому gdig2.crt что определенно есть. Если так, они никогда не будут работать в 0.9.7; вы не видели там ошибки, потому что она уже не прошла дальше по цепочке.

Я не уверен, что вы сможете найти коммерческий центр сертификации, который выдаст вам сертификат (и цепочку), подписанный SHA1, после того, как крайний срок NIST вступит в силу в начале 2014 года; в таком случае он, вероятно, не будет действовать очень долго, и тогда вы снова столкнетесь с той же проблемой. Если клиент желает изменить свое хранилище доверенных сертификатов (системное, без изменения кода) или пользовательское хранилище, используемое любыми клиентскими приложениями, которые вам интересны, вы можете просто создать самоподписанный сертификат с SHA1 для своего сервера. key, используя openssl, и пусть клиент (ы?) доверяет этому. В зависимости от вашего сервера, если вы можете разделить запросы от хромых клиентов на другой порт или адрес, вы можете использовать свой самодельный сертификат SHA1 только для них, а свой коммерческий сертификат SHA256 - для всех остальных.