Frequentemente escrevo um código para realizar requisições entre aplicativos, seja para WS/REST ou mesmo um simples HttpClient, usando
Https com Java. Como fazer uma requisição SSL sem registrar o
certificado na JVM, ou mesmo um 'bypass' em certificado desconhecido?
Aqui deixo um exemplo de como realizar um requisição Https com Java ignorando o certificado. Usando
X509TrustManager [
mais sobre X509Certificate] e
HostnameVerifier de fachada. Na verdade o uso do HostnameVerifier seria pra evitar
java.io.IOException: HTTPS hostname wrong: should be ..., já que o nome do certificado não bate com o domínio.
package br.com.yaw.client.ssl.main;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
//...
public class TestSecureRequest {
public static void main(String[] args) throws Exception {
final X509TrustManager cert = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs,
String authType)
throws java.security.cert.CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs,
String authType)
throws java.security.cert.CertificateException {
return;
}
};
//cria socket ssl
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { cert }, null);
//ativa o socket para a requisicao
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
final HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
// daqui pra frente o codigo que acionar WS/REST, ou um simples HttpClient
//...
}
}
Peace of cake.
@edermag
http://www.yaw.com.br/