【问题标题】:Programmatically add a self-signed certificate to your keystore/truststore以编程方式将自签名证书添加到您的密钥库/信任库
【发布时间】:2014-03-13 13:56:29
【问题描述】:

我看到this question(和其他人)解释了如何使用命令行手动将(自签名)证书添加到您的密钥库/cacerts。执行此操作时,如果您获得了证书(.cert 文件),则可以在没有签名证书的情况下与服务器建立安全连接。这对于测试目的很有用。

我想对此进行编程,因此用户无需手动执行此操作。基本概念如下:用户拥有 .cert 文件的本地副本,并为我的程序提供该文件在其文件系统中所在位置的路径。我的程序获取文件并将其添加到密钥库中。

我的问题是:在给定 .cert 文件的(路径)的情况下,如何将此证书添加到我的程序中的密钥库中,以便 turstmanager 将其作为可信/签名证书接受?有没有关于这个问题的教程或代码sn-ps?

PS:我不需要 here 所述的“接受所有证书”信任管理器技巧

【问题讨论】:

  • 您应该可以找到一个名为InstallCert 的Sun GUI 程序。我想我在此处或 Oracle Java 论坛上发布了它,抱歉,我目前无法提供链接。

标签: java ssl keystore


【解决方案1】:

相当简单:

InputStream input = ...;
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) factory.generateCertificate(input);
KeyStore keystore = ...;
keystore.setCertificateEntry(alias, cert);

从 javadoc 中可以看出加载和存储密钥库:http://docs.oracle.com/javase/6/docs/api/java/security/KeyStore.html

【讨论】:

  • 感谢您为我指明正确的方向! keystore.setCertificateEntry 会临时(仅在此程序运行时)和本地(仅适用于此应用程序)添加证书,还是会将给定的证书添加到我的 cacerts 中,因此它将永远被接受?
  • 这完全取决于您将其添加到哪个密钥库。如果您将它添加到默认的 cacerts 密钥库,那么可以。如果您将其添加到另一个密钥库,它只会在您使用该密钥库时处于活动状态。
  • 如果我使用 KeyStore.getInstance(KeyStore.getDefaultType()),我得到的是链接到 cacerts 的密钥库,还是没有证书的全新空密钥库?还是别的什么?
  • @user1884155,保存密钥库使用KeyStore.store (如本答案链接的JavaDoc介绍中所述)。获取默认信任库could be difficult in general
  • 可以将 KeyStore 类用于信任存储吗?密钥存储和信任存储之间存在概念上的差异。
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2011-05-17
  • 2017-03-05
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多