Java - 如何通过针对 Java keystore 或 Windows CertMgr 输入 URL 来验证 SSL 证书?

标签 java ssl https ssl-certificate

现在我有一些带有由 CA 软件签名的证书的 HTTP-SSL 服务器。

我在 Windows 和 Java keystore 中都导入了 CA。

谁能指导我/为我提供一些有用的信息,让我通过简单地输入一个 URL(例如 https://10.1.1.11)来针对 Java keystore 或 Windows CertMgr 编写代码来验证 SSL 证书? 只是为了检查 CA 是否受信任以及证书是否过期。

非常感谢!

最佳答案

除selfsigned以外的所有证书均由CA软件签名;也许您是指由您自己或公共(public)“知名”CA 以外的某个实体(可能是雇主或其他本地组织)运营的 CA 软件。这几乎是您需要将 CA 根证书显式添加到您的(客户端)信任库的唯一情况,因为在大多数情况下,(大多数)知名 CA 的根已预先安装,尤其是在 Windows 和 Java 中。 此类“私有(private)”CA可以像知名 CA 一样使用中间(链)证书,但它们通常不这样做。

最简单和最准确的方法是只做一个虚拟请求:

new URL ("https://hostname:port/pathifneeded") .openConnection() .connect();

这会根据“当前”本地信任库和请求的主机名验证接收到的证书(如果直接从根目录颁发,则可能只是证书,见上文),因为所有客户端/请求应该做的。这包括适当的链接,包括扩展和约束、有效签名、未过期(或 future )以及吊销(如果证书和您的 JVM 都(全部)配置为 OCSP)。

如果有任何错误,它会抛出异常。对于一个简单的独立测试程序,您不需要编写任何异常处理,只需使用打印出未捕获异常的 JVM 默认值即可。对于更复杂的环境,您可能想要捕获异常并做一些不同的事情。

默认使用的信任库是 Java 默认信任库,它是 cacerts(或 jssecacerts,如果存在)的内容 JRE/lib/security 目录。对于 Sun/Oracle Java 包,此文件由包提供并且最初包含 Sun/Oracle 批准的 CA 根。对于 Unix 上的 OpenJDK 包,有时它会链接到专门提供根证书的不同包,例如在 CentOS(我使用的)上,ca-certificates 包在(大部分)/etc/pki 中。请注意,您可以在一个系统上安装多个 JRE;如果是这样,请确保您设置并使用了正确的设置。

在 Windows 上(仅)您可以通过指定 sysprop javax.net.ssl.trustStoreTypeWindows-ROOT 来使用 Windows 证书存储> 在命令行上使用 -D 或通过调用 System.setProperty before 使用 .openConnection() https URL,或任何其他默认 SSL 套接字工厂的使用。

如果你不想检查主机名,你可以通过将 HttpsURLConnection 临时放在一个变量中并调用类似的东西来覆盖默认的主机名 validator

httpsconn.setHostNameVerifier( new HostnameVerifier() { 
    boolean verify (String name, SSLSession session){ return true; }
    } );

在执行 .connect() 之前或通过调用类似的方法

HttpsURLConnection.setDefaultHostnameVerifier( ...as above... );

.openConnection() 之前。

关于Java - 如何通过针对 Java keystore 或 Windows CertMgr 输入 URL 来验证 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420883/

相关文章:

安装 ez_setup.py 时出现 Python 错误 "could not create SSL/TLS secure channel"

java - 如何让 ReSTLet 客户端忽略 SSL 证书问题

java - 如何使用循环从 hashmap 中获取值

java - 选择实体类中属性的日期格式

java - 私有(private)变量在对象之间共享

ssl - Safari 不断重新加载带有自定义 CA 证书的页面

一台 Apache2 服务器上多个域的 SSL 证书问题

java - 在 Hibernate Criteria 中将日期转换为字符串

ssl - 如何为 Heroku 上的 Spring Boot 应用程序强制使用 HTTPS?

ios - 如何使用 NSURLConnection 与 SSL 连接以获得不受信任的证书?