iOS中的PEM编码证书转换

dj-*_*eza 4 openssl rsa pem der swift

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

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

在应用程序之外进行转换不是我的选择。

dnl*_*ggr 12

如果您有 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)!
Run Code Online (Sandbox Code Playgroud)

[1]

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

[2]

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