swift - iOS 中的 PEM 编码证书转换
问题描述
在我的应用程序中,我获得了 PEM 编码的证书,需要将其转换为不同的形式,以便以后将其用于 JWT 验证目的。我正在寻找的结果是证书中包含的公钥的 SecKey 表示、PEM 公钥字符串或转换为 DER 证书。
我对此非常陌生,所以我不知道如何解决这个问题。我用谷歌搜索并没有找到明确的解决方案,甚至 Apple 文档也只提到了 DER 证书。如果我理解正确,一种解决方案是在我的应用程序中使用 OpenSSL(这甚至可能吗?)进行转换,但我找不到任何有用的资源来说明如何实现这一点,所以我希望能更深入地了解正确的做法.
在我的情况下,在应用程序之外进行转换不是一种选择。
解决方案
如果您有 PEM 格式的证书,则可以通过剥离页眉和页脚行并对它们之间的文本进行 base64 解码(不要忘记丢弃换行符)来获取它的 DER 编码数据。[1, 2]
然后,您可以使用SecCertificateCreateWithData
iOS 安全 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)!
PEM 格式只是由标题行包围的 base64 编码数据。
.pem – Base64 编码的 DER 证书,包含在“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”之间
推荐阅读
- android - 如何在 Android Studio 的 XML 中同时指定数字和 imeOptions?
- sql - SQL 按不同列上的数据分组
- jenkins - 是否可以在代理/工作节点上创建 Jenkins 工件?
- python - django中的for循环
- python - 如何在 Python 中的一行中打印列表索引并在下一行中打印列表元素?
- laravel - 集合如何在一个运算符中使用 map 和 filter 方法?
- python - 有效地生成所有排列
- c++ - C++| 使用 lambda 函数检查 instream 是否成功打开
- mysql - mysqli 查询中的条件以将特定行的 where 条件从 column1 更改为 column2
- python-3.x - matplotlib - 模块“sip”没有属性“setapi”