现在我有一些带有由 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.trustStoreType
值 Windows-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/