0

我需要使用来自谷歌 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是什么?或者根本不可能以这种方式?

4

2 回答 2

2

我相信你会想要X9ObjectIdentifiers.ecdsa_with_SHA256的。

于 2019-04-02T14:03:24.947 回答
1

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

于 2019-04-02T13:31:07.267 回答