2016-11-07 5 views
7

Я разрабатываю проект Android. У меня есть строка сертификата PEM:установить сертификат X509 программно в моем случае

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

(я назначил выше строки сертификата переменной с именем CERT_STR)

конвертировать выше PEM строки в X509Certificate по:

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

Тогда, я стараюсь для установки сертификата программным путем:

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

@Robert, я не совсем понимаю ваши слова, какая часть моего кода использует кодировку base64? –

+0

Часть между BEGIN и END CERTIFICATE является закодированным кодом base64. У сертификата x.509 CertificateFactory требуется AFAIR бинарный сертификат. – Robert

ответ

3

Возможно, вы не используете правильно созданный сертификат X509. Следуя работал на моем конце, и я не видел ни одного «Распаковка ...» диалог (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); 

Сформировать выше сертификат, я использовал следующие шаги (на основе 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? У меня эта проблема в Android 7. –

+0

@ Leem.fin: да, протестирован на Nexus 5X с Android 7.0 – ozbek

Смежные вопросы