【发布时间】:2015-12-31 17:19:03
【问题描述】:
我使用 Java/BC 进行数字签名,在 OSX 上,密钥库使用以下方式初始化:
keystore = KeyStore.getInstance("KeychainStore", "Apple");
keystore.load(null, null);
和签名生成者:
ContentSigner sigGen = new JcaContentSignerBuilder("SHA1withRSA").setProvider(provider).build(pkey);
SignerInfoGenerator sigInfoGen = sigInfoGeneratorBuilder.build(sigGen, new X509CertificateHolder(x509.getEncoded()));
当 "Apple" 是 provider 时,我收到以下错误:
Caused by: org.bouncycastle.operator.OperatorCreationException: cannot create signer: no such algorithm: SHA1WITHRSA for provider Apple
at org.bouncycastle.operator.jcajce.JcaContentSignerBuilder.build(Unknown Source)
at com.unitech.crypto.signers.CmsSigner.sign(CmsSigner.java:51)
... 4 more
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: SHA1WITHRSA for provider Apple
at sun.security.jca.GetInstance.getService(GetInstance.java:101)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:218)
at java.security.Signature.getInstance(Signature.java:405)
at org.bouncycastle.jcajce.util.ProviderJcaJceHelper.createSignature(Unknown Source)
at org.bouncycastle.operator.jcajce.OperatorHelper.createSignature(Unknown Source)
... 6 more
另一方面,如果 provider 是“BC”,我会得到:
Caused by: org.bouncycastle.operator.OperatorCreationException: cannot create signer: Supplied key (null) is not a RSAPrivateKey instance
at org.bouncycastle.operator.jcajce.JcaContentSignerBuilder.build(Unknown Source)
at com.unitech.crypto.signers.CmsSigner.sign(CmsSigner.java:51)
... 4 more
Caused by: java.security.InvalidKeyException: Supplied key (null) is not a RSAPrivateKey instance
at org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.engineInitSign(Unknown Source)
at java.security.Signature$Delegate.engineInitSign(Signature.java:1174)
at java.security.Signature.initSign(Signature.java:527)
... 6 more
pkey 位于已连接的智能卡中(可从钥匙串访问),我可以使用 PKCS#11 例程对其进行签名,但我最好通过 BC 进行签名。
任何帮助/想法将不胜感激。
提前致谢。
【问题讨论】:
-
你有什么运气吗? Java 可以看到我的智能卡,但是当我调用 KeyStore.isKeyEntry(alias) 时它返回 false,而在 Windows 上它返回 true。
-
不走运。但是 PKCS#11 让我做我需要的一切,至少对于 OSX,甚至是 *nix。相同的方法适用于 Windows。
-
感谢您的回复,我最终也是这样做的(PKCS11)。
标签: java macos cryptography digital-signature