Verificación del certificado SSL: javax.net.ssl.SSLHandshakeException
Estoy tratando de llamar a una API HTTPS REST a través deJersey Client
. Y en el curso del desarrollo me tropiezo con el siguiente error:
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503)
at com.lftechnology.sbworkbench.utility.utils.PingFederateUtility.main(PingFederateUtility.java:32)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
Así que busqué en Google un poco y encontré toneladas de solución, lo que realmente funciona.
HTTPS con Jersey Clienthttps://gist.github.com/outbounder/1069465¿Cómo solucionar el error "java.security.cert.CertificateException: no hay nombres alternativos de sujeto presentes"?http://www.mkyong.com/webservices/jax-ws/java-security-cert-certificateexception-no-name-matching-localhost-found/http://java.globinch.com/enterprise-java/security/fix-java-security-certificate-exception-no-matching-localhost-found/Están en un dominio diferente pero tienen una solución común para resolverlo.
GuiónActualmente estoy usando un certificado autofirmado autofirmado en el entorno de desarrollo. Y por lo tanto, está obligado a mostrar el problema.
PreguntaLa solución mencionada anteriormente se centra en omitir / permitir que se verifiquen todos los certificados.
Pero cuando lo muevo al entorno de producción, entonces tengo acceso al Certificado firmado válido de una fuente confiable.
Entonces, ¿son útiles estas soluciones cuando me muevo a la producción?¿Está bien omitir la verificación SSL?¿Cuáles son las otras formas alternativas de lograr una solución común para el entorno de desarrollo y producción?PD
La solución que usé fue,
try
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
con el que luego cooperoJersey
para que funcione Y está funcionando muy bien.
Entonces elQuestion
de nuevo.¿Es esta solución viable para ser utilizada en el entorno de producción? Sin embargo, no desea modificar las entidades que regresan, es mucho mejor buscar las entidades en modo de solo lectura. Esto permitirá que Hibernate descarte el estado desconectado asociado que utiliza el mecanismo de verificación sucio para detectar modificaciones del estado de la entidad. Más, las entidades de solo lectura se omiten durante el vaciado.