9

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

我们有一个桌面应用程序可以访问各种网络服务。最近,其中一位将其 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 的功能并以编程方式安装根证书?

4

6 回答 6

2

我不知道这是否可能,但您可以实现自己的 TrustManager 以允许此连接或此 CA。是基础知识。

于 2009-10-30T15:48:43.470 回答
1

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

  • 将证书写入文件或字节流或其他
  • KeyTool使用类 ( sun.security.tools.KeyTool)导入

但是恕我直言,如果证书无效,那么它是不可信的。我会说这是有充分理由的。

于 2009-10-30T15:48:55.403 回答
1

恕我直言,Sun 没有通过 API 公开 keytool,主要是为了防止开发人员修改受信任的 CA 集。我可以想象攻击者利用这样的代码将他们自己的根证书插入到信任库中,从而破坏信任库的模型。

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

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

  • 将 keytool 初始化为来自应用程序的进程,并传递命令行参数以安装根 CA 证书。仅此一项就不是一个好主意,我建议通知用户正在发生的事情。
  • 避免使用 keytool,而是向用户提供有关如何使用KeymanKeyTool IUI安装根 CA 的说明。在这里只为我自己说话,我更喜欢后者。
于 2009-10-30T16:59:33.610 回答
1

您始终可以将 KeyTool 作为进程调用Runtime.exec(...)

于 2009-10-30T20:24:41.887 回答
0

命令行解决方案。在 Mac 上,Java 主目录是 /Library/Java/Home。尝试:

$ 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 证书执行此操作。

于 2012-10-10T20:20:32.700 回答
0

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 文件的安全性。

于 2015-02-24T00:53:15.780 回答