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

使用PKCS#12证书对某些数据进行Java签名时出错,java,pkcs#12,Java,Pkcs#12,我正在尝试使用PKCS#12证书对一些数据进行签名。 我在开发机器中成功地签署了数据,但在将应用程序部署到生产机器中之后,我遇到了一些问题 在开发机器中,我有OracleJDK1.6.0和CentOS6.2,在生产机器中,有IBMJDK1.6.0和IBMAIX 问题是我无法从加载了证书文件的密钥库实例中获取带有别名的私钥, 密钥库中似乎没有条目,而我已经用 keytool命令(因此该文件没有问题),并且该代码在开发机器中运行没有任何问题 谢谢你的帮助 代码如下: KeyStore ks = Ke

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

在开发机器中,我有OracleJDK1.6.0和CentOS6.2,在生产机器中,有IBMJDK1.6.0和IBMAIX

问题是我无法从加载了证书文件的密钥库实例中获取带有别名的私钥, 密钥库中似乎没有条目,而我已经用 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!
}

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

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

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


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

但奇怪的是,代码在我的开发机器中运行,就像charmI一样,使用keytool命令将证书文件从pkcs12(.p12)转换为java密钥存储(jks),正如您所说,我为其设置了密码,现在解决了:)定义“已部署”。密钥库是如何进入生产环境的?我有一个“.p12”文件,它与应用程序的WAR文件捆绑在一起,WAR文件被部署到tomcat中。没有任何影响我回答的更改。它仍然是一种资源;您仍然不能在其上使用
文件
文件输入流
;您应该仍然使用
Class.getResourceAsStream()
。实际上,它并不打算成为一个资源,所以问题是,我必须做什么才能将它用作文件而不是资源?我是否必须将认证放在tomcat之外,并向文件实例提供它的绝对路径?如果它不是一个资源,不要将它放在WAR文件中;使用原始代码;并确保在部署时文件位于代码预期的位置。根据您的建议,我尝试了一种新方法,我将证书文件放在tomcat之外的目录中(例如/user/home/certification),并使用其绝对路径初始化文件实例
file file file=new file(“/user/home/certification/file.p12”)
,但结果是相同的,我得到了相同的验证。