方法抛出“javax.net.ssl.SSLException”异常

Method threw 'javax.net.ssl.SSLException' exception

提问人:lucky 提问时间:11/16/2023 最后编辑:lucky 更新时间:11/16/2023 访问量:39

问:

我编写了一个 JUnit 来测试调用以下 getAuthToken 的方法之一

public String getAuthToken() throws URISyntaxException, IOException, InterruptedException {
    String formBody = String.format("grant_type=client_credentials&client_id=%s&client_secret=%s&scope=%s",
            URLEncoder.encode(clientId, StandardCharsets.UTF_8),
            URLEncoder.encode(clientSecret, StandardCharsets.UTF_8),
            URLEncoder.encode(scope, StandardCharsets.UTF_8));

    HttpRequest authRequest = HttpRequest.newBuilder()
            .uri(new URI(epimTokenUri))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .POST(HttpRequest.BodyPublishers.ofString(formBody))
            .build();

    HttpResponse<String> authResponse = client.send(authRequest, HttpResponse.BodyHandlers.ofString());

    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(authResponse.body());

    return jsonNode.get("access_token").asText();
}

为此,我使用 WireMock。以下是用于获取令牌的 WireMock 的映射

{
  "request": {
    "method": "POST",
    "url": "/.default/token"
  },
  "response": {
    "status": 200,
    "jsonBody": {
      "access_token": "testToken",
      "expires_in": 3600,
      "refresh_expires_in": 0,
      "token_type": "Bearer",
      "not-before-policy": 0,
      "scope": "https://localhost:9082/.default"
    },
    "headers": {
      "Content-Type": "application/x-www-form-urlencoded"
    }
  }
}

这给出了错误,因为方法抛出了“javax.net.ssl.SSLException”异常。在生产线上HttpResponse<String> authResponse = client.send(authRequest, HttpResponse.BodyHandlers.ofString());

谁能帮我解决这个问题?这里出了什么问题,或者用任何其他方式来模拟这个方法在我的 JUnit 中使用?以下是完整的 stackTraceenter image description here

java http ssl junit wiremock

评论

0赞 Mark Rotteveel 11/16/2023
请发布整个异常堆栈跟踪。
0赞 vatbub 11/16/2023
好吧,您显然在某处错误地配置了SSL。或者,您的应用程序需要 SSL,但您没有在 Wiremock 中配置它,或者您确实在 Wiremock 中启用了 SSL,但未指定有效的 SSL 证书。
0赞 lucky 11/16/2023
@MarkRotteveel,我附上了 StackTrace 的屏幕截图。有帮助吗?
1赞 Mark Rotteveel 11/16/2023
否,将异常堆栈跟踪作为代码格式的文本发布(使用 )。也就是说,您是否阅读了异常消息,它为您确定了问题,您的连接不是实际的SSL加密,而只是纯文本。exception.printStackTrace()
0赞 lucky 11/16/2023
@MarkRotteveel如何解决这个问题?连接应该是纯文本而不是SSL加密,否则?
1赞 President James K. Polk 11/16/2023
请阅读为什么提问时不能上传代码/数据/错误的图片?

答:

0赞 lucky 11/16/2023 #1

在我的 test.yaml 文件中,tokenURI 带有 https,因此它需要我没有通过 WireMock 提供的证书。我用http替换了它,它通过了。解决此问题的另一种方法是使用证书设置 WireMock 以接受 SSL。