如何在 java 中的 SSLContext 中禁用公用名检查



>我正在使用SSLContext所以设置泽西客户端,需要禁用公用名检查以避免不必要的问题。但是,我找不到关于我们如何正确执行此操作的文档。那么,在SSLContext中是默认禁用公用名检查(假设使用 TLS)还是我们需要显式禁用它?如果是这样,如何?谢谢。

这并不能回答您的问题,但它告诉您正在做的事情是一个坏主意,可能是由于对验证工作原理的误解引起的。

。需要禁用公用名检查以避免不必要的问题

我不知道您要避免的"不必要的问题"是什么,但不验证主机名或多或少与禁用所有验证相同,从而可以合并服务器和/或进行中间人攻击。

如果您不验证主机名但仍验证证书信任链,攻击者现在可以简单地将受信任的 CA 签名的证书用于攻击者自己的站点,例如 attacker.example.com .CA将颁发此类证书,因为攻击者可以证明自己网站的所有权。

使用自己的证书,攻击者现在可以合并所有其他站点,因为即使主机名不是,信任链也是有效的。这就像您接受州签发的任何类型的身份证明一样,甚至不查看身份证件中的图片是否与出示身份证的人相匹配。

如果我理解正确,我认为您可以通过实现HostnameVerifier来完成您正在尝试做的事情,并且只需在verify方法中返回true。您可以在ClientBuilder上设置验证程序。例如

Client client = ClientBuilder.newBuilder()
        .sslContext(sslContext)
        .hostnameVerifier(hostnameVerifier)
        .build();

最新更新