OpenSSL 和 WL/Java 的证书验证

Posted

技术标签:

【中文标题】OpenSSL 和 WL/Java 的证书验证【英文标题】:Certificate verification in case of OpenSSL and WL/Java 【发布时间】:2015-11-19 11:29:48 【问题描述】:

我正在尝试通过 SSL 连接到应用程序。当通过 WL/Java 连接时,我得到 sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification,我知道这是因为我的 WL/Java 的受信任存储中没有安装服务器证书。

我从浏览器导入证书,使用keytool 安装它,现在一切正常。

但是,以下是一些未解决的问题:

当我使用openssl s_client 命令连接相同的主机:端口时,SSL 握手成功。这是在我将该证书添加到我的受信任存储之前。

为什么在openssl没有在密钥库中添加证书的情况下SSL握手成功?

浏览器在其受信任的 CA 存储中不包含证书,它仅包含受信任的 CA 的证书,然后匹配服务器证书的签署者 CA 是否存在于其受信任的 CA 存储中。如果是,则对服务器进行身份验证。

在服务器的情况下,为什么即使服务器的证书签署者 (EnTrust) 证书存在于我的密钥库中,服务器也未通过身份验证。为什么我需要在我的密钥库中导入服务器证书而不是不需要的浏览器? 只有服务器证书的签名 CA 的证书需要存在于密钥库中,还是应该存在服务器的实际证书?

【问题讨论】:

【参考方案1】:

    openssl 是验证证书还是只是连接openssl s_client 被设计为一个测试工具而不是一个真正的应用程序,即使证书没有验证它也会继续连接,而真正的客户端会像大多数浏览器一样中止或至少发出一个很大的警告。您是否专门检查了用户数据之前的Verify return code 输出(输出或输入,取决于)或靠近开头的验证回调日志?

    客户端的信任库中只需要用于服务器证书的 root CA 证书。几十年前,您可能只有一个像服务器这样的实体和一个直接签署它的 CA。今天几乎总是有多个级别的 CA,并且服务器应该自动发送中间或“链”证书和/或在允许获取它们的扩展中提供信息。查看第一个自动链接 Trouble understanding SSL certificate chain verification 和规范的 https://security.stackexchange.com/questions/20803/how-does-ssl-work/ 。有一些例外情况,例如新创建的 CA 尚未很好地分配其根。

    我不了解 WL,据我了解,android 可能会延迟获取新版本。在桌面 (Oracle) Java 上,SunCertPathBuilder 几年前被 PKIXCertPathBuilder 取代(尽管 Sun 版本仍然存在并且可以工作)。桌面 Java 有几个(四个)Entrust 根,在过去几年中发生了几次变化,而当前的 Firefox 和我不知道他们现在正在使用哪个,或者最近使用哪个,或者您的服务器需要哪个。但是,如果您的浏览器显示为证书链顶部的根证书在您的 Java 信任库中,则 Java 握手应该可以工作。请注意,这些多个证书的“人类”名称相似但不相同;还要检查指纹/指纹以确保它确实是相同的证书。

【讨论】:

以上是关于OpenSSL 和 WL/Java 的证书验证的主要内容,如果未能解决你的问题,请参考以下文章

用openssl生成的ssl证书和付费的有啥区别

openssl——自签名根证书、签名客户端和服务器证书

如何像浏览器一样使用openssl验证证书?

用openssl生成的ssl证书和付费的有啥区别

OpenSSL:无法验证 Experian URL 的第一个证书

10.openssl证书和CA功能概述