当前位置: 首页 > 知识库问答 >
问题:

Spring引导捕获SSLHandshakeException

汝墨一
2023-03-14

我们在SpringBoot中使用双向ssl Auth编写了一个rest API。当用户选择错误/过期的客户端证书时,我们希望发送401 HTTP状态代码。

当它发生时,我可以看到异常:

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
http.x509().subjectPrincipalRegex("XXXXXX").userDetailsService(this.userDetailsService);
((RequiresChannelUrl)http.requiresChannel().anyRequest()).requiresSecure();

urls().forEach((url, guard) -> {
   try {
      ((AuthorizedUrl)http.authorizeRequests().antMatchers(new String[]{url})).access(guard);
    } catch (Exception var4) {
        throw new UnsupportedOperationException("error");
    }
});

这里是堆栈跟踪:

DirectJDKLog.java:175 [] Handshake failed during wrap
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439)
....
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)

浏览器显示:ERR_BAD_SSL_CLIENT_AUTH_CERT是否可以在SpringBoot中捕获此异常并发送特定的HTTP状态代码?

共有1个答案

贺景山
2023-03-14

也许你可以试试控制器的建议:

@ControllerAdvice
class MyControllerExceptionHandler {

    @ResponseStatus(HttpStatus.UNAUTHORIZED)  // or whatever you want
    @ExceptionHandler(SSLHandshakeException.class)
    public void handleHandshakeException() {
        // Nothing to do
    }
}
 类似资料:
  • 我有一个引导模式来选择事件。如果用户单击X按钮或在模式之外,我希望将它们发送到默认事件。如何捕获这些事件? 这是我的HTML代码:

  • 我必须得到一个环境变量,我不能注射。 我无法注入环境中的basUrl。 有人能告诉我怎么做吗? 我读了以下几页,我是初学者,因为我什么都不懂。https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.htmlhttps://www.mkyong.com/spring-bo

  • 我有下面的台词, 所以,如果我再加上两个括号,比如:那么,会有两个组吗?将返回部分,而返回部分? 代码段是为了澄清我的困惑而给出的。不是我处理的代码。上面给出的代码可以用以更简单的方式完成。

  • 我试图从我的Spring启动服务向IBMMQ队列发送消息。配置如下: 一个pplication.properties 菜豆 IBM MQ浏览器图片 当我尝试发送消息时,我收到错误: 我错过了什么?我的chammel类型所显示的错误与我的请求不符,但我不知道这意味着什么。 提前谢谢。

  • 我使用以下代码设置了一个异常处理程序 我正在使用Spring Security 3.1。当我尝试在没有身份验证的情况下执行操作时,应用程序会引发 AccessDeniedException。它永远不会出现这种方法。但与其他例外情况一样工作正常。这是它应该工作的方式吗?还是我的代码有问题? 这看起来像一个解决方案。但是,如果我能在一个点上处理异常,那就更好了。 这是我的配置文件 更新 此处,用户未通

  • 我有一个Spring Boot应用程序(使用嵌入式Tomcat7),并且我在中设置了,这样我就可以有一个随机端口。在服务器启动并在一个端口上运行之后,我需要能够获得所选择的端口。 我不能使用,因为它为零。这是一条看似简单的信息,那么为什么我不能从我的java代码中访问它呢?我如何访问它?