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