Estou trabalhando em um tutorial para serviços web REST em www.udemy.com (Java Web Services REST). O exemplo no tutorial dizia que, para ter SSL, precisamos ter uma pasta chamada "trust_store" no projeto eclipse "client" que deve conter um arquivo "key store" (tivemos um projeto "client" para chamar o serviço e projeto "service" que continha o serviço da web REST - 2 projetos no mesmo espaço de trabalho do eclipse, um no cliente e outro no serviço). Para simplificar, eles disseram para copiar "keystore.jks" do servidor de aplicativos glassfish (glassfish \ domínios \ domínio1 \ config \ keystore.jks) que estamos usando e colocá-lo nesta pasta "trust_store" que eles me pediram para criar o projeto do cliente. Isso parece fazer sentido: os certificados autoassinados no servidor ' s key_store corresponderia aos certificados no cliente trust_store. Agora, ao fazer isso, estava recebendo o erro mencionado na postagem original. Pesquisei isso no Google e li que o erro ocorre devido ao arquivo "keystore.jks" no cliente que não contém um certificado confiável / assinado, que o certificado encontrado é autoassinado.
Para manter as coisas claras, deixe-me dizer que, como eu o entendo, o "keystore.jks" contém certificados autoassinados e o arquivo "cacerts.jks" contém certificados de autoridade de certificação (assinados pela autoridade de certificação). O "keystore.jks" é o "keystore" e o "cacerts.jks" é o "armazenamento confiável". Como "Bruno", um comentarista, diz acima, "keystore.jks" é local e "cacerts.jks" é para clientes remotos.
Então, eu disse a mim mesmo: ei, o glassfish também tem o arquivo "cacerts.jks", que é o arquivo trust_store do glassfish. O cacerts.jsk deve conter certificados de CA. E, aparentemente, eu preciso da minha pasta trust_store para conter um arquivo de armazenamento de chaves que tenha pelo menos um certificado de CA. Portanto, tentei colocar o arquivo "cacerts.jks" na pasta "trust_store" que eu havia criado, no meu projeto do cliente, e alterar as propriedades da VM para apontar para "cacerts.jks" em vez de "keystore.jks". Isso se livrou do erro. Acho que tudo o que precisava era de um certificado da CA para funcionar.
Isso pode não ser ideal para produção, ou mesmo para desenvolvimento, além de apenas conseguir algo para funcionar. Por exemplo, você provavelmente poderia usar o comando "keytool" para adicionar certificados da CA ao arquivo "keystore.jks" no cliente. Mas, de qualquer forma, espero que isso pelo menos restrinja os possíveis cenários que poderiam estar acontecendo aqui para causar o erro.
TAMBÉM: minha abordagem parecia útil para o cliente (certificado de servidor adicionado ao cliente trust_store), parece que os comentários acima para resolver a postagem original são úteis para o servidor (certificado de cliente adicionado ao servidor trust_store). Felicidades.
Configuração do projeto Eclipse:
- MyClientProject
- src
- teste
- Biblioteca do sistema JRE
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Snippet do arquivo MyClientProject.java:
static {
// Setup the trustStore location and password
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// comment out below line
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}