java - Got "Unrecognized Windows Sockets error: 0: recv failed" while posting message -
i'm trying post http post via httpclient server client authentication enabled. here code
public class send2remote { private static string sslmode = null; private static string clientkeystore = null; private static string clientstoretype = null; private static string clientstorepw = null; private static string trustkeystore = null; private static string truststoretype = null; private static string truststorepw = null; public send2remote(string sslmode, string clientks, string clientst, string clienttpw, string trustks, string trustst, string trustspw) { sslmode = sslmode; clientkeystore = clientks; clientstoretype = clientst; clientstorepw = clienttpw; trustkeystore = trustks; truststoretype = trustst; truststorepw = trustspw; } private final class x509hostnameverifierimplementation implements x509hostnameverifier { @override public void verify(string host, sslsocket ssl) throws ioexception { } @override public void verify(string host, x509certificate cert) throws sslexception { } @override public void verify(string host, string[] cns, string[] subjectalts) throws sslexception { } @override public boolean verify(string s, sslsession sslsession) { return true; } } public string post(string url, list<namevaluepair> formparams) { sslcontext sslcontext = null; keymanagerfactory kmf = null; trustmanagerfactory tmf = null; keystore ks = null; keystore tks = null; try { sslcontext = sslcontext.getinstance(sslmode); kmf = keymanagerfactory.getinstance(keymanagerfactory.getdefaultalgorithm()); tmf = trustmanagerfactory.getinstance(keymanagerfactory.getdefaultalgorithm()); ks = keystore.getinstance(clientstoretype); tks = keystore.getinstance(truststoretype); ks.load(new fileinputstream(clientkeystore), clientstorepw.tochararray()); tks.load(new fileinputstream(trustkeystore), truststorepw.tochararray()); kmf.init(ks, clientstorepw.tochararray()); tmf.init(tks); sslcontext.init(kmf.getkeymanagers(), tmf.gettrustmanagers(), null); } catch (nosuchalgorithmexception | certificateexception | ioexception | keystoreexception | unrecoverablekeyexception | keymanagementexception e1) { log4j.log.error("error occurred: " + e1.getclass() + ":" + e1.getmessage() + ", full stacktrace: " + new gson().tojson(e1.getstacktrace())); return null; } sslconnectionsocketfactory sslsf = new sslconnectionsocketfactory( sslcontext, new x509hostnameverifierimplementation()); registry<connectionsocketfactory> socketfactoryregistry = registrybuilder .<connectionsocketfactory> create().register("https", sslsf) .build(); poolinghttpclientconnectionmanager cm = new poolinghttpclientconnectionmanager( socketfactoryregistry); closeablehttpclient httpclient = httpclients.custom() .setconnectionmanager(cm).build(); httppost httppost = new httppost(url); urlencodedformentity uefentity; string returncode = null; try { uefentity = new urlencodedformentity(formparams, "utf-8"); httppost.setentity(uefentity); closeablehttpresponse response = httpclient.execute(httppost); try { httpentity entity = response.getentity(); if (entity != null) { returncode = entityutils.tostring(entity, "utf-8"); } } { response.close(); } } catch (clientprotocolexception e) { log4j.log.error("error occurred: " + e.getclass() + ":" + e.getmessage() + ", full stacktrace: " + new gson().tojson(e.getstacktrace())); return null; } catch (unsupportedencodingexception e1) { log4j.log.error("error occurred: " + e1.getclass() + ":" + e1.getmessage() + ", full stacktrace: " + new gson().tojson(e1.getstacktrace())); return null; } catch (ioexception e) { log4j.log.error("error occurred: " + e.getclass() + ":" + e.getmessage() + ", full stacktrace: " + new gson().tojson(e.getstacktrace())); return null; } { try { httpclient.close(); } catch (ioexception e) { e.printstacktrace(); } { close(httpclient); } } return returncode; } public void close(closeable io) { if (io != null) { try { io.close(); } catch (ioexception ignore) { } } } } when execute own keystores, got exception while posting message
class javax.net.ssl.sslhandshakeexception:java.net.socketexception: unrecognized windows sockets error: 0: recv failed and server admin gave me part of log
[2017/8/21 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, write: tlsv1.2 handshake, length = 96 [2017/8/21 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, waiting close_notify or alert: state 1 [2017/8/21 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, exception while waiting close java.net.socketexception: unrecognized windows sockets error: 0: recv failed [2017/8/21 20:10:16:477 cst] 000000f7 systemout o %% invalidated: [session-18, ssl_ecdhe_rsa_with_aes_256_cbc_sha384] [2017/8/21 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, send tlsv1.2 alert: fatal, description = handshake_failure [2017/8/21 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, write: tlsv1.2 alert, length = 80 [2017/8/20 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, exception sending alert: java.net.socketexception: unrecognized windows sockets error: 0: socket write error [2017/8/20 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, called closesocket() [2017/8/20 20:10:16:477 cst] 000000f7 systemout o webcontainer : 20, handling exception: javax.net.ssl.sslhandshakeexception: java.net.socketexception: unrecognized windows sockets error: 0: recv failed server , added each other's certificate own trust keystore, should not issue of trusting each other. can't find other thread solve issue too.
possibly can cause issue:
server has both ipv4 , ipv6 enabled?
cause:
the java virtual machine (jvm) can have problems opening or closing sockets @ operating system level when both ipv4 , ipv6 enabled on windows server.
probable fix:
jvm need run on ipv4, if possible. add set following jvm option:
-djava.net.preferipv4stack=true
Comments
Post a Comment