我正在开发一个Android项目。
我有一个PEM证书字符串:
-----BEGIN CERTIFICATE-----
MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD..AkGA1UEBhMCR0Ix
EzARBgNVBAgTClNvbWUtU3RhdGUxFDASBgNVBAoTC0..0EgTHRkMTcwNQYD
VQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcn..XRpb24gQXV0aG9y
...MANY LINES...
It8una2gY4l2O//on88r5IWJlm1L0oA8e4fR2yrBHX..adsGeFKkyNrwGi/
7vQMfXdGsRrXNGRGnX+vWDZ3/zWI0joDtCkNnqEpVn..HoX
-----END CERTIFICATE-----
(将证书字符串分配给名为CERT_STR
的变量)
我将PEM字符串解码为字节数组:
byte[] pemBytes = Base64.decode(
CERT_STR.replaceAll("-----(BEGIN|END) CERTIFICATE-----", "")
.replaceAll("\n", "")
.getBytes("UTF-8"),
Base64.DEFAULT
);
我尝试通过以下代码以编程方式将PEM证书安装到我的Android手机:
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);
运行我的代码(在Android 7设备中)时,当我按下" OK"那个窗口的按钮,我得到了以下日志:
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)
我的问题:
我使用了EXTRA_CERTIFICATE&将其设置为intent
,我不使用EXTRA_PKCS12,但是从日志中,Android系统认为我正在安装PKCS#12密钥库。为什么呢?
在Android中以编程方式安装PEM证书的正确方法是什么?
答案 0 :(得分:0)
你的代码应该可行,就像@Sergey Nikitin所说的那样。 Github上的这个已加星标的example正在使用类似的代码
我查看了{7.1}和CredentialHelper的Android 7.1源代码,以跟踪您的异常日志。在
执行pkcs12
加载程序的唯一可到达路径
com.android.certinstaller.CredentialHelper.extractPkcs12(CredentialHelper.java:354)
是方法onScreenlockOk
private void onScreenlockOk() {
if (mCredentials.hasPkcs12KeyStore()) {
if (mCredentials.hasPassword()) {
showDialog(PKCS12_PASSWORD_DIALOG);
} else {
new Pkcs12ExtractAction("").run(this);
}
受CredentialHelper.hasPkcs12KeyStore()
boolean hasPkcs12KeyStore() {
return mBundle.containsKey(KeyChain.EXTRA_PKCS12);
}
我没有找到默认指定值或替代路径,因此我推断出KeyChain.EXTRA_PKCS12
正在以某种方式使用。这是一种奇怪的行为,可能是你有一个干净和重建的问题?
我建议调试包含Android CertInstaller类的代码,以确保Extras的值并确保执行的代码是预期的