2016-11-07 23 views
7

Android 프로젝트를 개발 중입니다.내 경우 프로그래밍 방식으로 X509 인증서를 설치하십시오.

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

I에 의해이 X509Certificate에 PEM ​​문자열 위의 변환

(나는 CERT_STR라는 변수에 인증서 문자열 위의 할당) : 다음

byte[] certBytes = CERT_STR.getBytes(); 
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
InputStream certIs = new ByteArrayInputStream(certBytes); 
// now I get the X509 certificate from the PEM string 
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(certIs); 

, 내가하려고 내가 PEM 인증서 문자열이 프로그래밍 방식으로 인증서를 설치하는 방법 :

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

내 응용 프로그램을 실행, 시스템 대화 상자가 "압축 풀기 ..."라는 메시지가 나타나면 시스템에서 내 인증서를 추출한다는 것을 알고 있지만 그 대화 상자에는 항상 "추출 중 ..."이라는 이 표시됩니다.

왜? 인증서를 설치하는 코드가 어디에서 잘못 되었습니까?

+0

코드에는 base64로 인코딩 된 코드가 아니라 바이너리 인증서가 필요합니다. – Robert

+0

@ 로버트, 나는 내 코드의 어느 부분이 base64 인코딩을 사용하는지 당신의 말을 이해하지 못합니까? –

+0

BEGIN과 END CERTIFICATE 사이의 부분은 base64로 인 코드 된 인증서입니다. x.509 CertificateFactory는 AFAIR에 바이너리 인증서가 필요합니다. – Robert

답변

3

제대로 생성 된 X509 인증서를 사용하고 있지 않은 것 같습니다. 내 말에 일을 다음과 내가 어떤 대화 (넥서스 5 배, 안드로이드 7.0) ... "추출"을 참조하지 않았다 :

String x509cert = "-----BEGIN CERTIFICATE-----\n" + 
     "MIICrjCCAhegAwIBAgIJAO9T3E+oW38mMA0GCSqGSIb3DQEBCwUAMHAxCzAJBgNV\n" + 
     "BAYTAlVaMREwDwYDVQQHDAhUYXNoa2VudDENMAsGA1UECgwERWZpcjEQMA4GA1UE\n" + 
     "CwwHSVQgZGVwdDEQMA4GA1UEAwwHZWZpci51ejEbMBkGCSqGSIb3DQEJARYMaG9z\n" + 
     "dEBlZmlyLnV6MB4XDTE2MTExMDA4MjIzMFoXDTE2MTIxMDA4MjIzMFowcDELMAkG\n" + 
     "A1UEBhMCVVoxETAPBgNVBAcMCFRhc2hrZW50MQ0wCwYDVQQKDARFZmlyMRAwDgYD\n" + 
     "VQQLDAdJVCBkZXB0MRAwDgYDVQQDDAdlZmlyLnV6MRswGQYJKoZIhvcNAQkBFgxo\n" + 
     "b3N0QGVmaXIudXowgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL60mG0Gpl7s\n" + 
     "3qMnZcURB1xk5Qen6FN0+AJB5Z/WHA50n1MUkXNY28rkEYupkxpfEqR+/gXgBUAm\n" + 
     "FACA3GSdoHMMY1kdeAzxsYbBEbtGKHICF/QFGTqScWmI6uBUwzsLDLv1ELef/zEY\n" + 
     "Ru/krXtNh8ZNYyfwVKyZaB9+3M2yOqATAgMBAAGjUDBOMB0GA1UdDgQWBBS1nH3O\n" + 
     "ecLDrIZLZ/f1WsNL/xtuEzAfBgNVHSMEGDAWgBS1nH3OecLDrIZLZ/f1WsNL/xtu\n" + 
     "EzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAGzjJnXODvF9UHBKHAUF\n" + 
     "kzisr78Og5BrKyAgdnjH196Jg4MO7RNJdQAmuAIk9aBB/jvAiznhhbcD3mYImH+h\n" + 
     "F0Scewk5m736ydGhkcUpmxA5ye1hajjs9V7PQD2O4a8rNJSlJjiWRWSqxTfH79Ns\n" + 
     "B7x2HND9LU/iz02ugGJ8vwg8\n" + 
     "-----END CERTIFICATE-----\n"; 
Intent intent = KeyChain.createInstallIntent(); 
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509cert.getBytes()); 
startActivity(intent); 

위의 인증서를 생성하기 위해, 나는 다음 단계를 사용 (Generating Keys and Certificates for SSO 기준) :

$ openssl genrsa -out rsaprivkey.pem 1024 

$ openssl req -new -x509 -key rsaprivkey.pem -out rsacert.pem 

$ ls 
rsacert.pem rsaprivkey.pem 

그때 나는 단순히 복사/cat rsacert.pem에서 x509cert 출력을 붙여.

희망이 도움이됩니다.

+0

@Robert는 헤드 업에 감사드립니다. 이는 제대로 생성 된 X509 인증서로 인증서 설치가 작동하고 있음을 보여줍니다. 그럼에도 불구하고 위의 대답을 업데이트했습니다. – ozbek

+0

@ozbek, Android 7 Nougat 기기에서 테스트 해 보셨나요? –

+0

@ Leem.fin : 예, Android 7.0의 Nexus 5X에서 테스트했습니다. – ozbek