Java 是否有任何方法可以在不引发异常的情况下检查客户端对等证书?

Java 是否有任何方法可以在不引发异常的情况下检查客户端对等证书?,java,ssl,ssl-certificate,Java,Ssl,Ssl Certificate,我正在编写一个服务器,该服务器(取决于客户机)可能需要客户端证书。提供证书的客户端和不提供证书的客户端需要通过同一服务器端口连接到服务器 因此,我可以在SSLContext上支持这两种类型的客户端,我将调用“setWantClientAuth(true)”。在协商客户端SSLSession之后,如果客户端证书链可用,我想去获取它。获取客户端证书链的唯一方法是通过“sslSession.getPeerCertificates()”,不幸的是,如果客户端没有提供证书,它将抛出异常 在调用getPee

我正在编写一个服务器,该服务器(取决于客户机)可能需要客户端证书。提供证书的客户端和不提供证书的客户端需要通过同一服务器端口连接到服务器

因此,我可以在SSLContext上支持这两种类型的客户端,我将调用“setWantClientAuth(true)”。在协商客户端SSLSession之后,如果客户端证书链可用,我想去获取它。获取客户端证书链的唯一方法是通过“sslSession.getPeerCertificates()”,不幸的是,如果客户端没有提供证书,它将抛出异常


在调用getPeerCertificates之前,是否有其他方法来确定是否提供了客户端证书,以便我可以避免未提供证书的客户端出现异常?

在这种情况下引发异常只是API合同的一部分:

抛出: SSLPeerUnverifiedException-如果对等方的身份尚未验证

处理缺少客户端身份验证的传统方法只是捕获此异常。你可以看一个例子


(在此版本中,它们捕获可丢弃的,而您可能只想捕获SSLPeerUnverifiedException)

在这种情况下引发异常只是以下API契约的一部分:

抛出: SSLPeerUnverifiedException-如果对等方的身份尚未验证

处理缺少客户端身份验证的传统方法只是捕获此异常。你可以看一个例子


(在这个版本中,他们捕获的是可丢弃的,而您可能只想捕获的是未经验证的异常)

我知道这是合同的一部分。我只是不喜欢在非错误条件下抛出异常(即,只有当我需要证书但没有得到它时才是错误)。在我的情况下,我不知道何时调用getPeerCertificate是否需要证书。我明白你的意思。这是一个灰色区域。默认情况下,
getPeerCertificate()
假定没有证书是一种例外情况。这可能是一种设计选择,当您不需要证书时,强制API用户主动选择捕获该异常,而不是在您确实需要证书时隐式继续正常流。它还反映了您试图获取未初始化的内容的事实。为什么它没有被初始化是由你知道的,而不是API的这个独立部分(你可能会触发ex的重新谈判)。好的,谢谢你确认没有办法解决这个问题。“我会抓住并吃掉这个例外。”加雷斯,我记不起还有其他解决办法,但也许有一个。你不必这么快就接受我的答案,如果有更好的答案,请随时等待。没关系。如果有人提供更好的答案,我会更改。我知道这是合同的一部分。我只是不喜欢在非错误条件下抛出异常(即,只有当我需要证书但没有得到它时才是错误)。在我的情况下,我不知道何时调用getPeerCertificate是否需要证书。我明白你的意思。这是一个灰色区域。默认情况下,
getPeerCertificate()
假定没有证书是一种例外情况。这可能是一种设计选择,当您不需要证书时,强制API用户主动选择捕获该异常,而不是在您确实需要证书时隐式继续正常流。它还反映了您试图获取未初始化的内容的事实。为什么它没有被初始化是由你知道的,而不是API的这个独立部分(你可能会触发ex的重新谈判)。好的,谢谢你确认没有办法解决这个问题。“我会抓住并吃掉这个例外。”加雷斯,我记不起还有其他解决办法,但也许有一个。你不必这么快就接受我的答案,如果有更好的答案,请随时等待。没关系。如果有人提供更好的答案,我会改变它。