我已经使用KeyTool实施了使用服务器和客户端身份验证的Web服务。问题在于,如果我不在其中包含主机的名称,则此身份验证不起作用。例如:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"

但是我不需要,也不喜欢主机或IP验证。有什么方法可以避免它吗?

谢谢。

有帮助吗?

解决方案

作为其要求的一部分,SSL具有验证证书CN与您连接到的主机名相匹配的验证。如果CN不匹配,则浏览器将假定您要连接到错误的主机和对象。

没有办法解决这个问题。

其他提示

我同意其他海报:如果您正在使用SSL,那么您几乎可以肯定 主机名验证作为SSL安全功能集的一部分。

也就是说,根据您使用的客户,很可能有一种解决这个问题的方法。工程师将在测试环境中规避主机名验证,用于调试,原型等。

static {
    HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){
            public boolean verify(String string,SSLSession ssls) {
            return true;
        }
    });
}

使用SSL/TLS的目的是使客户端可以确保它连接到正确的服务,而不是试图模仿真实服务的一些虚假服务。如果(假设地)服务器证书不包含任何主机识别信息,则客户端如果与之协商的服务器是正确的。

实际上,你 确实需要验证 通过DNS地址,因为如果您不这样做,您的SSL验证是毫无价值的。 (或者至少,没有尽可能安全的地方。)

我想从理论上讲,您可以尝试通过除SSL/TLS以外的其他方式确保的渠道进行客户/服务器通信。但是,您需要在Java的安全性和加密技术方面进行认真的专业知识。

标准逻辑是:如果您不需要保护数据,请不要使用SSL。如果您确实需要保护它,那么您需要知道要连接的主机。之间不应该有任何内部。

但是,在某些内部环境中,您可能对网络和配置有足够的控制,以免担心。

如果您在后一种情况下,则解决方案取决于您正在使用的客户端库。如果您正在使用HTTP客户端,请阅读 SSL配置指南. 。可能是您不需要实施自己的 SecureProtocolSocketFactory 并且只能使用 EasysslProtocolSocketFactory.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top