Я пытаюсь построить цепочку сертификатов 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 - для всех остальных.