如何在不使用 keytool 命令行实用程序的情况下导入新的 Java CA 证书?

StackOverflow https://stackoverflow.com/questions/1650596

  •  22-07-2019
  •  | 
  •  

执行摘要:如何使用 Java 代码将新的根证书安装到 Java 中?

我们有一个可以访问各种 Web 服务的桌面应用程序。最近,其中一位将其 SSL 证书更换为由 Trustwave 签名的证书。虽然常规 Internet 浏览器接受 Trustwave SSL 证书,但 Java 似乎没有附带必备根证书,因此我们无法访问给定的 Web 服务,并显示以下错误消息:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

通过说服提供商改回威瑞信,我们获得了暂时的缓刑,但当他们改回来时,我们必须做好准备。所以我需要我们的桌面软件根据需要自动安装Trustwave根证书。我们的客户不够精通技术,无法使用 keytool 命令,我宁愿不编写它的脚本,因为我认为这是一个脆弱的解决方案(Mac 和 PC 的单独实现、与 Vista 执行限制的斗争、难以找到正确的 JRE 安装到, ETC)。

我想 keytool 在内部使用 Java。我可以在 Java 中使用什么命令来复制 keytool 的功能并以编程方式安装根证书?

有帮助吗?

解决方案

我不知道这是可能的,但你可以实现自己的TrustManager允许这个连接,或者该CA. 这里是的基本知识。

其他提示

恕我直言,Sun 没有通过 API 公开 keytool,主要是为了防止开发人员修改可信 CA 集。我可以想象攻击者利用此类代码将自己的根证书插入信任存储区,从而损害信任存储区的模型。

事实上,如果您查看 KeyTool 类(sun.security.tools 包)的源代码,您会发现它不仅是最终的,而且还具有一个私有构造函数,可防止任何调用者从代码中创建 KeyTool 类的实例。KeyTool 确实有一个 main 方法,使得命令行(以及操作系统用户)可能成为初始化 KeyTool 并与其通信的唯一方式。

剩下的唯一(简单的)方法是:

  • 将 keytool 初始化为应用程序的进程,并传递命令行参数来安装根 CA 证书。仅此一点就是一个坏主意,我建议通知用户正在发生的事情。
  • 避免使用 keytool,而是为用户提供有关如何使用以下命令安装根 CA 的说明 关键人物 或者 关键工具 IUI. 。在这里仅就我自己而言,我更喜欢后者。

您总是可以调用密钥工具作为一个过程Runtime.exec(...)

如果您想将证书安装到桌面计算机上受信任根的密钥库中,则需要获得执行此操作的权限。与 密钥工具, ,您需要密码才能访问受信任的根密钥库。如果你想快点儿,你可以

  • 将证书写入文件或字节流或其他任何内容
  • 导入使用 KeyTool 班级 (sun.security.tools.KeyTool)

但恕我直言,如果证书无效,那么它就不值得信任。我想说这是有充分理由的。

命令行的解决方案。在Mac上,Java主是/图书馆/的Java /主页。尝试:

$ sudo -i
# cd /Library/Java/Home
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts

替换CAName与CA的名称,并用CA.crt你的证书文件的路径(PEM作品)。它会提示存储密码。默认密码链接的文章中给出。

我不得不为的RapidSSL的CA证书的一个做到这一点。

Sun 发布了此代码,用于基于运行带有任何证书的 https 的任何目标主机来创建 cacerts 文件的更新版本:

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

您的新 cacerts 将在当前目录中命名为 jssecacerts。只需将该新文件复制到 jre/lib/security/cacerts 文件上即可。

我对您的新 cacerts 文件的安全性不做任何评论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top