Java пытается проверить сертификат, следуя цепочке сертификатов, представленных сервером, пока не найдет тот, которому доверяет (т. Е. Тот, который присутствует в вашем файле cacerts
).
Мы можем проверить цепочкувручную с помощью инструментов командной строки OpenSSL:
simon@lucifer:~$ openssl s_client -connect eservices3.bus.att.com:443
<snipped>
---
Certificate chain
0 s:/C=US/ST=Georgia/L=Alpharetta/O=ATT Services, Inc./OU=ATTIT/CN=eservices3.bus.att.com
i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Secure Server CA - G3
---
Теперь возникает проблема: эмитент (начало строки i:
) "VeriSign Class 3 Secure Server CA - G3" является промежуточным сертификатом, а не корневым сертификатом,Сервер AT & T настроен неправильно и должен отправлять оба своих собственных сертификата («eservices3.bus.att.com») и промежуточный, чтобы Java могла проверять цепочку вплоть до корня.
Чтобы проиллюстрировать другой способ, цепочка должна выглядеть следующим образом:
1) VeriSign Class 3 Public Primary Certification Authority - G5 (root)
^
| signed by
|
2) VeriSign Class 3 Secure Server CA - G3 (intermediate)
^
| signed by
|
3) eservices3.bus.att.com (server)
- корень (1) находится в
cacerts
- ок - сертификат сервера(3) представлен во время рукопожатия SSL - хорошо
- , но: Java не знает промежуточного (2) - поэтому не может проверить сквозную цепочку
Чтобы это исправить, вы можете:
- попросить AT & T исправить сервер, чтобы он отправлял серверу и промежуточный сертификат во время рукопожатия, или
- импорт промежуточного сертификата в хранилище ключей Java
Первое решение предпочтительнее, так как оно помогает всем (не только вам) и немного менее рискованно (вы можете не заметить, если промежуточноесертификат был скомпрометирован).
Если вы хотите импортировать сертификат,В качестве временной меры, возьмите ее со страниц поддержки VeriSign (это «Сертификат вторичного промежуточного сертификата SSL»), затем:
simon@lucifer:~$ keytool -importcert -alias some_alias_of_your_choosing \
-file intermediate_cert_path.crt \
-keystore your_cacerts_path
Enter keystore password: *****
Certificate was added to keystore
Чтобы удалить сертификат (как только AT & T соберутся вместе):
simon@lucifer:~$ keytool -delete -alias same_alias_as_before \
-keystore your_cacerts_path