我试图使用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!
}
答案 0 :(得分:1)
根据我的经验,Java不喜欢没有密码的PKCS#12密钥库。在PKCS#12文件上设置密码(它不必是强密码,只需“密码”就可以了),并将其作为ks.load
的第二个参数。
答案 1 :(得分:1)
我有一个" .p12"与应用程序的WAR文件捆绑在一起的文件和WAR文件部署到tomcat中。
换句话说,它是一种资源。 new File()
和new FileInputStream
无法处理资源。您应该使用Class.getResourceAsStream()
。
它在开发中工作,因为该文件存在于那里。它在生产中并不存在。 WAR文件中只存在资源。