2011-10-17 63 views
5

Tôi đang viết một ứng dụng Android yêu cầu chứng nhận SSL cho các yêu cầu web nhất định. Không giống như các tùy chọn tôi thấy trực tuyến về việc tạo tệp kho khóa bằng tệp cert, tôi phải thực hiện yêu cầu web ban đầu trả về chứng chỉ dưới dạng chuỗi trong câu trả lời json.Android - chuyển đổi chuỗi chứng chỉ pkcs12 thành đối tượng chứng nhận x509 cho bks keystore

Các dữ liệu JSON được định dạng như sau ... (lưu ý: Giấy chứng nhận sau đây được rút ngắn, các "..." không tồn tại trong một phản ứng thực tế)

"result":{ 
    "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/eN...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk=" 
}, 

Tôi giải mã giá trị này sử dụng Base64.deocode để lưu nó như là một byte []

ssl.setPkcs12(Base64.decode(jsonObject.optString("pkcs12"))); 

Sau đó, tôi đang cố gắng để tạo ra một X509Certificate sử dụng byte []

CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
InputStream in = new ByteArrayInputStream(ssl.getPkcs12()); 
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(in); 

Mã của tôi là không vào phương pháp generateCertificate() với

"java.security.cert.CertificateException: org.apache.harmony.security.asn1.ASN1Exception: ASN.1 Sequence: mandatory value is missing at [4]". 

Tôi đã dành rất nhiều thời gian để sửa chữa những gì dường như là một vấn đề đơn giản không có may mắn chút nào. Bất kỳ trợ giúp sẽ là tuyệt vời!

+0

Bạn có thể dán phản hồi JSON có chứa chứng chỉ ở đây không? – emboss

+0

"kết quả": { "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH + zxKUkKGX/eN ... 9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk =" }, – calebisstupid

Trả lời

8

Trong trường hợp bất cứ ai khác cần câu trả lời ...

tôi đã có thể làm việc này bằng cách hoàn toàn tước ra các thư viện BouncyCastle và sử dụng một cửa hàng pkcs12 thay vì một BKS. Đoạn mã sau là giải pháp. Tôi không còn phải tạo một đối tượng chứng chỉ, thay vào đó tôi đang lưu chuỗi chứng chỉ json trong các tùy chọn, sau đó lấy nó và sử dụng nó để tạo kho khóa khi đang di chuyển. Bộ giải mã base64 không phải là bộ giải mã BouncyCastle, nó là bộ giải mã tiêu chuẩn tùy chỉnh.

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
String pkcs12 = UserSession.getCertificate(context); 
InputStream sslInputStream = new ByteArrayInputStream(MyBase64Decoder.decode(pkcs12.getBytes())); 
keyStore.load(sslInputStream, "password".toCharArray()); 
Các vấn đề liên quan