没有主机名的SSL证书

时间:2010-03-09 11:17:50

标签: java certificate x509certificate keytool

我使用keytool实现了一个带服务器和客户端身份验证的Web服务。问题是如果我不在其中包含主机的名称,则此身份验证不起作用。例如:

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

但我不需要,也不喜欢主机或IP验证。有没有办法避免它?

感谢。

4 个答案:

答案 0 :(得分:8)

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

没有办法解决这个问题。

答案 1 :(得分:3)

我同意其他海报:如果你使用SSL,你几乎肯定想要主机名验证作为SSL安全功能集的一部分。

也就是说,根据您使用的客户端,可能会解决此问题。工程师将绕过测试环境中的主机名验证,进行调试,原型设计等。如果您使用的是通过HttpsURLConnection连接的Java客户端,那么就像将以下内容添加到客户端类一样简单:

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

答案 2 :(得分:2)

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

事实上,您确实需要通过DNS地址验证,因为如果您不这样做,您的SSL验证就毫无价值。 (或者至少,无论如何都不安全。)

我认为理论上你可以尝试通过SSL / TLS之外的其他方式保护的通道进行客户端/服务器通信。但是,您需要在Java的安全性和加密技术方面拥有严谨的专业知识。

答案 3 :(得分:1)

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

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

如果您处于后一种情况,则解决方案取决于您使用的客户端库。如果您使用的是HTTP客户端,请阅读SSL config guide。您可能不需要实施自己的SecureProtocolSocketFactory,只能使用EasySSLProtocolSocketFactory