2011-10-17 10 views
5

Piszę aplikację dla systemu Android, która wymaga certyfikatu SSL dla niektórych żądań internetowych. W przeciwieństwie do opcji, które widzę w trybie online, dotyczących tworzenia plików magazynu kluczy przy użyciu pliku cert, muszę wykonać wstępne żądanie WWW, które zwraca certyfikat jako ciąg znaków w odpowiedzi json.Android - konwersja łańcucha certyfikatów pkcs12 na obiekt certyfikatu x509 dla magazynu kluczy bks

dane JSON jest sformatowany jak następujących ... (Uwaga: po zaświadczenie ulega skróceniu, w „...” nie istnieje w rzeczywistej odpowiedzi)

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

ja dekodowania tej wartości stosując Base64.deocode aby zapisać go jako byte []

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

Wtedy staram się stworzyć X509Certificate pomocą byte []

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

Mój kod nie udaje się na metodzie generateCertificate() z

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

Spędziłem dużo czasu próbując ustalić, co wydaje się być prosty problem bez powodzenia w ogóle. Każda pomoc byłaby niesamowita!

+0

Czy można tutaj wkleić odpowiedź JSON zawierającą certyfikat? – emboss

+0

"Wynik": { "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH + zxKUkKGX/eN ... 9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk =" }, – calebisstupid

Odpowiedz

8

W przypadku ktoś potrzebuje odpowiedź ...

udało mi się obejść całkowicie odpędzania z bibliotek BouncyCastle i korzystania sklep pkcs12 zamiast BKS. Poniższy fragment jest rozwiązaniem. Nie musiałem już generować obiektu certyfikatu, zamiast tego zapisuję ciąg certyfikatów json w preferencjach, a następnie chwytam i używam go do generowania magazynu kluczy w locie. Dekoder base64 nie jest dekoderem BouncyCastle, jest to niestandardowy dekoder standardowy.

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
String pkcs12 = UserSession.getCertificate(context); 
InputStream sslInputStream = new ByteArrayInputStream(MyBase64Decoder.decode(pkcs12.getBytes())); 
keyStore.load(sslInputStream, "password".toCharArray()); 
Powiązane problemy