如何在 java 中禁用 SSLContext 中的公用名检查?
How to disable common name check in SSLContext in java?
我正在使用 SSLContext
所以设置了 Jersey 客户端,并且需要禁用通用名称检查以避免不必要的问题。但是,我找不到关于如何正确执行此操作的文档。那么在 SSLContext
中默认禁用公共名称检查(假设使用 TLS)还是我们需要明确禁用它?如果是这样,如何?谢谢
如果我对您的理解正确,我认为您可以通过实施 HostnameVerifier
, and just returning true
in the verify
method. You can set up the verifier on the ClientBuilder
来完成您想要做的事情。例如
Client client = ClientBuilder.newBuilder()
.sslContext(sslContext)
.hostnameVerifier(hostnameVerifier)
.build();
这并没有回答你的问题,但它告诉你你正在做的是一个坏主意,可能是由于对验证工作方式的误解造成的。
...need to disable the common name check in order to avoid unnecessary issues
我不知道您要避免的 "unnecessary issues" 是什么,但不验证主机名或多或少与禁用所有验证相同,因此可以合并服务器 and/or 进行中间人攻击。
如果您不验证主机名但仍验证证书信任链,攻击者现在可以简单地使用受信任的 CA 为攻击者自己的站点签名的证书,例如attacker.example.com
。 CA 将颁发此类证书,因为攻击者可以证明其网站的所有权。
攻击者现在可以使用自己的证书合并所有其他站点,因为即使主机名无效,信任链也是有效的。这就像你接受一个国家颁发的任何身份证明一样,甚至不看 I.D 中的图片。匹配显示 I.D.
的人
我正在使用 SSLContext
所以设置了 Jersey 客户端,并且需要禁用通用名称检查以避免不必要的问题。但是,我找不到关于如何正确执行此操作的文档。那么在 SSLContext
中默认禁用公共名称检查(假设使用 TLS)还是我们需要明确禁用它?如果是这样,如何?谢谢
如果我对您的理解正确,我认为您可以通过实施 HostnameVerifier
, and just returning true
in the verify
method. You can set up the verifier on the ClientBuilder
来完成您想要做的事情。例如
Client client = ClientBuilder.newBuilder()
.sslContext(sslContext)
.hostnameVerifier(hostnameVerifier)
.build();
这并没有回答你的问题,但它告诉你你正在做的是一个坏主意,可能是由于对验证工作方式的误解造成的。
...need to disable the common name check in order to avoid unnecessary issues
我不知道您要避免的 "unnecessary issues" 是什么,但不验证主机名或多或少与禁用所有验证相同,因此可以合并服务器 and/or 进行中间人攻击。
如果您不验证主机名但仍验证证书信任链,攻击者现在可以简单地使用受信任的 CA 为攻击者自己的站点签名的证书,例如attacker.example.com
。 CA 将颁发此类证书,因为攻击者可以证明其网站的所有权。
攻击者现在可以使用自己的证书合并所有其他站点,因为即使主机名无效,信任链也是有效的。这就像你接受一个国家颁发的任何身份证明一样,甚至不看 I.D 中的图片。匹配显示 I.D.
的人