iOS中的PEM编码证书转换

时间:2018-07-23 12:42:19

标签: swift openssl rsa pem der

在我的应用中,我获得了PEM编码的证书,并且需要将其转换为其他形式,以便以后将其用于JWT验证。我要查找的结果是证书中包含的公钥的SecKey表示形式,PEM公钥字符串或转换为DER证书。

我对此非常陌生,因此我不知道如何解决该问题。我在Google周围搜索,没有找到明确的解决方案,即使Apple文档仅提及DER证书。如果我正确理解,一种解决方案是在应用程序内部使用OpenSSL(甚至可能吗?)进行转换,但是我找不到有关如何实现此操作的有用资源,因此,我希望您能对正确的做法有更多的了解。

在我的情况下,无法在应用程序外部进行转换。

1 个答案:

答案 0 :(得分:2)

如果您拥有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格式只是被标头行包围的base64编码数据。

[2]

  

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