我正在用java制作一个TLS客户端,并使用x509TrustManager checkServerTrusted方法验证服务器证书是否可信。
void checkServerTrusted(X509Certificate[] chain,
String authType)
throws CertificateExceptionauthType - the key exchange algorithm used
文档中提到它使用了一个authType参数,它指定了所使用的密钥交换算法。这对于TLS1.2来说是有意义的,因为密钥交换算法可以从选定的密码中计算出来。但是在没有密钥交换算法的情况下,authType值应该是什么呢?用这种方法使用TLS1.3如何验证证书?我使用的是openJDK 8。
发布于 2022-05-18 07:18:21
这是“未知”。注实际证书-路径验证和名称检查与较低协议相同;不指定1.3服务器使用包含密钥和(潜在) KeyUsage的证书,该证书与低协议中的密钥交换相匹配,仅仅是一个签名--并且与客户端提供的signature_algorithms值匹配--并且JSSE客户端提供了全部,至少假设一个j7提供程序是可用的,这在j7 up中通常是这样的。(只有指定的服务器证书才匹配sigalgs和keyexchange。)
默认验证器(即当您使用TrustManagerFactory时)实际上根本不检查这个值,尽管当它存在时,它确实对sigalgs应用了一个约束。 (i.e.in 1.2或1.3)。TLS规范不要求客户端检查这一点,甚至不要求1.3,这通常需要比早期版本更多的接收器检查(即antiPostelianism)。(默认的X509ExtendedKeyManager确实使用类似的keyTypes参数。)
PS:您的意思是您正在调用标准(X509)TM来验证证书吗?如果是这样的话,您不需要;JSSE已经这样做了。或者您的意思是您提供您自己的类来调用implements X509TrustManager?如果是这样的话,您应该知道在7 up中(正如您所链接的那样),JSSE将添加“端点标识”,即在适用于提供的X509TM的情况下进行主机名检查。如果您想自己控制这一点,则必须将extends X509ExtendedTrustManager作为链接到链接的页面顶部。
https://stackoverflow.com/questions/72282382
复制相似问题