X509TrustManager checkServerTrusted with TLSv1.3

X509TrustManager checkServerTrusted with TLSv1.3

我正在 java 中制作 TLS 客户端并使用 x509TrustManager checkServerTrusted 方法验证服务器证书是否可信。

void checkServerTrusted(X509Certificate[] chain,
                      String authType)
                        throws CertificateException

authType - the key exchange algorithm used

文档提到它使用 authType 参数指定所使用的密钥交换算法。这对 TLS1.2 有意义,因为可以从所选密码中计算出密钥交换算法。但是在没有密钥交换算法的 TLS1.3 中,authType 值应该是什么?通过此方法使用 TLS1.3 时如何验证证书?我正在使用 openJDK 8.

It's "UNKNOWN". 注意实际的 cert-path 验证和名称检查与较低的协议相同; 1.3 服务器未指定使用包含密钥的证书,并且(可能)KeyUsage 与较低协议中的密钥交换匹配,只有一个 signature-capable 并匹配客户端提供的 signature_algorithms 值之一 - - JSSE 客户端提供所有,至少假设 EC 提供程序可用,这在 j7 up 中通常是这种情况。 (仅限 1.2,指定服务器证书以匹配 sigalgs keyexchange。)

AFAICS 默认验证器(即当您使用 TrustManagerFactory 时)实际上根本不检查此值,尽管 it does apply a constraint for sigalgs when present(i.e.in 1.2 或 1.3)。 TLS 规范不要求客户端对此进行检查,甚至 1.3 也不需要,后者通常比早期版本需要更多的接收方检查(即反邮差主义)。 (OTOH 默认 X509[Extended]KeyManager 确实使用类似的 keyType[s] 参数。)

PS:您是说您正在调用 标准 (X509)TM 来验证证书吗?如果是这样,您不需要; JSSE 已经这样做了。或者你的意思是你 供应 你自己的 class implements X509TrustManagerbe 调用?如果是这样,您应该知道 7 up(如您所链接的)JSSE 将 add 'endpoint-identification' 即主机名检查适用于提供的 X509TM。如果你想自己控制它,你必须改为 extends X509ExtendedTrustManager 作为你链接页面顶部的链接。