2012-06-14 19 views
6

Trong phiên bản mới của thư viện Lâu đài Bouncy có những thay đổi trong PKCS10CertificationRequest. Trong các phiên bản trước, có thể nhận được PublicKey từ yêu cầu như vậy bằng cách sử dụng phương thức getPublicKey() (xem old doc).Cách lấy PublicKey từ PKCS10CertificationRequest bằng thư viện Bouncy Castle mới?

Hiện tại, phương pháp này đã bị từ chối. Làm thế nào tôi có thể nhận được PublicKey từ với yêu cầu như vậy? Có getSubjectPublicKeyInfo().parsePublicKey() nhưng trả về ASN1Primitive.

Tôi thấy rằng từ SPKAC NetscapeCertRequest Tôi vẫn có thể đọc PublicKey trực tiếp bằng cách gọi getPublicKey().

Trả lời

11

Có một lớp tiện ích trong gói nhà cung cấp chính có tên là PublicKeyFactory. Phương thức createKey trả lại một AsymmetricKeyParameter mà bạn truyền tới bất kỳ loại khóa công khai nào phù hợp, ví dụ:

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

EDIT 1:

Bên cạnh đó, để tạo ra một java.security.PublicKey thêm một vài bước cần thiết:

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

Cảm ơn, nhưng khi tôi thử truyền nó, tôi nhận được: 'java.lang.ClassCastException: org.bouncycastle.crypto.params.RSAKeyParameters không thể được đưa vào java.security .PublicKey' –

+0

Michal Niklas: Không, tất nhiên là không, tôi muốn đưa nó vào loại khóa công khai Bouncycastle thích hợp. Tôi sẽ thêm mã để chuyển đổi sang khóa công khai Java trong một phút –

+0

Nó hoạt động ngay bây giờ! Cảm ơn! –

1

gì về việc sử dụng JcaPKCS10CertificationRequest?

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

Chỉnh sửa câu trả lời của bạn bằng lời giải thích. – gsamaras

4

tôi đang tìm kiếm tại cùng một vấn đề, và điều này sẽ làm việc quá (với lợi thế mà chúng ta không cần phải xác định thuật toán):

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

Xem org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter

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

RFC 2986 - PKCS #10: Certification Request Syntax

CertificationRequestInfo :: = SEQUENCE {
phiên bản INTEGER {v1 (0)} (v1, ...),
Tên đối tượng,
subjectPKInfo SubjectPublicKeyInfo {{PKInfoAlgorithms}},
thuộc tính [0] Các thuộc tính {{CRIAttributes} }
}

SubjectPublicKeyInfo {thuật toán: IOSet} :: = SEQUENCE {
thuật toán AlgorithmIdentifier {{IOSet}},
subjectPublicKey BIT STRING
}

và sau đó, bạn có thể xem tài liệu của java.security.spec.X509EncodedKeySpec

SubjectPublicKeyInfo :: = SEQUENCE {
thuật toán AlgorithmIdentifier,
subjectPublicKey BIT STRING}

vì vậy bạn sẽ biết mã hóa của khóa công khai này là X.509.và sau đó thay đổi nó thành X509EncodedKeySpec và tạo khóa công khai bằng keyFactory

+0

mã của James K Polk đang chuyển đổi khóa thành mã hóa PKCS # 1 – sjaojya

+0

bằng cách sử dụng JcaPKCS10CertificationRequest là một ý tưởng hay, mã của amareno – sjaojya

Các vấn đề liên quan