Как получить PublicKey от PKCS10CertificationRequest с помощью новой библиотеки надувной замок?

в новой версии библиотеки надувной замок есть изменения в PKCS10CertificationRequest. В предыдущих версиях можно было получить PublicKey от такого запроса с помощью getPublicKey() метод (см. старый док).

теперь этот метод исчез. Как я могу получить PublicKey от С от такого запроса? Есть getSubjectPublicKeyInfo().parsePublicKey() но он возвращает ASN1Primitive.

Я вижу это из SPKAC NetscapeCertRequest Я все еще могу читать PublicKey напрямую, позвонив getPublicKey().

4 ответов


в основном пакете поставщика есть класс утилиты под названием PublicKeyFactory. Метод createKey возвращает AsymmetricKeyParameter который вы бросаете на любой тип открытого ключа, например

SubjectPublicKeyInfo pkInfo = pkcs10CertReq.getSubjectPublicKeyInfo();
RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pkInfo);

EDIT 1:

кроме того, чтобы создать java.security.PublicKey необходимо сделать еще несколько шагов:

RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent());
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey rsaPub = kf.generatePublic(rsaSpec);

Я смотрел на ту же проблему, и это тоже будет работать (с тем преимуществом, что нам не нужно указывать алгоритм):

SubjectPublicKeyInfo pkInfo = pkcs10CertReq.getSubjectPublicKeyInfo();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
PublicKey pubKey = converter.getPublicKey(pkInfo);

посмотреть org.после установки BouncyCastle.в OpenSSL.jcajce.JcaPEMKeyConverter


Как насчет использования JcaPKCS10CertificationRequest?

JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest = new JcaPKCS10CertificationRequest(pkcs10CertReq);
PublicKey publicKey = jcaPKCS10CertificationRequest.getPublicKey();

PKCS10CertificationRequest csr =...;    
PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(csr.getSubjectPublicKeyInfo().toASN1Primitive().getEncoded()));

RFC 2986-PKCS #10: синтаксис запроса сертификации

CertificationRequestInfo ::= последовательность {
версия INTEGER { v1(0) } (v1,...),
имя субъекта
subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
атрибуты [0] атрибуты{{ CRIAttributes }}
}

SubjectPublicKeyInfo { алгоритм: IOSet} :: = последовательность {
алгоритм AlgorithmIdentifier {{IOSet}},
subjectPublicKey бит строка
}

и затем вы можете увидеть документ java.безопасность.спекуляция.X509EncodedKeySpec

SubjectPublicKeyInfo ::= последовательность {
алгоритм AlgorithmIdentifier,
subjectPublicKey битовая строка }

таким образом, вы будете знать, что кодировка этого открытого ключа-X. 509. а затем измените его на X509EncodedKeySpec и генерировать открытый ключ keyFactory