从 Exchange 解析 X509 证书

Parsing a X509Certificate from Exchange

我正在尝试检索 Microsoft Exchange 联系人的证书。它是通过在证书选项卡中导入它在 Outlook 中设置的。

它可以通过在 EWS 上使用 PidTagUserX509Certificate 获得,参见 https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxoabk/e4de26c4-9bcb-4da2-99c6-5f67aebc221a 但我不得不承认我不明白如何处理文档中描述的对象。

我尝试对检索到的数据进行 base64 解码,然后使用 X509 CertificateFactory 读取证书。

byte[] bytes = Base64.decode(certificateValue, Base64.DEFAULT);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(is);

这导致解析异常:error:0c0000be:ASN.1编码routines:OPENSSL_internal:WRONG_TAG

我的代码在 Android 上运行,但问题应该是普遍的。

您可以在此处找到 base64 数据:https://pastebin.com/dCnMtjn4

知道我如何获得证书吗?

好像数据被包裹了。前 12 个字节是一种信封(我知道它是什么),其余字节看起来像 X.509 证书。在第一行之后,跳过前 12 个字节并将字节数组的其余部分传递给 ByteArrayInputStream。我不熟悉 Java,但是数组应该有一种 .Skip 方法?快速google建议,你可以这样做:

byte[] bytes = Base64.decode(certificateValue, Base64.DEFAULT);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
ByteArrayInputStream is = new ByteArrayInputStream(bytes);
is.skip(12);
X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(is);