Мне нужно подписать сертификат с помощью ключа от KMS Google, а затем проверить, что этот сертификат был подписан этим ключом.
Я использую провайдер bouncycastle для большинства вещей, но не могу найти правильный AlgorithmIdentifier для EC_SIGN_P256_SHA256 (алгоритм, который Google использует для подписи контента).
Создание сертификата выглядит так:
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 - более или менее копирование-вставка из примера Google и, похоже, все в порядке.
проверка выполняется следующим образом:
public void verifyCertificate(Certificate signatureCertificate) {
PublicKey publicKey = getAsymmetricPublicKey(getKmsKeyName());
signatureCertificate.verify(publicKey);
}
Если я использую prime256v1 для signatureCertificate.verify (...), это дает «java.security.NoSuchAlgorithmException: 1.2.840.10045.3.1.7 Подпись недоступна», а с некоторыми другими алгоритмами это просто дает исключение проверки подписи.
Так какой же правильный путь или идентификатор алгоритма использовать? Или это вообще невозможно?