【问题标题】:error using PKCS#12 certificate to sign some data with Java使用 PKCS#12 证书使用 Java 对某些数据进行签名时出错
【发布时间】:2015-06-28 09:20:43
【问题描述】:

我正在尝试使用 PKCS#12 证书来签署一些数据。 我在开发机器上成功签署了数据,但是在将应用程序部署到生产机器后,我遇到了一些问题。

在开发机器上我有 Oracle jdk 1.6.0 和 centos 6.2,在生产机器上我有 IBM jdk 1.6.0 和 IBM AIX。

问题是我无法从与认证文件一起加载的 KeyStore 实例中获取带有别名的私钥, 似乎 KeyStore 中没有条目,而我已经打印了认证文件中存在的条目 keytool 命令(所以文件没有问题),这段代码在开发机器上运行也没有任何问题。

感谢任何帮助

代码如下:

KeyStore ks = KeyStore.getInstance("PKCS12");
String certFileAbsPath =  this.getClass().getClassLoader().getResource("").getPath() + File.separator + "file.p12";
File file = new File(certFileAbsPath);
FileInputStream fis = new FileInputStream(file);
ks.load(fis, null);
Enumeration aliasEnum = ks.aliases();
String aliasName = null;
while(aliasEnum.hasMoreElements()){
    aliasName = (String)aliasEnum.nextElement();
    logger.debug("alias: " + aliasName);//nothing is logged!
}

【问题讨论】:

  • 定义“已部署”。密钥库是如何进入生产环境的?
  • 我有一个“.p12”文件,它与应用程序的 WAR 文件捆绑在一起,并且 WAR 文件被部署到了 tomcat 中。

标签: java pkcs#12


【解决方案1】:

根据我的经验,Java 不喜欢没有密码的 PKCS#12 密钥库。在您的 PKCS#12 文件上设置一个密码(它不必是强密码,只需“密码”即可)并将其作为第二个参数提供给 ks.load

【讨论】:

  • 但奇怪的是代码在我的开发机器上运行就像一个魅力
  • 我使用 keytool 命令将认证文件从 pkcs12(.p12) 转换为 java key store(jks),正如你所说,我为它设置了密码,现在解决了 :)
【解决方案2】:

我有一个“.p12”文件,它与应用程序的 WAR 文件捆绑在一起,并且 WAR 文件部署到了 tomcat 中。

换句话说,它是一种资源。 new File()new FileInputStream 无法处理资源。你应该使用Class.getResourceAsStream()

它在开发中有效,因为该文件存在于那里。它在生产中不存在。只有资源存在,在 WAR 文件中。

【讨论】:

  • 没有任何改变会影响我的回答。它仍然是一种资源;你仍然不能在上面使用FileFileInputStream;你应该仍然使用Class.getResourceAsStream()
  • 实际上它并不是要成为资源,所以问题是我必须做些什么才能将它用作文件而不是资源?我是否必须将认证从 tomcat 中取出并提供 File 实例及其绝对路径?
  • 如果它不是资源,不要放在WAR文件中;使用您的原始代码;并确保在部署时文件位于代码预期的位置。
  • 我根据您的建议尝试了一种新方法,我将证书文件放在tomcat之外的目录中(例如/user/home/certification),我使用它的绝对路径来初始化File 实例 File file = new File("/user/home/certification/file.p12") ,但结果相同,我得到相同的 Exeption。
猜你喜欢
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2011-02-07
  • 2017-07-07
  • 1970-01-01
  • 2013-02-15
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多