我正在打开一个安全的 SSL 套接字到我服务器上的端口 12345。我现在使用的是自签名证书。我将证书安装到我的服务器 keystore 和客户端信任库中;很好,等等等等的噪音。
我正在构建这个例子:http://www.exampledepot.com/egs/javax.net.ssl/Client.html
客户端正确验证服务器是否有签名证书。客户端似乎没有验证所提供的证书 CN(通用名称)是否与我要连接的服务器的主机名相匹配。显然,如果不要求它与请求的域匹配,则获得签名证书并不困难。
当我安装我的证书时(使用 keytool --import),我是否将它安装为根级证书?我是否需要使用第一个证书的主 key 签署第二个证书?为什么 TrustManager 不验证公用名?
我希望这是有道理的,并且我没有过度思考这整件事。
谢谢!
更新:似乎 Java SSL 可能需要手动验证证书? ( http://www.java2s.com/Open-Source/Java-Document/Net/Apache-common-HttpClient/org/apache/commons/httpclient/contrib/ssl/StrictSSLProtocolSocketFactory.java.htm ) 这真的是真的吗?我本来希望默认设置是安全的,如果不这样做,就需要显式覆盖。我很惊讶。有人可以确认吗?
最佳答案
验证主机名取决于应用程序。在 HTTPS 的情况下,它通过 HttpsURLConnection
和 HostnameVerifier
类内置到 Java 中。如果您直接使用 SSLSocket
,这取决于您,通常是通过 HandshakeCompletedListener。
关于java - 在 Java 中验证 SSL 证书的通用名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4515696/