O certificado SSL GoDaddy não funciona com 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.

atualização 11/29/2014-este ainda é um problema, e Godaddy parece não se importar nem vai fazer nada sobre isso. Há um post no blog aqui por Godaddy VP de produtos de segurança de vários meses atrás dizendo que uma correção estava em seu caminho e forneceu um trabalho temporário, mas a partir de hoje nada mudou. É importante notar que o servidor G2 CA de Godaddy tem sido em torno de um mínimo de 5 anos, e nesse tempo Godaddy não tomou as medidas adequadas para resolva esta questão conhecida. O work-around fornecido é apenas isso, um work-around, Não uma solução. Os usuários de serviços de terceiros têm controle zero sobre como o cert é instalado no servidor.

It seems users should avoid purchasing Godaddy SSL certs until they get serious about being a CA.

Aqui estão os dados de contacto da equipa SSL, Se quiser ligar.

GoDaddy SSL Team Support Number: 1-480-505-8852 -- Email: [email protected]

atualização 9/17/2014-este ainda é um problema, e Godaddy parece não se importar nem vai fazer nada sobre isso. Em novembro, quando o Google desacreditar todas as certs SHA-1, isto vai tornar-se questao. Recomendo vivamente qualquer pessoa que possa contactar Godaddy e apontá-los para aqui.

~

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)

Tenho um servidor de E-mail que estou a tentar enviar do meu aplicativo Java. Eu posso enviar na porta 25 com sucesso para que eu sei que o código funciona e tudo, mas 25 não é Sessão criptografada. Preciso de usar o TLS na porta 587, que requer um certificado SSL. Eu tenho um certificado SSL válido no servidor que é assinado por GoDaddy G2 CA e está em vigor por um tempo agora (sem problemas).

O meu problema é que estou a receber a famosa mensagem de erro ao tentar ligar-me e enviar correio no 587.

pelo meu entendimento de muitos links assim como o google-fu normal, isso geralmente é causado quando Java não confia no cert ou CA -- como é comum para um cert autossignado. Eu usei várias das checkers SSL Cert online para ter certeza de que a cadeia é válida, etc. Tudo parece ser normal... mas java não vai usar o cert automaticamente.

eu sei que há um class file somewhere from Sun that will download and setup the cert in the local keystore so java will trust it... mas isso não é apenas impraticável para um aplicativo que será implantado em vários sistemas, mas é apenas bobo para um GoDaddy assinado cert.

O que se passa? Como posso fazer o java usar o certificado válido no servidor sem ter de fazer o java aceitar todos os certificados?

editar: acabei de ver o meu painel de controlo Windows Java (instalação predefinida do jdk 7) e com certeza suficiente, na rubrica Signer CA consta a lista emitida por: The Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority... então, o que se passa? A minha certeza é uma certeza Godaddy...

UPDATE --

Aqui está a cadeia de cert tal como Vista do comando openssl recomendado nos comentários:

~]# 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
---
A mim parece-me bem...

UPDATE 2 --

OK, graças a @ Bruno fui capaz de determinar que a minha corrente estava estragada -- eu re-riscei o servidor e agora a minha corrente aparece como tal:

 ~]# 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
---
O que parece melhor do que antes. -- Java ainda abre a mesma excepção. sobre o caminho do cert, etc. Então parece que a cadeia de certs G2 não é, por padrão, confiável ainda no teclado padrão java 7.

FINAL UPDATE FOR COMPLETENESS @ 1/14/2014

apenas como uma atualização - este é realmente um problema GoDaddy (eu tive longos e-mails de suporte com eles). Eles têm 2 servidores CA, um chamado Class 2 CA e o outro chamado G2 CA. O seu Class 2 CA assina todos os certificados SHA-1, enquanto o G2 CA assina todos os seus certificados SHA-2. É aqui que reside o problema - GoDaddy não adicionou seus novos G2 CA servidor para o padrão Java truststore-fazendo com que as instalações padrão java não confiem na sua autoridade, e, portanto, não confia no seu certificado acorrentado. O trabalho até que GoDaddy adicione o servidor G2 CA à loja de confiança por omissão é simplesmente reiniciar o seu certificado usando SHA-1 as-para obter um certificado assinado pelo servidor Class 2 CA. Rekeying é gratuito para os clientes GoDaddy até que o seu certificado expire (obviamente).

Author: SnakeDoc, 2013-09-11

10 answers

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.

Atualização 11/29/2014-este ainda é um problema, e Godaddy parece não se importar nem vai fazer nada sobre isso. Há um post no blog[here][1]de Godaddy VP de produtos de segurança de vários meses atrás dizendo que uma correção estava em seu caminho e forneceu um trabalho temporário, mas a partir de hoje nada mudou. É importante notar que o servidor G2 CA de Godaddy tem sido em torno de um mínimo de 5 anos, e naquele tempo Godaddy não tomou as medidas adequadas para resolver este problema. O work-around fornecido é apenas isso, um work-around, Não uma solução. Os usuários de serviços de terceiros têm controle zero sobre como o cert é instalado no servidor.

It seems users should avoid purchasing Godaddy SSL certs until they get serious about being a CA.

Aqui estão os dados de contacto da equipa SSL, Se quiser ligar.

GoDaddy SSL Team Support Number: 1-480-505-8852 -- Email: [email protected]

Atualização 9/17/2014-este ainda é um problema, e Godaddy parece não se importar nem vai fazer nada sobre isso. Em novembro, quando o Google desacreditar todas as certs SHA-1, isso se tornará um grande problema. Recomendo vivamente qualquer pessoa que possa contactar Godaddy e apontá-los para aqui.

~~~~

A minha pergunta inicial era sobre o porquê da minha cadeia não estar a funcionar. Tornou - se óbvio que eu tinha uma má configuração (que foi rapidamente corrigido com alguns conselhos de @Bruno e outros-obrigado). No entanto, quando minha cadeia corrigida ainda não funcionou com Java, tornou-se evidente que havia um problema muito maior espreitando. Demorou um pouco, mas o problema é com GoDaddy.

Na verdade, isto ... é realmente um problema GoDaddy (eu tive longos e-mails de apoio com eles).

Eles têm 2 servidores CA, um chamado Class 2 CA e o outro chamado G2 CA. Os seus Class 2 CA assinam todos os certificados SHA-1, enquanto os G2 CA assinam todos os seus SHA-2 certificados.

É aqui que reside o problema - GoDaddy não adicionou o seu novo servidor G2 CA ao padrão Java truststore/keystore - fazendo com que as instalações Java padrão não confiem na sua autoridade, e, portanto, não confia no seu certificado acorrentado.

O trabalho até que GoDaddy adicione o servidor G2 CA à estrutura/teclado predefinida é simplesmente reiniciar o seu certificado usando SHA-1 as-para obter um certificado assinado pelo servidor Class 2 CA. Rekeying é gratuito para os clientes GoDaddy até que o seu certificado expire (obviamente).

Uma vez que tenha um certificado assinado pelo servidor Class 2 CA, a sua cadeia de confiança deve funcionar como esperado e não são necessárias importações e/ou configuração personalizadas da truststore/keystore.

Não me faz feliz ter de usar um cert mais fraco, a fim de fazê-lo funcionar corretamente, e discussões com GoDaddy via e-mail suporte até agora indicaram que eles não têm planos atuais para adicionar o servidor G2 CA para a confiança padrão/keystore. Acho que até o adicionarem, certifica-te que tens um SHA-1 Class 2 CA o servidor assinou o certificado se você planeja trabalhar com o Java.
 44
Author: SnakeDoc, 2015-01-27 18:15:08
As respostas do Sr. Fixer e do Wayne Thayer foram votadas em baixa, mas, na verdade, estão a defender o trabalho correcto. Na verdade, Wayne Thayer lidera o negócio da SSL de GoDaddy, por isso provavelmente sabe. Você deve instalar o certificado "GoDaddy G1 a G2 Cross" em sua cadeia de certificados, juntamente com o certificado intermediário. A desclassificação para SHA1 não é uma opção ideal, uma vez que está a ser depreciada e irá causar-lhe mais trabalho no futuro. Felizmente, GoDaddy forneceu um certificado crossover que resolve este problema. Eles postaram instruções, que Wayne duplicou, e eles estão enterrados nos comentários aqui . Testei pessoalmente esta solução com um certificado SHA2, e funciona bem. É uma solução muito superior contra re-keying e downgrading para SHA1. Quando o SHA2 se tornar necessário, esta opção não estará disponível de qualquer forma, e ainda poderá haver ferramentas Java por aí sem o novo certificado. De acordo com o apoio de GoDaddy, de julho de 2014, o certificado raiz correto foi incluído nas versões mais recentes do Java 8, e em setembro de 2014, Wayne Thayer da GoDaddy também disse: que o certificado "está agendado para ser adicionado ao Java nos próximos meses". Verifiquei o ficheiro cacerts no Java 8 para o Mac OS obtido a partir daqui , e ele contém de facto o certificado de raiz SHA2. Então, em vez da tua corrente parecer assim ...
    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. este é o certificado de raiz que está incorporado em alguns sistemas (por exemplo, cromo). SnakeDoc afirma que"não é construído em Java, Windows CE, Microsoft Exchange, e mais plataformas".
  • 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
  • o seu certificado de SHA2

Deve ser assim:

    Vai, Papá Classe 2. Autoridade de certificação: (SHA-1) – Hash 27 96 BA E6 3F 18 01 E2 77 26 1B A0 D7 77 70 02 8F 20 EE E4. Este é o antigo certificado root que está incorporado na maioria dos sistemas, incluindo 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. Este é o chamado "GoDaddy G1 to G2 Cross Certificate".
  • 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
  • o seu certificado SHA-2

Veja também-meu post no blog sumarizando este problema com work-arounds.

 19
Author: Isaac Potoczny-Jones, 2014-11-29 23:36:06

Para que os certificados Godaddy funcionem em Java com o SHA2, terá de usar o seu certificado cruz na sua cadeia para acorrentar a raiz G2(SHA2) à raiz G1(SHA1) até que o Java decida actualizar o seu repositório. O pacote de certificados cruzados pode ser obtido aqui:

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

Pacotes de certificados GoDaddy-G2 Com Cruz para G1, inclui Root

[gd_bundle-g2-g1.crt][1] 
 13
Author: Mr. Fixer, 2014-09-19 01:02:05
O Sr. Fixer tem razão. Instale o certificado "GoDaddy G1 to G2 Cross" no seu ficheiro de pacote de certificados juntamente com o certificado intermédio. Isto permite que certificados SHA-2 de GoDaddy sejam confiados por qualquer cliente que reconheça as raízes SHA-1, incluindo Java. Você pode obter este arquivo de https://certs.godaddy.com/repository Assim que isto estiver instalado, o Java irá criar uma cadeia de certificados do seu certificado para o "certificado do servidor seguro GoDaddy (certificado intermédio)" para o "GoDaddy G1 to G2 Cross Certificate" para a raiz GoDaddy SHA-1. Você também pode encontrar um arquivo de pacote contendo o certificado cross em nosso repositório. Uma última nota sobre esta opção: as assinaturas nos certificados de raiz não estão assinaladas, por isso, mesmo que esteja a confiar numa raiz SHA-1, Esta é tão segura como uma cadeia de certificados SHA-2 completa.
 11
Author: Wayne Thayer, 2014-10-08 00:25:35

A seguir aos comentários e ao resultado de openssl s_client -connect the.server.name:587 -starttls smtp.

Numa cadeia de certificados, o certificado n deve ser emitido pelo certificado n+1 na lista: o emitente (i) do certificado n deve ser o (s) titular (es) do certificado 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

Aqui, o cert 0 é emitido pelo cert 1 (fine), o cert 1 é emitido pelo cert 2 (fine), o cert 2 é autossignado (também fine, esta é a root CA).

No entanto, o cert 2 não é emitido pelo cert 3. Cert 3 é deslocado (e provavelmente o mesmo que cert 1). É provável que isso cause problemas., uma vez que isso torna a corrente inválida.

Deve pelo menos remover o certificado 3 da sua configuração. Além disso, você também pode remover cert 2, uma vez que ter root CAs não é necessário (cabe ao cliente conhecê-lo de qualquer forma).

 4
Author: Bruno, 2013-09-12 17:54:07

Parece que o seu servidor de E-mail não está assinado por {[[[0]}, mas está assinado por uma das suas autoridades intermediárias de certificados. Você terá que verificar isso por si mesmo. Assumindo que seja este o caso...

Em teoria, o seu software deve funcionar-uma vez que o certificado intermédio é assinado pela Autoridade de classe 2 e você tem a Autoridade de classe 2 Na Loja de certificados JDK padrão. No entanto, descobri que não funciona a menos que se adicione também o intermediário certificado para a sua loja de certificados. Aqui está um link para um post de blog descrevendo uma experiência semelhante:

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

Aqui está uma ligação directa com mais certificados intermédios GoDaddy.: https://certs.godaddy.com/anonymous/repository.pki

Não posso aconselhar exactamente qual o certificado que deve adicionar-depende de que AC é usado no seu correio servidor.

[actualização]

is there a way to do this programmically?

Talvez. Depende do que queres fazer. Usei a classe java.security.KeyStore para actualizar automaticamente um teclado privado directamente do código Java sem usar keytool. É conceptualmente simples - carregar o teclado de um arquivo, ler o novo certificado, adicioná-lo ao teclado e, em seguida, escrever o teclado para novo arquivo. No entanto, leva um tempo para obter os detalhes certo e pode não valer a pena o trabalho apenas para importar um único certificado. Ainda assim, é interessante tentar. Checkout KeyStore JavaDoc e ler sobre o load, store e métodos.
 1
Author: Guido Simone, 2013-09-11 18:25:55

No " painel de controlo Java "acabei de adicionar o certificado de raiz GD à" AC do site seguro " e já não tenho o erro cert ao usar Java. O certificado que eu adicionei foi: Go Daddy Classe 2 Certification Authority Root Certificate-G2

 1
Author: lanbrown, 2014-05-25 07:34:32

Se importar o pacote de GoDady G2 para o teclado java, resolve o problema:

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
 1
Author: jpereira, 2016-08-04 15:25:43

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.

Está bem, talvez tenha encontrado uma solução para o meu caso.
props.put("mail.smtp.ssl.trust", "smtp.somecompany.com");
Adicionei isto à construção da minha sessão e agora funciona. Este é um trabalho-around, não um IMHO fix uma vez que eu ainda não sei por que meu GoDaddy SSL cert não é de confiança padrão... não é uma certeza autossuída. Qualquer um, por favor, sinta-se à vontade para participar, pois eu realmente gostaria de entender este problema.
 0
Author: SnakeDoc, 2014-01-14 16:05:23

Se o u estiver a usar as propriedades abaixo ao enviar o correio, então comente-o. Isto funciona comigo. Mas isto pode causar problemas de segurança.

props.put("mail.smtp.starttls.enable","true");
 -2
Author: Prathap BS, 2014-10-22 07:43:29