使用PKCS#12证书使用Java对某些数据进行签名时出错

时间:2015-04-21 09:39:34

标签: java pkcs#12

我试图使用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!
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

我有一个" .p12"与应用程序的WAR文件捆绑在一起的文件和WAR文件部署到tomcat中。

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

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