iOS 中的 PEM 编码证书转换

PEM encoded certificate conversion in iOS

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

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

在应用程序外部进行转换不适合我的情况。

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

然后您可以使用 iOS 安全 API 中的 SecCertificateCreateWithData 创建一个 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 format is simply base64 encoded data surrounded by header lines.

[2]

.pem – Base64 encoded DER certificate, enclosed between "-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----"