UPDATE 1/26/2015 -- It appears the most recent JRE/JDK for Java 8 (update >= 31) and JRE/JDK for Java 7 now include the Godaddy G2 CA server in the default trust store. If possible, it urged you upgrade your JRE/JDK to the latest Java 8 update to resolve this issue.
ОБНОВЛЕНИЕ 11/29/2014 - Это все еще проблема, и Годадди, похоже, не заботится и ничего не сделает с этим. Здесь есть блог от Godaddy VP of Security Products от нескольких месяцев назад, говоря, что исправление было на нем и обеспечило временную работу, но на сегодняшний день ничего не изменилось. Важно отметить, что сервер Godaddy G2 CA существует около 5 лет, и в то время Godaddy не предпринял правильных шагов для решения этой известной проблемы. Обходное предложение - это просто обход, а не решение. Пользователи сторонних служб имеют нулевой контроль над тем, как сертификат установлен на сервере.
It seems users should avoid purchasing Godaddy SSL certs until they get serious about being a CA.
Вот их контактная информация по команде SSL, если вы хотите позвонить:
GoDaddy SSL Team Support Number: 1-480-505-8852 -- Email: [email protected]
ОБНОВЛЕНИЕ 9/17/2014 - Это все еще проблема, и Годадди, похоже, не заботится и ничего не сделает с этим. Приходите в ноябре, когда Google обесценивает все сертификаты SHA-1, это станет серьезной проблемой. Я очень рекомендую всем, кто может связаться с Godaddy и указать их здесь.
~
tl;dr; - final update with current solution/workaround at the bottom of this post (it is a GoDaddy problem and there is a workaround until they fix it)
У меня есть почтовый сервер, с которого я пытаюсь отправить почту через свое приложение Java. Я могу успешно отправить порт 25, поэтому я знаю, что работает код и все, но 25 не является зашифрованным сеансом. Мне нужно использовать TLS на порту 587, для которого требуется сертификат SSL. У меня есть действующий SSL-сертификат на сервере, который подписан GoDaddy G2 CA и уже давно работает (без проблем).
Моя проблема, я получаю знаменитое сообщение об ошибке PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
при попытке подключения и отправки почты на 587.
Из моего понимания многих ссылок SO, а также обычного google-fu, это обычно происходит, когда Java не доверяет сертификату или CA - как это обычно бывает для самозаверяющего сертификата. Я использовал несколько онлайн-сертификатов SSL Cert, чтобы убедиться, что цепь действительна и т.д. Все выглядит нормально... но java не будет использовать сертификат автоматически.
Я знаю, что есть файл класса где-то от Sun, который будет загружать и устанавливать сертификат в локальном хранилище ключей, чтобы java доверял ему... но это не только нецелесообразно для приложения, которое будет развернуто для нескольких систем, но это просто глупо для подписанного сертификата Godaddy.
Что происходит? Как я могу заставить java использовать действительный сертификат на сервере, не делая java принимать все сертификаты?
EDIT: Я просто посмотрел в свои окна Панель управления Java (стандартная установка jdk 7) и, конечно же, в разделе Signer CA
перечислено сообщение: The Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority
... так что дает? Мой сертификат - сертификат Godaddy...
UPDATE --
Здесь цепочка сертификатов, как видно из команды openssl, рекомендуется в комментариях:
~]# openssl s_client -connect smtp.somecompany.com:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
0 s:/OU=Domain Control Validated/CN=smtp.somecompany.com
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/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
3 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
---
С уважением, я думаю...
UPDATE 2 --
Хорошо, благодаря @Bruno мне удалось определить, что моя цепочка была испорчена - я снова подключил сервер, и теперь моя цепочка выглядит как таковая:
~]# openssl s_client -connect smtp.somecompany.com:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
0 s:/OU=Domain Control Validated/CN=smtp.somecompany.com
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/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
---
Что выглядит лучше, чем раньше. - Java по-прежнему вызывает одно и то же исключение в отношении пути cert и т.д. Таким образом, похоже, что цепочка сертификатов G2 по умолчанию не доверена в хранилище ключей java 7 по умолчанию.
FINAL UPDATE FOR COMPLETENESS @ 1/14/2014
Так же, как и обновление - это действительно проблема GoDaddy (у меня были длинные письма поддержки с ними). У них есть два сервера CA, один из которых называется Class 2 CA
, а другой - G2 CA
. Их Class 2 CA
подписывает все сертификаты SHA-1
, а G2 CA
подписывает все свои сертификаты SHA-2
. В этом проблема кроется - GoDaddy не добавила свой новый сервер G2 CA
в доверительное хранилище java по умолчанию, из-за чего установки java по умолчанию не доверяют ему полномочия и, следовательно, не доверяют вашему цепоченному сертификату. Обход, пока GoDaddy не добавит сервер G2 CA
в доверительный магазин по умолчанию, просто попросит ваш сертификат, используя SHA-1
as, чтобы получить сертификат, подписанный сервером Class 2 CA
. Rekeying бесплатно для клиентов GoDaddy до истечения срока действия вашего сертификата (очевидно).