- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 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/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!