【发布时间】:2017-03-20 18:36:04
【问题描述】:
我正在开发一个 Android 项目。我有一个 PEM 证书字符串:
-----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);
当我运行我的应用程序时,我看到系统对话框弹出“正在提取...”,我知道系统正在提取我的证书,但该对话框一直显示在那里说“正在提取...”。
为什么?我安装证书的代码哪里错了?
【问题讨论】:
-
您拥有的代码需要二进制证书,而不是 base64 编码的证书。
-
@Robert,我不太明白你的话,我的代码哪一部分使用了base64编码?
-
BEGIN 和 END CERTIFICATE 之间的部分是 base64 编码的证书。 x.509 CertificateFactory 需要 AFAIR 二进制证书。
标签: android x509certificate keychain pem der