2016-11-07 46 views
7

Pracuję nad projektem Android. Mam ciąg certyfikatu PEM:Zainstalować programowo certyfikat X509 w moim przypadku

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

(I przypisany powyżej łańcucha certyfikatów do zmiennej o nazwie CERT_STR)

przekonwertować powyżej PEM ciąg do X509Certificate przez:

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); 

Wtedy staram aby zainstalować programistycznie programowo:

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); 

Kiedy Uruchamiam moją aplikację, widzę okno systemowe z napisem "Wyodrębnianie ...", Wiem, że system wyodrębnia mój certyfikat, ale to okno pokazuje tam cały czas mówiąc "Wydobywanie ...".

Dlaczego? Gdzie się mylę w moim kodzie, aby zainstalować certyfikat?

+0

Kod, który posiadasz, wymaga certyfikatu binarnego, a nie kodowanego w standardzie base64. – Robert

+0

@Robert, nie bardzo rozumiem twoje słowa, która część mojego kodu używa kodowania base64? –

+0

Część między BEGINEM a END CERTIFICATE jest certyfikatem zakodowanym w base64. Certyfikat x.509 CertificateFactory wymaga certyfikatu binarnego AFAIR. – Robert

Odpowiedz

3

Prawdopodobnie nie używasz poprawnie utworzonego certyfikatu X509. Obserwowany pracował na mój koniec, a ja nie widzę żadnych „Wyciąganie ...” dialogowe (Nexus 5X, Android 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); 

Aby wygenerować powyższy certyfikat, użyłem następujące kroki (na podstawie 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 

Potem wystarczy skopiować/wklejony wyjście z cat rsacert.pem do x509cert.

Mam nadzieję, że to pomoże.

+0

@Robert dzięki za heads-up. Miało to wykazać, że instalacja certyfikatu działa z poprawnie wygenerowanym certyfikatem X509. Niemniej jednak zaktualizowano powyższą odpowiedź. – ozbek

+0

@ozbek, czy testowałeś w urządzeniu Android 7 Nougat? Mam ten problem w systemie Android 7. –

+0

@ Leem.fin: tak, przetestowany na Nexusie 5X z Androidem 7.0 – ozbek