【问题标题】:SSL Exception: Connection resetSSL 异常:连接重置
【发布时间】:2021-08-25 15:59:25
【问题描述】:

我在下面有代码 sn-p,我试图从我的服务类调用 HTTP POST。我正进入(状态 以下错误

javax.net.ssl.SSLException: Connection reset

我正在使用 Java 11 和 Spring boot 2.1.6

  public void processURL(UserInput userInput, String userId, String emailId) {
    String requestJson = helper.marshallObjectToJson(userInput);
    StringEntity entity = new StringEntity(requestJson, "UTF8");
    entity.setContentType(new BasicHeader("Content-Type", "application/json"));
    httpPost.setEntity(entity);
    HttpClient httpClient = getAPIBasicAuthDefaultHttpClient();
    try {
        HttpPost httpPost = buildPostWithHeaders(userId, emailId);
        HttpResponse response = httpClient.execute(httpPost);
        respStatus = response.getStatusLine().getStatusCode();

        if (HttpStatus.SC_CREATED == respStatus) {
            logger.info("success");
        } else {
            logger.error("Failure");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 public HttpPost buildPostWithHeaders(String userId, String emailId) {
    HttpPost httpPost = new HttpPost("https://apphost.com/APIService/user/");
    httpPost.addHeader("userId", userId);
    httpPost.addHeader("email", emailId);
    httpPost.addHeader("roleType", admin);
    return httpPost;
 }

 public HttpClient getAPIBasicAuthDefaultHttpClient() {
    CredentialsProvider provider = new BasicCredentialsProvider();
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, password);
    provider.setCredentials(AuthScope.ANY, credentials);
    HttpClient client = 
    HttpClientBuilder.create().setDefaultCredentialsProvider(provider).build();
    return client;
 }

我在 gradle 中也有以下依赖

implementation('org.apache.httpcomponents:httpclient:4.5')

不确定我在这里缺少什么。请注意 - 当我尝试通过我的 REST 客户端工具进行连接时,这已经奏效,但无法通过服务 API 调用成功

下面是这个错误的堆栈跟踪

javax.net.ssl.SSLException: Connection reset
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:127)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:352)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:295)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:290)
    at java.base/sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1521)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)
    Suppressed: java.net.SocketException: Connection reset by peer: socket write error
        at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)

提前致谢。

【问题讨论】:

  • 看起来错误来自试图将指标发送到某些监控基础设施的过滤器,与实际请求无关。您是否在处理传入请求时发布帖子?
  • @erickson:是的,我正在尝试从我的服务中调用外部服务。认为这与 n/w 相关问题有关
  • 好的,所以更仔细地查看尝试报告传入请求指标的过滤器,而不是出站帖子。我猜它“在 [您] 尝试通过 [您的] REST 客户端工具连接时起作用”,因为它不会尝试收集指标。例如,如果您的指标报告器尝试保持与可能长时间空闲的时间序列数据库的持久连接,则可能需要注意保持活动设置。
  • @erickson:会调查的。感谢您的投入,非常感谢

标签: java ssl-certificate httpclient connection-reset


【解决方案1】:

我在 POST 请求中添加了 Base64 编码的授权标头,它对我有用

String plainCred = user+":"+ password;
String base64Cred = new String(Base64.getEncoder().encode(plainCred.getBytes()));

HttpPost httpPost = new HttpPost("https://apphost.com/APIService/user/");
httpPost.addHeader("Authorization", "Basic " + base64Cred);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2012-06-02
    相关资源
    最近更新 更多