Java SSL证书中没有主机名

Java SSL证书中没有主机名,java,certificate,x509certificate,keytool,Java,Certificate,X509certificate,Keytool,我已经使用keytool实现了一个带有服务器和客户端身份验证的web服务。问题是,如果我不在其中包含主机名,那么这种身份验证就不起作用。例如: keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost" 但我不需要,也不喜欢通过主机或IP进行验证。有什么办法可以避免吗 谢谢。作为SSL要求的一部分,SSL

我已经使用keytool实现了一个带有服务器和客户端身份验证的web服务。问题是,如果我不在其中包含主机名,那么这种身份验证就不起作用。例如:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"
但我不需要,也不喜欢通过主机或IP进行验证。有什么办法可以避免吗


谢谢。

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


没有办法解决这个问题。

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

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


如果是后一种情况,那么解决方案取决于您使用的客户端库。如果您使用的是HTTP客户端,请阅读。可能您不需要实现自己的
SecureProtocolSocketFactory
,只需使用即可。

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

也就是说,根据您使用的客户机的不同,很可能会有解决此问题的方法。工程师将在测试环境中绕过主机名验证,以进行调试、原型设计等。如果您使用的是通过HttpsURLConnection连接的Java客户端,则只需将以下内容添加到客户端类即可:

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

严格来说,这不是SSL/TLS要求(不在SSL/TLS规范中)。然而,它在(HTTPS)中,并在(比此答案更近的)中推广到使用SSL/TLS和X.509证书(即最频繁使用模式)的其他协议。使用Subject Alternative Name extension也比使用Subject可分辨名称的CN RDN更可取。对于其他人,我想指出,据我所知,证书固定是一种不需要知道主机名即可保持安全性的用例。(然而,我仍然难以说服我的客户端应用程序相信这一点。)