我已经使用 keytool 实现了一个带有服务器和客户端身份验证的 Web 服务。问题是如果我没有在其中包含主机名,则此身份验证不起作用。例如:
keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"
但我不需要,也不喜欢通过主机或 IP 进行验证。有什么办法可以避免吗?
谢谢。
我已经使用 keytool 实现了一个带有服务器和客户端身份验证的 Web 服务。问题是如果我没有在其中包含主机名,则此身份验证不起作用。例如:
keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"
但我不需要,也不喜欢通过主机或 IP 进行验证。有什么办法可以避免吗?
谢谢。
作为其要求的一部分,SSL 具有验证证书 CN 是否与您要连接的主机名匹配。如果 CN 不匹配,则浏览器将假定您连接到错误的主机和对象。
没有办法解决这个问题。
我同意其他发帖者的观点:如果您使用 SSL,您几乎肯定希望将主机名验证作为 SSL 安全功能集的一部分。
也就是说,根据您使用的客户端,很可能有办法解决这个问题。工程师将绕过测试环境中的主机名验证,用于调试、原型设计等。如果您使用的是通过 HttpsURLConnection 连接的 Java 客户端,只需将以下内容添加到客户端类中即可:
static {
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier(){
public boolean verify(String string,SSLSession ssls) {
return true;
}
});
}
标准逻辑是:如果您不需要保护您的数据,请不要使用 SSL。如果您确实需要保护它,那么您需要知道您正在连接的主机。中间不应该有。
但是,在某些内部环境中,您可能对网络和配置有足够的控制权而不必担心。
如果您是后一种情况,则解决方案取决于您使用的客户端库。如果您使用的是 HTTP 客户端,请阅读SSL 配置指南。可能您不需要实现自己的SecureProtocolSocketFactory
,只需使用EasySSLProtocolSocketFactory 即可。