2016-11-05 4 views
6

Android 프로젝트를 개발 중입니다.PEM 인증서를 Android에 설치하는 올바른 방법

는 I는 PEM 인증서 문자열을 가지고

-----BEGIN CERTIFICATE----- 
MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD..AkGA1UEBhMCR0Ix 
EzARBgNVBAgTClNvbWUtU3RhdGUxFDASBgNVBAoTC0..0EgTHRkMTcwNQYD 
VQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcn..XRpb24gQXV0aG9y 
...MANY LINES... 
It8una2gY4l2O//on88r5IWJlm1L0oA8e4fR2yrBHX..adsGeFKkyNrwGi/ 
7vQMfXdGsRrXNGRGnX+vWDZ3/zWI0joDtCkNnqEpVn..HoX 
-----END CERTIFICATE----- 

I 바이트 배열 PEM 문자열 상기 디코딩

(CERT_STR라는 변수에 인증서 문자열 상기 할당)

byte[] pemBytes = Base64.decode(
       CERT_STR.replaceAll("-----(BEGIN|END) CERTIFICATE-----", "") 
         .replaceAll("\n", "") 
         .getBytes("UTF-8"), 
       Base64.DEFAULT 
     ); 

I 다음 코드에 따라 PEM 인증서를 Android 휴대 전화에 프로그래밍 방식으로 설치해보세요.

,451,515,
Intent intent = KeyChain.createInstallIntent(); 
// because my PEM only contains a certificate, no private key, so I use EXTRA_CERTIFICATE 
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, pemBytes);// above PEM bytes 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intent); 

내가 그 윈도우의 "OK"버튼을 누르면 (안드로이드 7 장치) 내 코드를 실행하면 안드로이드 시스템 인증서 설치 응용 프로그램은, 내가 로그 다음있어, 창을 팝업 :

java.io.IOException: stream does not represent a PKCS12 key store 
    at com.android.org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(PKCS12KeyStoreSpi.java:793) 
    at java.security.KeyStore.load(KeyStore.java:1247) 
    at com.android.certinstaller.CredentialHelper.loadPkcs12Internal(CredentialHelper.java:396) 
    at com.android.certinstaller.CredentialHelper.extractPkcs12Internal(CredentialHelper.java:364) 
    at com.android.certinstaller.CredentialHelper.extractPkcs12(CredentialHelper.java:354) 
    at com.android.certinstaller.CertInstaller$1.doInBackground(CertInstaller.java:328) 
    at com.android.certinstaller.CertInstaller$1.doInBackground(CertInstaller.java:327) 

내 질문 : 나는 intentEXTRA_CERTIFICATE & 세트에게 그것을 사용했다

  1. , 나는 EXTRA_PKCS12를 사용하지만, NOT하고있는 로그에서, 안드로이드 SY 줄기는 PKCS # 12 키 저장소를 설치하려고한다고 생각합니다. 왜?

  2. 프로그래밍 방식으로 Android에 PEM ​​인증서를 설치하는 올바른 방법은 무엇입니까?

+0

는'스트림이 PKCS12 키 store'에게 그것을 변환하지 어떤 이유를 나타내지 않는 것으로 보인다 수 있도록 안드로이드 CertInstaller 클래스를 포함하여 코드를 디버깅하는 것이 좋습니다 그러면 PKCS12로? –

+0

하지만 안드로이드에 PEM을 설치하는 올바른 방법이 무엇인지 알고 싶습니다. 제 질문의 요지입니다. –

+0

이것은 https://stackoverflow.com/questions/40464815/install-x509-certificate-programmatically-in-my-case – ozbek

답변

0

@Sergey Nikitin과 같이 코드가 작동해야합니다. 이 별표 표시된 example은 (는) Github에서 비슷한 코드를 사용합니다.

예외 로그를 ​​추적하려면 Android 7.1 소스 코드 CredentialHelper 및 을 검토했습니다. 독특한 도달 경로가

com.android.certinstaller.CredentialHelper.extractPkcs12(CredentialHelper.java:354) 

에서 pkcs12 로더를 실행하는 것은 내가 발견하지 않은 CredentialHelper.hasPkcs12KeyStore()

boolean hasPkcs12KeyStore() { 
    return mBundle.containsKey(KeyChain.EXTRA_PKCS12); 
} 

기본 할당 값이나 대체 경로에 의해 보호되는 방법 onScreenlockOk

private void onScreenlockOk() { 
    if (mCredentials.hasPkcs12KeyStore()) { 
     if (mCredentials.hasPassword()) { 
      showDialog(PKCS12_PASSWORD_DIALOG); 
     } else { 
      new Pkcs12ExtractAction("").run(this); 
     } 

입니다 그래서 어떤 식 으로든 KeyChain.EXTRA_PKCS12이 사용되고 있다고 추론합니다. 그것은 이상한 행동입니다, 당신은 깨끗한 & 재건 문제가있을 수 있습니까?

가 나는 엑스트라의 값을 확인하고 실행 코드가

관련 문제