Компания GoDaddy SSL-сертификат не работает с Java


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's urged you upgrade your JRE/JDK to the latest Java 8 update to resolve this issue.

обновление 11/29/2014 -- это все еще проблема, и Godaddy, похоже, не заботится и ничего не будет с этим делать. Есть пост в блоге здесь Godaddy VP продуктов безопасности от нескольких месяцев назад говорит, что исправление было на пути и обеспечило временную работу, но на сегодняшний день ничего не изменилось. Важно отметить, что сервер G2 CA Godaddy существует уже как минимум 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: ra@godaddy.com

обновление 9/17/2014 -- это все еще проблема, и Godaddy, похоже, не заботится и ничего не будет делать с этим. Наступит ноябрь, когда 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: я просто посмотрел в своей панели управления Windows 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 все еще выдает то же исключение о пути сертификата и т. д. Таким образом, похоже, что цепочка сертификатов G2 по умолчанию еще не доверена в хранилище ключей java 7 по умолчанию.

FINAL UPDATE FOR COMPLETENESS @ 1/14/2014

так же, как обновление - это действительно проблема GoDaddy (у меня были длинные письма поддержки с ними). У них есть 2 сервера 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 как получить сертификат, подписанный Class 2 CA сервер. Rekeying является бесплатным для клиентов GoDaddy, пока ваш сертификат не истечет (очевидно).

10 56

10 ответов:

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's urged you upgrade your JRE/JDK to the latest Java 8 update to resolve this issue.

обновление 11/29/2014 -- это все еще проблема, и Godaddy, похоже, не заботится и ничего не будет с этим делать. Есть пост в блоге[here][1]Godaddy VP продуктов безопасности от нескольких месяцев назад говорит, что исправление было на пути и обеспечило временную работу, но на сегодняшний день ничего не изменилось. Важно отметить, что сервер G2 CA Godaddy существует уже как минимум 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: ra@godaddy.com

обновление 9/17/2014 -- это все еще проблема, и Godaddy, похоже, не заботится и ничего не будет с этим делать. Приходите в ноябре, когда Google осуждает все Сертификаты SHA-1, это станет серьезной проблемой. Я очень рекомендую всем, кто может связаться с Godaddy и указать их здесь.

~~~~

мой первоначальный пост / вопрос касался того, почему моя цепь не работает. Стало очевидно, что у меня была плохая настройка (которая была быстро исправлена с некоторыми советами от @Bruno и других - спасибо). Однако, когда моя исправленная цепочка все еще не работала с Java, стало очевидно, что существует гораздо большая проблема. Это заняло некоторое время, но проблема в том вообще - то с Годэдди.

это на самом деле действительно проблема GoDaddy (у меня были длительные письма поддержки с ними).

у них есть 2 сервера CA, один называется Class 2 CA и G2 CA. Их Class 2 CA знаки SHA-1 сертификаты, в то время как G2 CA подписывает все свои SHA-2 сертификаты.

в этом и заключается проблема-GoDaddy не добавил свои новые G2 CA сервер по умолчанию Java truststore/keystore - вызывая установки Java по умолчанию не доверяйте его авторитету, и, следовательно, не доверяет вашему цепному сертификату.

работа вокруг, пока GoDaddy не добавит G2 CA сервер по умолчанию truststore / keystore-это просто повторный ключ вашего сертификата с помощью SHA-1 как получить сертификат, подписанный Class 2 CA сервер. Rekeying является бесплатным для клиентов GoDaddy, пока ваш сертификат не истечет (очевидно).

после SHA-1 сертификат, подписанный Class 2 CA сервер, ваша цепочка доверия должна работать так, как ожидалось, и нет пользовательских требуется импорт и/или настройка truststore/keystore.

это не делает меня счастливым, что я должен использовать" более слабый " сертификат, чтобы заставить его работать должным образом, и обсуждения с GoDaddy через поддержку электронной почты до сих пор указали, что у них нет текущих планов добавить G2 CA сервер в хранилище доверенных ключей по умолчанию. Я думаю, пока они не добавят его, убедитесь, что вы получите SHA-1Class 2 CA сервер подписал сертификат, если вы планируете работать с Java.

ответы Мистера фиксера и Уэйна Тайера были опущены, но они на самом деле выступают за правильные обходные пути. На самом деле, Уэйн Тайер возглавляет SSL-бизнес GoDaddy, поэтому он, вероятно, знает. Вы должны установить сертификат "GoDaddy G1 to G2 Cross" в цепочке сертификатов вместе с промежуточным сертификатом.

понижение до SHA1 не является идеальным вариантом, так как он устарел и заставит вас больше работать в будущем. К счастью, GoDaddy предоставил сертификат кроссовера, который решает эту проблему. Они опубликовали инструкции, которые Уэйн продублировал, и они похоронены в комментариях здесь.

Я лично протестировал это решение с сертификатом SHA2, и он хорошо работает. Это гораздо лучшее решение по сравнению с повторным вводом и понижением до SHA1. Когда SHA2 станет обязательным, эта опция все равно не будет доступна, и там все еще могут быть Java toolchains без нового сертификата.

по данным Поддержка GoDaddy, по состоянию на июль 2014 года, правильный корневой сертификат был включен в последние версии Java 8, а в сентябре 2014 года, Уэйн Тайер из GoDaddy сказали что сертификат "планируется добавить в Java в ближайшие несколько месяцев". Я проверил файл cacerts в Java 8 для Mac OS скачать здесь, и он действительно содержит корневой сертификат SHA2.

Так что вместо вашей цепи выглядит так:

  • Go Daddy Root Certificate Authority-G2: (SHA-2) – Hash 47 BE AB C9 22 EA E8 0e 78 78 34 62 A7 9F 45 C2 54 FD E6 8B. это корневой сертификат, встроенный в некоторые системы (например, Chrome). SnakeDoc утверждает, что"он не встроен в Java, Windows CE, Microsoft Exchange и другие платформы".
  • Go Daddy Secure Certificate Authority-G2: (SHA-2) – Hash 27 AC 93 69 FA F2 52 07 BB 26 27 CE FA CC BE 4E F9 C3 19 B8
  • Ваш сертификат SHA2

Это должно выглядеть так:

  • Go Daddy Class 2 Certification Authority: (SHA – 1) - Hash 27 96 BA E6 3F 18 01 E2 77 26 1B A0 D7 77 70 02 8F 20 EE E4. Это старый корневой сертификат, встроенный в большинство систем, включая java.
  • Go Daddy Root Certificate Authority-G2: (SHA-2) – Hash 34 0B 28 80 F4 46 FC C0 4E 59 ED 33 F5 2B 3D 08 D6 24 29 64. Это так называемый"крестовый сертификат GoDaddy G1 to G2".
  • Go Папа Безопасный Сертификат Authority-G2: (SHA-2) - Hash 27 AC 93 69 FA F2 52 07 BB 26 27 CE FA CC BE 4E F9 C3 19 B8
  • Ваш сертификат SHA-2

см. также-мой пост в блоге, обобщающий эту проблему с обходными путями.

чтобы получить сертификаты Godaddy для работы на Java с SHA2, вам нужно будет использовать их перекрестный сертификат в вашей цепочке, чтобы связать корень G2(SHA2) с корнем G1(SHA1), пока Java не решит обновить свой репозиторий. Пакет перекрестных сертификатов можно скачать здесь:

https://certs.godaddy.com/anonymous/repository.pki

GoDaddy Certificate Bundles-G2 с крестом на G1, включает в себя Root

[gd_bundle-g2-g1.crt][1] 

г-н Fixer-это правильно. Установите сертификат "GoDaddy G1 to G2 Cross" в файле пакета сертификатов вместе с промежуточным сертификатом. Это позволяет сертификатам GoDaddy SHA-2 доверять любому клиенту, который распознает корни SHA-1, включая Java. Вы можете получить этот файл отhttps://certs.godaddy.com/repository Как только это будет установлено, Java построит цепочку сертификатов от вашего сертификата до " GoDaddy Secure Server Certificate (промежуточный сертификат)" к "крестовому сертификату GoDaddy G1 to G2" к корню GoDaddy SHA-1. Вы также можете найти файл пакета, содержащий перекрестный сертификат в нашем репозитории. Последнее замечание по этому параметру: подписи на корневых сертификатах не проверяются, поэтому, даже если вы полагаетесь на корень SHA-1, это так же безопасно, как и полная цепочка сертификатов SHA-2.

следующие комментарии и вывод openssl s_client -connect the.server.name:587 -starttls smtp.

в цепочке сертификатов сертификат n должен быть выдан сертификатом n+1 в списке: эмитент (i) сертификата n должен быть субъектом (АМИ) сертификата n+1.

 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

здесь, верняк 0 выдаваемого сертификата 1 (отлично), выдается сертификат 1 сертификат 2 (штраф), 2 сертификат является самоподписанным (тоже все в порядке, это корневой центр сертификации).

однако сертификат 2 не выдается сертификатом 3. Сертификат 3 неуместен (и, вероятно, такой же, как сертификат 1). Это вполне вероятно чтобы вызвать проблемы, так как это делает цепочку недействительной.

вы должны по крайней мере удалить сертификат 3 от конфигурации. Кроме того, вы также можете удалить cert 2, поскольку наличие корневого CAs не обязательно (в любом случае это зависит от клиента).

похоже, что ваш почтовый сервер не подписан Go Daddy Class 2 Certification Authority, но фактически подписывается одним из их промежуточных центров сертификации. Вам нужно будет проверить это для себя. Предполагая, что это так...

теоретически ваше программное обеспечение должно работать - поскольку промежуточный сертификат подписан центром сертификации класса 2, и у вас есть центр сертификации класса 2 в хранилище сертификатов JDK по умолчанию. Однако, я обнаружил, что он просто не работает, если вы также добавить промежуточный сертификат в хранилище сертификатов. Вот ссылка на сообщение в блоге, описывающее подобный опыт:

http://drcs.ca/blog/adding-godaddy-intermediate-certificates-to-java-jdk/

вот прямая ссылка на более GoDaddy промежуточные сертификаты: https://certs.godaddy.com/anonymous/repository.pki

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

[обновление]

is there a way to do this programmically?

может быть. Зависит от того, что вы хотите сделать. Я использовал java.security.KeyStore класс для автоматического обновления частного хранилища ключей непосредственно из кода Java без использования keytool. Это концептуально просто-загрузите хранилище ключей из файла, прочитайте новый сертификат, добавьте его в хранилище ключей, а затем выпишите хранилище ключей в новый файл. Однако это займет некоторое время, чтобы получить детали правильно и оно не может быть стоит просто импортировать один сертификат.

тем не менее, интересно попробовать. Оформить заказ Хранилище Документации и по load,store и setCertificateEntry методы.

В " Панели Управления Java "я только что добавил корневой сертификат GD в" безопасный сайт CA", и у меня больше нет ошибки сертификата при использовании Java. Сертификат, который я добавил, был: Go Daddy Class 2 Certification Authority Root Certificate-G2

Если вы импортируете пакет de GoDady G2 в хранилище ключей java, это решает проблему:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
wget https://certs.godaddy.com/repository/gd_bundle-g2.crt
$JAVA_HOME/bin/keytool -import -alias root -file ./gd_bundle-g2.crt -storepass changeit -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts

Update - this "solution" is no longer valid (see my above accepted answer) - keeping this answer because it did help alleviate the problem so long as the side-effects are tolerable.

Ок, я нашел обходной путь для моего случая.

props.put("mail.smtp.ssl.trust", "smtp.somecompany.com");

я добавил Это к моей конструкции сессии, и теперь он работает. Это обходной путь, а не исправление imho, так как я до сих пор не знаю, почему мой сертификат SSL Godaddy не является доверенным по умолчанию... это не самозаверяющий сертификат.

кто-нибудь, пожалуйста, не стесняйтесь перезвонить, как я действительно хотел бы понять эту проблему.

Если вы используете ниже свойства при отправке почты, а затем прокомментировать его. Это работает для меня. Но это может вызвать проблемы с безопасностью.

props.put("mail.smtp.starttls.enable","true");