Generate a P12 file Xcode?

时间:2016-07-11 23:24:30

标签: ios swift xcode security seckeyref

I know there is a function called SecPKCS12Import that allows you to import data from a p12 file. However, I want to go the reverse route. I have a SecCertificateRef and a public/private SecKeyRef, which I want to use to create a P12 file. Does anyone know how to do this on iPhone?

Thanks

2 个答案:

答案 0 :(得分:2)

不幸的是,CommonCrypto没有提供任何导出PKCS12容器的方法,更不用说任何其他导出功能(即使它的OSX对应物可以这样做)。有一些方法可以从密钥链中提取SecKeyRef原始数据,但是您仍然需要自己编写所有PKCS12包装。

我们遇到了类似的问题,并使用OpenSSL。

编译适用于iOS的OpenSSL

集成OpenSSL需要一些工作,因为您需要自己编译和链接OpenSSL源。幸运的是,有一些构建脚本可用,因此您不必自己这样做,例如https://github.com/x2on/OpenSSL-for-iPhone。我建议你使用它们,因为你需要修补一些有点榛子的Makefile。这些构建脚本为iOS和tvOS生成静态链接库。您只需将它们与项目相关联,并相应地设置标题和库搜索路径。

<强>的CocoaPods

您也可以使用官方OpenSSL CocoaPod。这样可以省去配置项目的麻烦。

导出PKCS12

您可能知道,OpenSSL是C library。这意味着您可能希望将所有C函数封装到Objective-C或Swift包装器中。有一些开源包装器支持imcon和导出PKCS12容器,但我没有找到一个具有良好文档的单一包装器。您应该能够从某些来源获得相关的片段。

https://github.com/microsec/MscX509Common/blob/master/src/MscPKCS12.m

您也可以查看此示例http://fm4dd.com/openssl/pkcs12test.htm

希望有所帮助!

答案 1 :(得分:1)

我同意此任务只能使用OpenSSL执行。 OpenSSL-for-iPhone编译它有点棘手。

要解决从SecCertificate创建 PKCS12 密钥库的特定任务以及使用 Swift 3 创建SecKey,只需添加静态库{ {1}}和libssl.a到您的项目并创建以下桥接标题:

libcrypto.a

要创建密钥库,必须将输入数据转换为OpenSSL数据结构,这需要一些创造力。 #import <openssl/err.h> #import <openssl/pem.h> #import <openssl/pkcs12.h> #import <openssl/x509.h> 可以直接转换为 DER 格式,然后读入 X509 结构。 SecCertificate处理起来更糟糕。获取密钥数据的唯一可能解决方案是将其写入密钥链并获取参考。从引用中我们可以得到base 64编码的字符串,然后可以将其读入SecKey结构。现在,我们可以创建密钥库并将其保存到文件中。要通过iOS函数访问密钥库中的数据,我们必须通过EVP_PKEY

读取文件

完整的解决方案如下所示:

let data = FileManager.default.contents(atPath: path)! as NSData