【问题标题】:Digital signature in OSX with smartcard and BC带有智能卡和 BC 的 OSX 中的数字签名
【发布时间】: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


【解决方案1】:

Bouncy Castle 是一家纯软件提供商。它无法处理硬件密钥,因此您需要使用 Apple 或 PKCS#11 提供程序。安全硬件令牌的整体理念是密钥留在设备中。 BC 要求密钥在内存中

您可能想尝试其他签名生成功能,例如"SHA256withRSA"。使用 SHA-1 对消息进行签名现在被认为是不安全的。

【讨论】:

  • 我认为“keychain”/apple 就像“windows-my”,可能不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
相关资源
最近更新 更多