【问题标题】:Bouncycastle AlgorithmIdentifier for EC_SIGN_P256_SHA256EC_SIGN_P256_SHA256 的 Bouncycastle 算法标识符
【发布时间】:2019-04-02 12:20:43
【问题描述】:

我需要使用来自谷歌 KMS 的密钥签署证书,然后验证即将到来的证书实际上是使用该密钥签署的。 我对大多数东西都使用了 bouncycastle 提供程序,但是找不到正确的 EC_SIGN_P256_SHA256 算法标识符(谷歌用来签署内容的算法)。

证书创建如下所示:

X509v3CertificateBuilder certificateBuilder = new X509v3CertificateBuilder(...);
ContentSigner contentSigner = new ContentSigner() {
  ...
  public AlgorithmIdentifier getAlgorithmIdentifier() {
    return new AlgorithmIdentifier(X9ObjectIdentifiers.prime256v1); // wrong
  }

  public byte[] getSignature() {
    byte[] messageHash = MessageDigest.getInstance("SHA-256").digest(this.out.toByteArray());
    return signAsymmetric(getKmsKeyName(), messageHash);
  }
}
X509CertificateHolder certificateHolder = certificateBuilder.build(contentSigner);
Certificate cert = new JcaX509CertificateConverter().getCertificate(certificateHolder);

signAsymmetric - 或多或少是从谷歌示例复制粘贴,似乎没问题。

验证是这样完成的:

public void verifyCertificate(Certificate signatureCertificate) {
  PublicKey publicKey = getAsymmetricPublicKey(getKmsKeyName());
  signatureCertificate.verify(publicKey);
}

如果我在 signatureCertificate.verify(...) 上使用 prime256v1,它会给出“java.security.NoSuchAlgorithmException: 1.2.840.10045.3.1.7 Signature not available”,而其他一些算法只会给出签名验证异常。 那么使用正确的方法或算法ID是什么?还是根本不可能?

【问题讨论】:

    标签: java cryptography bouncycastle google-cloud-kms


    【解决方案1】:

    我相信你会想要X9ObjectIdentifiers.ecdsa_with_SHA256

    【讨论】:

    • 是的,这是错误的对象标识符,您可以看到使用了 P256 命名曲线之一 here 而不是算法之一。
    【解决方案2】:

    我自己的错误(当然),它适用于“SHA256withECDSA”,但我也做了MessageDigest.getInstance("SHA-256").digest(),当然我不应该这样做。当签署实际数据而不是散列时,它工作正常。

    【讨论】:

    • 签名算法通常包含哈希作为配置参数,或者 - 在这种情况下 - 作为算法名称的一部分。有时您可以直接注入哈希(如果 API 允许您这样做,这实际上是一个不错的选择)但这通常不是默认设置。
    • 我想你需要知道,用什么算法来签名,这样你才能验证。但在我的情况下,首先创建哈希(从我要签名的内容)然后签署该哈希只是愚蠢的错误。
    猜你喜欢
    • 2013-08-13
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多