2016-11-05 14 views
6

Tôi đang phát triển một dự án Android.Một cách thích hợp để cài đặt PEM certifiate trong Android

Tôi có một chuỗi chứng PEM:

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

(giao trên chuỗi chứng chỉ cho một biến có tên CERT_STR)

tôi giải mã trên PEM chuỗi để mảng byte:

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

tôi cố gắng cài đặt theo chương trình chứng chỉ PEM cho điện thoại Android của tôi bằng cách làm theo mã:

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

Khi chạy mã của tôi (trong Android 7 thiết bị), các ứng dụng cài đặt giấy chứng nhận hệ thống Android bật lên cửa sổ, khi tôi nhấn nút "OK" của cửa sổ đó, tôi đã sau log:

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) 

câu hỏi của tôi:

  1. tôi đã sử dụng EXTRA_CERTIFICATE & bộ nó để intent, tôi KHÔNG sử dụng EXTRA_PKCS12, nhưng từ nhật ký, sy Android stem nghĩ rằng tôi đang cài đặt kho khóa PKCS # 12. Tại sao?

  2. Cách chính xác để cài đặt chứng chỉ PEM theo chương trình trong Android là gì?

+0

'dòng không đại diện cho một pkcs12 chính store' lý do nào để không cố gắng chuyển đổi nó đến PKCS12 sau đó? –

+0

Nhưng tôi vẫn muốn biết cách thích hợp để cài đặt PEM trong Android là gì, đó là điểm của câu hỏi của tôi. –

+0

Điều này có vẻ là bản sao chính xác của https://stackoverflow.com/questions/40464815/install-x509-certificate-programmatically-in-my-case – ozbek

Trả lời

0

Mã của bạn nên hoạt động, như đã nói @Sergey Nikitin. Số điện thoại này được gắn dấu sao example tại Github đang sử dụng mã tương tự

Tôi đã xem lại mã nguồn Android 7.1 của CredentialHelperCertInstaller để theo dõi nhật ký ngoại lệ của bạn. Đường dẫn có thể truy cập duy nhất để thực hiện pkcs12 loader tại

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

là phương pháp onScreenlockOk

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

được bảo vệ bởi các giá trị mặc định được gán CredentialHelper.hasPkcs12KeyStore()

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

tôi đã không tìm thấy hoặc đường dẫn thay thế , vì vậy tôi suy ra rằng KeyChain.EXTRA_PKCS12 đang được sử dụng theo một cách nào đó. Đó là một hành vi kỳ lạ, có thể bạn có vấn đề về xây dựng lại & sạch?

Tôi đề nghị để gỡ lỗi mã bao gồm lớp Android CertInstaller để đảm bảo các giá trị của Extras và đảm bảo rằng mã thực thi được dự kiến ​​

Các vấn đề liên quan