首页 > 解决方案 > iOS 中的 PEM 编码证书转换

问题描述

在我的应用程序中,我获得了 PEM 编码的证书,需要将其转换为不同的形式,以便以后将其用于 JWT 验证目的。我正在寻找的结果是证书中包含的公钥的 SecKey 表示、PEM 公钥字符串或转换为 DER 证书。

我对此非常陌生,所以我不知道如何解决这个问题。我用谷歌搜索并没有找到明确的解决方案,甚至 Apple 文档也只提到了 DER 证书。如果我理解正确,一种解决方案是在我的应用程序中使用 OpenSSL(这甚至可能吗?)进行转换,但我找不到任何有用的资源来说明如何实现这一点,所以我希望能更深入地了解正确的做法.

在我的情况下,在应用程序之外进行转换不是一种选择。

标签: swiftopensslrsapemder

解决方案


如果您有 PEM 格式的证书,则可以通过剥离页眉和页脚行并对它们之间的文本进行 base64 解码(不要忘记丢弃换行符)来获取它的 DER 编码数据。[1, 2]

然后,您可以使用SecCertificateCreateWithDataiOS 安全 API 创建一个SecCertificate以在您的应用程序中使用,如下所示:

// example data from http://fm4dd.com/openssl/certexamples.htm
let pem = """
    -----BEGIN CERTIFICATE-----
    MIIC2jCCAkMCAg38MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG
    (...)
    +tZ9KynmrbJpTSi0+BM=
    -----END CERTIFICATE-----
    """

// remove header, footer and newlines from pem string

let certData = Data(base64Encoded: pemWithoutHeaderFooterNewlines)!

guard let certificate = SecCertificateCreateWithData(nil, data as CFData) else {
    // handle error
}

// use certificate e.g. copy the public key
let publicKey = SecCertificateCopyKey(certificate)!

[1]

PEM 格式只是由标题行包围的 base64 编码数据。

[2]

.pem – Base64 编码的 DER 证书,包含在“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”之间


推荐阅读