Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用swift从PKCS#12文件中提取证书和私钥PEM字符串_Ios_Swift - Fatal编程技术网

Ios 如何使用swift从PKCS#12文件中提取证书和私钥PEM字符串

Ios 如何使用swift从PKCS#12文件中提取证书和私钥PEM字符串,ios,swift,Ios,Swift,我有一个用例,用户提供一个PKCS#12文件及其密码作为输入,我需要证书和私钥的PEM字符串 我已经设法使用p12创建了一个SecIdentity,其文档显示: SecIdentity对象包含一个SecKey对象和一个关联的SecCertificate对象 因此,我相信我走的是正确的道路,但我找不到从这个SecIdentity中提取SecKey和SecCertificate的方法 我还没有找到从SecKey或SecCertificate获取PEM字符串的方法,但这只是最后一步 这是我用来创建标

我有一个用例,用户提供一个PKCS#12文件及其密码作为输入,我需要证书和私钥的PEM字符串

我已经设法使用p12创建了一个
SecIdentity
,其文档显示:

SecIdentity对象包含一个SecKey对象和一个关联的SecCertificate对象

因此,我相信我走的是正确的道路,但我找不到从这个
SecIdentity
中提取
SecKey
SecCertificate
的方法

我还没有找到从
SecKey
SecCertificate
获取PEM字符串的方法,但这只是最后一步


这是我用来创建标识的代码:

let key: NSString = kSecImportExportPassphrase as NSString
let options: NSDictionary = [key : p12Password]
    
var rawItems: CFArray?
    
let p12Data = try! Data(contentsOf: p12FileUrl)
let data = p12Data! as NSData
let cfdata = CFDataCreate(kCFAllocatorDefault, data.bytes.assumingMemoryBound(to: UInt8.self), data.length)!

let result: OSStatus = SecPKCS12Import(cfdata, options, &rawItems)
if result == errSecSuccess {
    let items = rawItems! as! [[String: Any]]
    let firstItem = items[0]
    let identity = firstItem[kSecImportItemIdentity as String] as! SecIdentity
}
--更新--

我取得了一些进展,并设法以DER格式提取证书(到目前为止我还没有尝试将其转换为PEM-我相信这应该很容易),但我仍然不知道如何获取私钥

if result == errSecSuccess {
    let items = rawItems! as! [[String: Any]]
    let firstItem = items[0]
    let identity = firstItem[kSecImportItemIdentity as String] as! SecIdentity

    var cert: SecCertificate?
    SecIdentityCopyCertificate(identity, &cert)
    var certDer = SecCertificateCopyData(cert!) //DER format
        
    var key: SecKey?
    SecIdentityCopyPrivateKey(identity, &key)
    let keyDict = SecKeyCopyAttributes(key!) //Not sure what we can find here
}