Java iText:在服务器上实现PDF文件的数字签名时遇到密码问题
iText的新用户试图从中的示例3.1和示例3.2中获得改编的示例代码 我在下面提供了代码片段供参考 我让托管提供商从GlobalSign证书创建了一个Java iText:在服务器上实现PDF文件的数字签名时遇到密码问题,java,pdf,itext,keystore,pkcs#12,Java,Pdf,Itext,Keystore,Pkcs#12,iText的新用户试图从中的示例3.1和示例3.2中获得改编的示例代码 我在下面提供了代码片段供参考 我让托管提供商从GlobalSign证书创建了一个.pfx文件(他们不提供.p12文件)。他们发布了以下linux命令: # openssl pkcs12 -export -out cert.pfx -inkey www.mydomain.com.key -in ../certs/www.mydomain.com.crt -certfile ../certs/ca-bundle.crt
.pfx
文件(他们不提供.p12
文件)。他们发布了以下linux命令:
# openssl pkcs12 -export -out cert.pfx -inkey www.mydomain.com.key
-in ../certs/www.mydomain.com.crt -certfile ../certs/ca-bundle.crt
其中,ca bundle.crt
来自GlobalSign。为了获得.p12
,我只是将.pfx
文件复制到一个扩展名为.p12
的新文件中。从我在网上看到的情况来看,人们以前做过这件事(与iText无关)并取得了成功,因为.pfx
文件和.p12
文件是二进制等价物
要进行验证,可以在linux提示符下键入:
openssl pkcs12 -info -in /path/to/file/cert.pfx
然后它要求输入密码,但没有,所以只需按enter键,然后它要求输入我输入的私人密码短语(例如,myPrivateCertPassword
),然后它显示我的私人证书、GlobalSign的公共证书和我的私钥
这就是我困惑的地方。没有导入密码,因此我在iText中尝试了以下尝试(如下面的代码段所示):
两者都不起作用。第一个给出了一个运行时错误:
java.io.IOException: PKCS12 key store mac invalid - wrong password or corrupted file.
java.lang.NoClassDefFoundError : org/bouncycastle/cert/X509CertificateHolder
java.io.IOException: exception decrypting data - java.security.InvalidKeyException: Illegal key size
第二个给出了运行时错误:
java.io.IOException: PKCS12 key store mac invalid - wrong password or corrupted file.
java.lang.NoClassDefFoundError : org/bouncycastle/cert/X509CertificateHolder
java.io.IOException: exception decrypting data - java.security.InvalidKeyException: Illegal key size
有什么想法吗
在ks.load()
代码行中使用的密码确切地说来自哪里(GlobalSign?服务器托管公司?我?)。当我发出上述导出命令时,这是否称为导出键
提前感谢您的评论
--------下面是代码片段---------
在main()中:
外干管():
但这会产生一个新的运行时错误:
java.io.IOException: PKCS12 key store mac invalid - wrong password or corrupted file.
java.lang.NoClassDefFoundError : org/bouncycastle/cert/X509CertificateHolder
java.io.IOException: exception decrypting data - java.security.InvalidKeyException: Illegal key size
我越来越近了吗
更新2:
我根据Bruno的评论安装了JCE,现在出现以下错误:
java.lang.NoClassDefFoundError : org/bouncycastle/tsp/TimeStampTokenInfo
更新3:
通过将bcpkix-jdk15on-149.jar从www.bounchycastle.org添加到/lib目录,并将以下内容添加到java程序中,我能够清除上述错误:
import org.bouncycastle.jce.provider.BouncyCastleProvider; // this was already there
import org.bouncycastle.tsp.TimeStampTokenInfo; // this is new and fixed the above error
现在我可以看到数字签名了
更新4:
对于那些感兴趣的人,请参阅我的后续帖子:
关于BouncyCastle错误:您使用的是哪个版本的BC?关于非法密钥大小:密钥大小是多少?密钥使用是否允许数字签名?(并非所有人都这么做。)最后,您是否安装了额外的JCE(标准SDK不允许您使用长密钥大小)。Thaks Bruno,我使用的是BouncyCastle bcprov-jdk15on-149.jar(最新版本)。我必须检查密钥大小,以及它是否允许数字签名。而且,我还没有安装任何额外的JCE——您指的是
Java加密扩展(JCE)无限强度权限策略文件7
?(如果是这样,我还没有安装,我需要吗?)JCE基本上就是罪魁祸首。见上文更新2和3。布鲁诺,非常感谢。顺便说一句,优秀的文档。这真的帮了大忙。如果你提交你的评论作为回答,我会接受。我正在写一本新的(免费的)电子书。结果,我不再像以前那样活跃了。感谢您更新问题,感谢您主动提出接受答案,如果我写一个,但更重要的是:我很高兴您能够解决问题。