代码之家  ›  专栏  ›  技术社区  ›  Jav

java.net.SocketException:尝试在java8中使用https restful api时发生连接重置-异常

  •  0
  • Jav  · 技术社区  · 7 年前

    正在尝试使用以下具有证书的客户端访问https服务。 是否需要添加其他证书?

    protected Client getClient() {
        if (client == null) {
            try {
                TrustManager[] trustCertificates = new TrustManager[] { new X509TrustManager() {
    
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain, String authType)
                            throws CertificateException {
                    }
                    @Override
                    public void checkServerTrusted(X509Certificate[] chain, String authType)
                            throws CertificateException {
                    }
                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[0];
                    }
    
                } };
                final SSLContext sslContext = SSLContext.getInstance(SSL);
                sslContext.init(null, trustCertificates, new java.security.SecureRandom());
                final HostnameVerifier verifiedHosts = new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                };
                ClientBuilder clientBuilder = ClientBuilder.newBuilder();
                ClientConfig config = new ClientConfig();
                config.register(JacksonJsonProvider.class);
                config.register(Log4j2JerseyLoggingFilter.class);
                return clientBuilder.sslContext(sslContext).hostnameVerifier(verifiedHosts).withConfig(config).build();
            } catch (NoSuchAlgorithmException | KeyManagementException e) {
                LOG.error("Client Builder Exception " + e);
            }
        }
        return null;
    }
    

    获取套接字连接异常。

    Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:189)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)
    at sun.security.ssl.InputRecord.read(InputRecord.java:529)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
    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.getOutputStream0(HttpURLConnection.java:1281)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1256)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
    at org.glassfish.jersey.client.internal.HttpUrlConnector$4.getOutputStream(HttpUrlConnector.java:385)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:200)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:194)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   codebrane    7 年前

    默认情况下,Java7不使用TLSv1.2,但是 Java 8 does

    final SSLContext sslContext = SSLContext.getInstance("TLSv1");