2017-06-12 1 views
0

Ich benutze Apache httpclient 4.5.3 und Apache httpcore 4.4.6. Ich muss ein SOAP WS aufrufen, indem ich einen POST-AufrufApache httpclient pfx Datei

Sie gaben mir ein PFX-Zertifikat. Ich habe es in der SOAP-Benutzeroberfläche verwendet, indem ich die SOAP-Benutzeroberfläche konfiguriert habe, und alles funktioniert ziemlich gut. Ich kann das WS aufrufen und es gibt mir eine Antwort. Also das Zertifikat ist gültig

Jetzt versuche ich Apache httpclient in der gleichen Sache zu konfigurieren. Hier der Code, den ich schrieb:

Durch das Ausprobieren dieses Codes kann ich nicht erfolgreich den WS aufrufen. Ich bin sicher, ich vermisse etwas, aber ich kann nicht finden, was mir fehlt

Kann mir jemand vorschlagen, wie ich vorgehen?

Danke Angelo

Antwort

0

Ich dachte, was ich fehlte. Ich poste meine Lösung hier hoffend, dass es nützlich sein kann

Grundsätzlich war ich falsch, weil ich nicht sorgfältig den SSLContext konfigurierte ich musste es sorgfältig konfigurieren.

Das ist, was ich schrieb:

KeyStore clientStore = KeyStore.getInstance("PKCS12"); 
InputStream instream = Thread.currentThread().getContextClassLoader().getResourceAsStream(keystoreName); 
try { 
    clientStore.load(instream, keyStorePwd.toCharArray()); 
} finally { 
    instream.close(); 
} 
//Trust everybody 
X509TrustManager tm = new X509TrustManager() { 
    @Override 
    public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws CertificateException {} 
    @Override 
    public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws CertificateException {} 
    @Override 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;} 
}; 
SSLContext sslCtx = SSLContext.getInstance("TLS"); 
KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmfactory.init(clientStore, keyStorePwd != null ? keyStorePwd.toCharArray() : null); 
KeyManager[] keymanagers = kmfactory.getKeyManagers(); 
sslCtx.init(keymanagers, new TrustManager[]{tm}, null); 
SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(sslCtx); 
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", sslConnectionFactory).register("http", new PlainConnectionSocketFactory()).build(); 
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(registry); 
HttpClientBuilder hcb = HttpClientBuilder.create(); 
hcb.setConnectionManager(pcm); 
CloseableHttpClient httpClient = hcb.build(); 

Jetzt funktioniert alles Sie ziemlich gut

Angelo

danken
Verwandte Themen