我使用keytool实现了一个带服务器和客户端身份验证的Web服务。问题是如果我不在其中包含主机的名称,则此身份验证不起作用。例如:
keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"
但我不需要,也不喜欢主机或IP验证。有没有办法避免它?
感谢。
答案 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。