java.net.SocketException: Software verursacht connection abort: recv failed bei unterschiedlichen jre-Sicherheit
Ich bin immer folgende exception beim Versuch, eine Verbindung zu einem web service mittels HttpsURLConnection läuft auf einem host im selben Netzwerk.Firewall ist aus. Interessant daran ist, dass wenn ich den folgenden code ausführen, durch meine Standard-java-JRE 1.7-Umgebung in eclipse funktioniert alles einwandfrei.
Aber wenn ich diese Funktionen in einem Produkt-code, der seine eigene jre-Ordner, wird die folgende Ausnahme -
Caused by: java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:173)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at com.rsa.sslj.x.aP.c(Unknown Source)
at com.rsa.sslj.x.aP.a(Unknown Source)
at com.rsa.sslj.x.aP.a(Unknown Source)
at com.rsa.sslj.x.aP.h(Unknown Source)
at com.rsa.sslj.x.cy.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
Bemerkte ich, dass die Liste der security-Anbieter unterscheidet sich in der java.Sicherheit Datei.
Hier die Liste -
security.provider.1=com.rsa.jsafe.provider.JsafeJCE
security.provider.2=com.rsa.jsse.JsseProvider
security.provider.3=sun.security.provider.Sun
security.provider.4=sun.security.rsa.SunRsaSign
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC
security.provider.11=sun.security.mscapi.SunMSCAPI
Diese sind meine Funktionen -
private InputStream Get(URL url,String keyStoreString, String keyStorePassword) {
SSLSocketFactory sslFactory;
try {
sslFactory = getSSLSocketFactory(keyStoreString, keyStorePassword);
javax.net.ssl.HttpsURLConnection
.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname,
javax.net.ssl.SSLSession sslSession) {
if (hostname.equals("vmm")) {
return true;
}
return false;
}
});
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(sslFactory);
con.setRequestMethod("GET");
con.setRequestProperty("Accept", "application/json");
InputStream responseStream = con.getInputStream();
return responseStream;
}catch (Exception e) {
//log errer
}
}
private SSLSocketFactory getSSLSocketFactory(String keyStoreString,
String password) throws KeyStoreException,
NoSuchAlgorithmException, CertificateException, IOException,
UnrecoverableKeyException, KeyManagementException, AzureException {
KeyStore ks = getKeyStore(keyStoreString, password);
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance("SunX509");
keyManagerFactory.init(ks, password.toCharArray());
//Trustmanager which trusts all certificate. Not a good idea in
//production code.
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(final X509Certificate[] chain,
final String authType) {
}
@Override
public void checkServerTrusted(final X509Certificate[] chain,
final String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} };
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(), trustAllCerts,
new SecureRandom());
return context.getSocketFactory();
}
Ich brauche, um diese Funktionen arbeiten in dem Produkt-code. Jede Hilfe wird geschätzt. Vielen Dank im Voraus !!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist möglich, dass Sie versuchen, eine
SunX509
KeyManagerFactory
könnte zu Verwirrung führen, mit anderen Werken hinter den kulissen, wenn das RSA-Jsafe hat eine höhere Priorität als die Sonne-Anbieter.Wenn RSA Jsafe-bietet seine eigenen KeyManagerFactory Umsetzung, vielleicht versuchen Sie es mit:
(Es sei denn, Sie wirklich wollen, SunX509 KMF, unter Verwendung der Standard-Algorithmus in Ihre Ursache ist in der Regel die bessere Wahl, um nicht angewiesen zu sein auf spezifische Anbieter. Gleiche für TrustManagerFactories, wenn zutreffend.)
Ich explizit den Anbietern für KeyManagerFactory und SSLContext zu 'SunJSSE' und es funktionierte !!