gpt4 book ai didi

java - iText:使用java对PDF文档进行数字签名并观察java.security.NoSuchAlgorithmException错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:42 26 4
gpt4 key购买 nike

我有一个 SafeNet eToken 5100 USB token ,上面有 PDF 数字签名证书。我配置了 Windows 和 Mac 系统来使用它,并且我成功地在两台机器上使用其证书手动签署 PDF 文件。因此该证书按预期工作。

我将 token 发送给我的网络托管公司,他们将其放置在我的 Linux (CentOS) 服务器上。我在服务器上安装了 SafeNet 身份验证客户端。

现在我尝试使用 iText 来应用签名。我正在遵循这本优秀书籍中的代码示例 4.2:http://itextpdf.com/book/digitalsignatures 。我的代码是:

    String config = "name = eToken5100_20130805\n" +
"library = /usr/lib64/libeTPkcs11.so\n" +
"slot = 0"; // create a dynamic conf file
ByteArrayInputStream bais = new ByteArrayInputStream(config.getBytes());
Provider providerPKCS11 = new SunPKCS11(bais);
Security.addProvider(providerPKCS11);
System.out.println(providerPKCS11.getName());
BouncyCastleProvider providerBC = new BouncyCastleProvider();
Security.addProvider(providerBC);

KeyStore ks = KeyStore.getInstance("PKCS11", providerPKCS11);
ks.load(null, K.PASS_TOKEN);
String alias = (String)ks.aliases().nextElement();
PrivateKey pk = (PrivateKey)ks.getKey(alias, K.PASS_TOKEN);
Certificate[] chain = ks.getCertificateChain(alias);
OcspClient ocspClient = new OcspClientBouncyCastle();
TSAClient tsaClient = null;
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = (X509Certificate)chain[i];
String tsaUrl = CertificateUtil.getTSAURL(cert);
if (tsaUrl != null) {
tsaClient = new TSAClientBouncyCastle(tsaUrl);
break;
}
}
List<CrlClient> crlList = new ArrayList<CrlClient>();
crlList.add(new CrlClientOnline(chain));
sign(userFile, userFile_signed, chain, pk, DigestAlgorithms.SHA256, providerPKCS11.getName(),
CryptoStandard.CMS, "Test", "Ghent", crlList, ocspClient, tsaClient, 0);

当我运行此代码时,它会生成以下运行时错误:

stack trace: java.security.KeyStoreException: PKCS11 not found
Caused by: java.security.NoSuchAlgorithmException: no such algorithm:
PKCS11 for provider SunPKCS11-eToken5100_20130805

This link表示错误的 keystore 类型可能会生成此错误。我检查了我的 ~glassfish/java/jdk7u25/jdk1.7.0_25/jre/lib/security/java.security 文件,它使用 jks 的 keystore 。但是,将其更改为 PKCS11 会导致我的 GlassFish 服务器无法重新启动。所以我将其保留为jks

问题 1:这会导致问题吗?如果是,如何解决?

问题 2:我刚刚在上面的 java 代码中编写了名称 eToken5100_20130805...但是这个名称是否需要与某个地方的其他名称匹配? (上面的 Java 代码是我输入此名称的唯一位置)。

问题 3:我知道库是正确的,但如何确定插槽号?我手动输入了插槽 0 到 6(只是猜测),它们都产生了上面所示的相同错误。此外,如果我输入槽号 7 到 10,每次都会抛出 PKCS11Exception CKR_SLOT_ID_INVALID。

我对这个主题了解不多,但我尝试通过各种方式确定插槽号:

(A) 我不确定以下语法是否正确:

# keytool -v -list -keystore NONE -storetype PKCS11 -providername SunPKCS11-eToken5100_20130805 -J-Djava.security.debug=sunpkcs11,pkcs11

但它返回以下输出:

keytool error: java.security.NoSuchProviderException: no such provider: SunPKCS11-eToken5100_20130805
java.security.NoSuchProviderException: no such provider: SunPKCS11-eToken5100_20130805
at sun.security.jca.GetInstance.getService(GetInstance.java:83)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at java.security.Security.getImpl(Security.java:698)
at java.security.KeyStore.getInstance(KeyStore.java:661)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:765)
at sun.security.tools.KeyTool.run(KeyTool.java:340)
at sun.security.tools.KeyTool.main(KeyTool.java:333)

(B) 我还尝试使用 modutil 来查找插槽编号:

# modutil -list -dbdir $HOME/.mozilla/firefox/*.default

但我不确定它返回以下内容时意味着什么:

winscard_clnt.c:420:SCardEstablishContextTH() Your pcscd is too old and does not support CMD_VERSION
winscard_clnt.c:420:SCardEstablishContextTH() Your pcscd is too old and does not support CMD_VERSION

Listing of PKCS #11 Modules
-----------------------------------------------------------
1. NSS Internal PKCS #11 Module
slots: 2 slots attached
status: loaded

slot: NSS Internal Cryptographic Services
token: NSS Generic Crypto Services

slot: NSS User Private Key and Certificate Services
token: NSS Certificate DB

2. eToken
library name: libeTPkcs11.so
slots: 6 slots attached
status: loaded

slot:
token:

slot:
token:

slot:
token:

slot:
token:

slot:
token:

slot:
token:

(C)最后,我尝试运行

# pkcs11-tool --module /usr/lib64/libeTPkcs11.so --list-slots 

但这需要先安装 openSC 才能获取 pkcs11-tool。当我尝试使用:# yum install opensc.x86_64进行安装时,出现以下错误:

Transaction Check Error: 
file /usr/lib64/libpcsclite.so.1.0.0 from install of pcsc-lite-libs-1.5.2-13.el6_4.x86_64
conflicts with file from package libpcsclite1-1.4.0-9.el6.x86_64`

我不知道如何克服这个错误。

我可以使用一些帮助来导航这些不熟悉的错误,以了解问题是什么,然后如何解决它。插槽编号是否确实不正确(插槽编号可以很大,例如 31310?到目前为止我假设它们是个位数...),还是其他什么?

----------更新----------

我的 Linux 机器安装了一个用于 libpcsclite1 的软件包,导致了上述错误。我卸载了 SafeNet Auth Client (SAC),删除了此软件包,安装了 pcsc-lite(使用 yum),然后重新安装了标准 SAC。我还使用 yum 安装了 opensc,这样我就可以使用 pkcs11-tool。我现在可以使用以下命令查看插槽:

# pkcs11-tool --module /usr/lib64/libeToken.so -L
Available slots:
Slot 0 (0x0): AKS xxxx 00 00
token label: my label
token manuf: SafeNet, Inc.
token model: eToken
token flags: rng, login required, PIN initialized, token initialized, other flags=0x200
serial num : xxxxxxx
Slot 1 (0x1):
(empty)
Slot 2 (0x2):
(empty)
Slot 3 (0x3):
(empty)
Slot 4 (0x4):
(empty)
Slot 5 (0x5):
(empty)

现在我可以运行所有内容而不会产生运行时错误。但是,生成的 PDF 文件显示“至少有一个签​​名无效”。 [更新:我的错误,我查看了错误的文件。已签名的 PDF 文件显示有效签名。]

最佳答案

您的 JVM 使用的 keystore 与您的情况无关。您的 key 存储在您的 eToken 中。这是您在使用这些行时尝试加载的 keystore :

KeyStore ks = KeyStore.getInstance("PKCS11", providerPKCS11);
ks.load(null, K.PASS_TOKEN);

因此你的问题1无关紧要。顺便说一句:当我创建 KeyStore 的实例时,我没有传递提供程序。如果删除 providerPKCS11 会发生什么?当您将提供程序添加到 Security 实例时,它应该会找到该提供程序。

在您的配置文件中,您选择了名称 eToken5100_20130805 ,这很好。您可以使用任何您想要的名称。这回答了你的问题 2。

对于你的问题3,如果你引用的书(如果我是作者),第4.1.2节中有一个关于如何找到你需要的插槽的示例,但如果你需要一个更简单的例子,请阅读StackOverflow上这个问题的答案:java keytool with opensc pkcs#11 provider only works with debug option enabled

请注意,您已确定该提供商可以正常工作。您的配置文件已正确读取,否则您将看不到您在异常中选择的名称 (SunPKCS11-eToken5100_20130805)。问题是您无法加载 keystore 。我找到了this post关于这个问题。我不确定这是否有帮助。

无论如何:您的尝试 (A) 永远不会起作用,因为 keytool 不知道配置文件,因此不知道您选择的名称。由于 Linux 上的工具之间存在冲突,您的尝试 (C) 失败。我不知道您在 (B) 中提到的 modutil 工具,但如果我看到输出,我会假设访问 token 的库已正确加载,并且服务器中有 6 个 USB 插槽,但这些插槽中没有 USB token 。也许就这么简单:也许您的 USB token 没有插入到服务器的 USB 插槽中,或者可能已插入,但由于硬件驱动程序问题而看不到。

我会先咨询托管公司。

关于java - iText:使用java对PDF文档进行数字签名并观察java.security.NoSuchAlgorithmException错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com