2011-10-17 3 views
5

특정 웹 요청에 SSL 인증이 필요한 안드로이드 응용 프로그램을 작성 중입니다. 인증서 파일을 사용하여 키 저장소 파일을 만드는 방법에 대한 온라인 옵션과 달리 인증서를 json 응답의 문자열로 반환하는 초기 웹 요청을 만들어야합니다.안드로이드 - bks 키 저장소 용 pkcs12 인증서 문자열을 x509 인증서 개체로 변환

JSON 데이터는 다음과 같은 ... 포맷 (참고 : 다음과 같은 인증서가가 "..."실제 응답에 존재하지 않는, 단축) 나는이 값을 디코딩하고

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

을 Base64.deocode를 사용하여 바이트로 저장하려면 [다음

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

내가 바이트를 사용하여 X509Certificate에를 만들기 위해 노력하고 있어요 []

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

내 코드는 내가 전혀 행운 간단한 문제가 보이는 것을 해결하기 위해 노력 많은 시간을 보냈습니다

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

으로 generateCertificate로() 메소드에 실패합니다. 어떤 도움이 굉장 할 것입니다! 다른 사람이 답을 필요로하는 경우에

+0

여기에 인증서가 포함 된 JSON 응답을 붙여 넣을 수 있습니까? – emboss

+0

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

답변

8

...

나는 완전히 BouncyCastle 라이브러리를 제거하고 대신 BKS의 PKCS12 저장소를 사용하여이 문제를 해결할 수 있었다. 다음 스 니펫이 해결책입니다. 더 이상 인증서 개체를 생성 할 필요가 없었습니다. 대신 json 인증서 문자열을 환경 설정에 저장 한 다음 잡아서 즉시 키 저장소를 생성하는 데 사용합니다. base64 디코더는 BouncyCastle 디코더가 아니며 사용자 정의 표준 디코더입니다.

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