【发布时间】: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