SSL握手失败时的自定义错误

3

我有一个部署在Tomcat 8上的SpringBoot REST应用程序。我已经为其公开的API配置了SSL身份验证。

以下是在Tomcat中的配置:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    keystoreFile="D:/sw/apache-tomcat-8.0.23/conf/jks/ServerKeystore.p12" keystorePass="password" keystoreType="PKCS12"
    truststoreFile="D:/sw/apache-tomcat-8.0.23/conf/jks/Keystore.p12" truststorePass="password12" truststoreType="PKCS12"
    clientAuth="true" sslProtocol="TLSv1.2" />

当授权客户端使用错误的证书或没有证书尝试访问服务器时,我希望能够抛出自定义错误消息(可能是在Tomcat文件中的任何配置)。目前我得到的是http响应代码0

我已经尝试了很多方法来找出如何实现这一点。是否可以通过Tomcat的某些配置来完成?这是SSL身份验证失败的正确行为吗?


你不应该得到0,而应该得到403或连接终止。检查你的配置。你不需要自定义错误消息。 - user207421
2个回答

1
您需要编写自己的JSSE包装类实现,该类由Tomcat使用,并使用sslImplementationName连接器属性进行配置。该包装类将提供您自定义版本的套接字工厂,以执行所需的日志记录。您可能只需要编写一个最小的子类来增加更多日志记录,并将所有内容委派给Tomcat默认的JSSE实现。

有关于自定义 org.apache.tomcat.util.net.jsse.JSSEImplementation 实现以用于额外日志记录的任何指针或输入吗? - Manu

0
如果 SSL 握手失败,则无法自定义错误,因为既没有建立纯 HTTP 连接,也没有建立有效的 HTTPS 连接来发送此错误。因此,对等方最多会收到 TLS 警报,并呈现针对此类问题的内置错误消息。

如果客户端没有提供证书,握手不会失败。这在TLS级别上是可选的。它可能对HTTP服务器强制执行,但它不能在TLS级别上表达。因此,TLS连接确实存在,因此可能会出现HTTP错误响应。为什么OP得到零是另一个问题。他应该得到403。 - user207421
@EJP:这取决于服务器配置和客户端行为。如果在TLS级别(SSL_VERIFY_FAIL_IF_NO_PEER_CERT)需要证书,则握手将失败,如果没有发送证书。如果证书是可选的,则如果未发送证书,则不会失败,但如果客户端发送无法验证的证书,则仍将失败。这至少是在OpenSSL中的情况,但也许您可以在Java中更好地控制此过程。 - Steffen Ullrich
@EJP:除此之外,问题是关于自定义错误消息的,如果握手失败,这就是我的答案所涉及的内容。如果您成功地管理了握手,那就是另一个问题了。 - Steffen Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接