我使用以下代码从 Athena 智能卡读卡器访问 PKCS#11 智能卡的内容。
Provider pkcs11Provider = new SunPKCS11(new ByteArrayInputStream (config.getBytes()));
if (Security.getProvider(pkcs11Provider.getName()) != null) {
Security.removeProvider(pkcs11Provider.getName());
}
Security.addProvider(pkcs11Provider);
KeyStore myKeyStore = KeyStore.getInstance ("PKCS11", pkcs11Provider);
myKeyStore.load(null, keystore_password.toCharArray());
return myKeyStore;
Run Code Online (Sandbox Code Playgroud)
问题如下:
根据http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html,KeyStore.Builder使用该类时,使用同一智能卡首次成功加载后不会要求输入密码。当然,我在上面的代码中没有使用这个类。同样的事情也适用于 KeyStore.getInstance(...)方法吗?有没有办法让密钥库在输入错误密码时抛出异常,无论以前的加载尝试如何?
我正在尝试对 XML 文档进行数字签名。为此我有两个选择。有一个由爱沙尼亚认证中心为程序员创建的库,还有一个由银行制作的运行 Java 代码的脚本。如果使用官方(认证中心)库,那么一切都会像魅力一样进行一些调整,但是当涉及到银行脚本时,它会变得疯狂,导致错误:
java.io.IOException: %1 is not a valid Win32 application.
esteid-pkcs11
at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.connect(Native Method)
at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.<init>(PKCS11Implementation.java:166)
at iaik.pkcs.pkcs11.wrapper.PKCS11Connector.connectToPKCS11Module(PKCS11Connector.java:75)
at iaik.pkcs.pkcs11.Module.getInstance(Module.java:202)
at client.smartcard.SmartcardHelper.initializePKCS11Module(SmartcardHelper.java:46)
at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:29)
at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:21)
at client.Signer.main(Signer.java:36)
10:03:31 ERROR - Signing failed: PKCS11 initialization failed
java.lang.RuntimeException: PKCS11 initialization failed
at client.smartcard.SmartcardHelper.initializePKCS11Module(SmartcardHelper.java:52)
at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:29)
at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:21)
at client.Signer.main(Signer.java:36)
Caused by: java.io.IOException: %1 is not a valid Win32 application.
esteid-pkcs11
at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.connect(Native Method)
at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.<init>(PKCS11Implementation.java:166)
at iaik.pkcs.pkcs11.wrapper.PKCS11Connector.connectToPKCS11Module(PKCS11Connector.java:75)
at iaik.pkcs.pkcs11.Module.getInstance(Module.java:202)
at client.smartcard.SmartcardHelper.initializePKCS11Module(SmartcardHelper.java:46)
... 3 more
Run Code Online (Sandbox Code Playgroud)
Esteid-pkcs11文件是特定于国家/地区的 dll 文件。我在谷歌上阅读了很多针对导致相同错误的问题的回复,但似乎没有一个回复能解决问题。我已经安装了JDK(64位)和JRE(32位)。我想也许 …
我尝试使用 j2pkcs11.dll (与 jdk1.8.0 - 64 位打包)来访问存储在智能卡上的证书,但并非无法使其工作。
--- 动态添加 SunPKCS11 提供程序的示例代码 ---
String pkcs11ConfigSettings = "name = " + "TestSmartCard" + "\n" + "library = " + "C:/jdk1.8.0_11/jre/bin/j2pkcs11.dll";
byte[] pkcs11ConfigBytes = pkcs11ConfigSettings.getBytes();
ByteArrayInputStream confStream = new ByteArrayInputStream(pkcs11ConfigBytes);
Provider p = new sun.security.pkcs11.SunPKCS11(confStream);
Run Code Online (Sandbox Code Playgroud)
----我得到的例外---
java.security.ProviderException: Initialization failed
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:376)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103)
at scpoc.SmartCard.main(SmartCard.java:28)
Caused by: java.io.IOException: The specified procedure could not be found.
at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method)
at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:138)
at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:151)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:313)
Run Code Online (Sandbox Code Playgroud)
JEP 131 声称在 Java 8 中支持 PKCS11 ( http://openjdk.java.net/jeps/131 …
我的应用程序充当交换机,在两方之间传输非常敏感的消息,我试图弄清楚如何在不“查看”他们试图发送的消息的情况下做到这一点。
我有一个 HSM,并且我已经为发送者生成了一个密钥对 - 他们将使用我提供给他们的公钥来加密消息,而我可以使用 HSM 中的私钥来解密消息。
然后,我将通过使用我拥有的最终接收者的公钥对其进行加密来传递该消息。
有没有什么方法可以在 HSM 内链接这两个操作,而不会将解密的消息放在我的应用程序内存附近?我希望明文内容永远不会离开 HSM 的边界。
我知道某些 HSM 具有 CodeSafe / SEE 机器功能,可让我编写嵌入式系统代码并在 HSM 内运行它,在我开始讨论之前,我想看看是否有办法使用通用 PKCS / JCE / CNG API安全地做到这一点。
我正在使用 Python 的 pkcs11 包来访问存储在 Yubikey 5 上的 X.509 证书。使用 pkcs11 对象访问证书、公钥和私钥工作正常,签名和签名验证也是如此。然而,对于我的一生,我无法弄清楚为什么使用公钥加密不起作用。这是我的代码:
import pkcs11
from pkcs11 import Attribute, ObjectClass, KeyType, util
lib = pkcs11.lib('/usr/lib/x86_64-linux-gnu/pkcs11/onepin-opensc-pkcs11.so')
token = lib.get_token(token_label='PIV Card Holder pin (PIV_II)'
session = token.open(user_pin=pin)
# Getting a private and a public key as pkcs11 Object
private = next(session.get_objects({
Attribute.CLASS: ObjectClass.PRIVATE_KEY,
}))
public = next(session.get_objects({
Attribute.CLASS: ObjectClass.PUBLIC_KEY,
}))
data = 'Hello, world!'
sig = private.sign(data) # Works!
sig_verif = public.verify(data, sig) # Works!
print("Signature is valid? "+str(sig_verif)) # True
# So …Run Code Online (Sandbox Code Playgroud) 我正在寻找对给定文件进行签名并以CMS格式获取输出的最简单方法,但这必须使用PKCS11提供程序,因为用于签名的私钥位于智能卡上。
我可以使用openssl从命令行获取格式正确的签名文件(但请注意,这是从文件而非智能卡获取证书)
openssl cms -sign -in sign.txt -out signout.txt -signer signer.pem -outform DER
我想使用可能的最薄包装器从代码中执行此操作。我可以使用openssl库,但要支持pkcs11,您需要通过引擎连接(opensc有一个引擎),但是它开始变得很大。令我惊讶的是,某处必须有一个简单的PKCS11包装器。
如果包装器位于“ C”或.net中,我感到很高兴。如果我知道如何将CMSCS输出,那么我可以自己致电PKCS11提供者并进行签名,所以也许一个库就足够了?
最好的祝愿詹姆斯
这些参数有什么区别?我已经阅读了文档,但我仍然对此表示怀疑。仅仅是索引规则(1..N对0..N-1)还是其他?如果可能,我希望对这些参数有更好的解释。
我可以配置XAdES4J来委派签名创建使用PKCS#11基础架构给硬件安全模块(HSM)?如果是 - 如何?
这些网站上的信息让我假设,只有使用PKCS#11的密钥转移是可能的:
当我尝试从命令行执行许多不同的操作时,我得到一个gnome-keyring警告,比如svn.例:
$ lp README.txt
WARNING: gnome-keyring:: couldn't connect to: /run/user/dargaud/keyring-kAKdPw/pkcs11: No such file or directory
request id is lpsc0204pnb-366 (1 file(s))
Run Code Online (Sandbox Code Playgroud)
/ run/user/dargaud/keyring -kAKdPw/pkcs11不存在(那里只有一个'control'套接字).我正在使用Kubuntu,那么为什么有人试图首先使用gnome keyring而不是kwallet呢?
谢谢
朋友们,我有一张智能卡,我想整合OpenSSL.计划通过OpenSSL中的"ENGINE"系统执行此操作.但是,我有一个理解的问题.有这样的事情这一事实engine_pkcs11,opensc,libp11,pkcs11-helper.有谁可以解释这种关系?首先是什么和什么编译?
写一个带有外部PKCS#11函数的库来将它连接到openssl是否足够?我必须获取库的源代码engine_pkcs11并修改它以适合我的卡?我需要这个opensc,libp11,pkcs11-helper?那么,为什么需要这些库呢?
另外,我应该注意到智能卡不支持RSA算法,它将是一个不同的算法!
真的很期待你的答案!