Swift从PEM格式EC私钥创建SecKey失败求助
解决iOS中PKCS#8格式EC私钥转换为SecKey失败的问题
问题根源
你通过openssl pkcs12导出的是PKCS#8格式的EC私钥,iOS的SecKeyCreateWithData接口对这类私钥的解析需要明确指定曲线参数,而Android的加密API对PKCS#8格式兼容性更强,因此能正常使用。
两种解决方法
方法一:修改Swift代码,添加曲线参数
你的私钥是256位的prime256v1(P256)曲线,只需在密钥属性字典中明确指定曲线类型即可:
func test() { let pemContent = """ MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1e12SFqNnD2aiLtB 2x5+K0R2pZDaBh2Drt09zLuL5imhRANCAASduIdkrmXpf5681JwnJHkcMi5zVPAS YFUig95A2w7flEY1lNtZcy/IRDQidqu/6BqLqe0V8P/CBZDa4hvKGzkE """ let pemData = pemContent .replacingOccurrences(of: "\n", with: "") .trimmingCharacters(in: .whitespacesAndNewlines) guard let decodedData = Data(base64Encoded: pemData) else { fatalError("Failed to decode Base64 data") } // 添加kSecAttrKeyCurve参数指定曲线类型 let attributes: [CFString: Any] = [ kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom, kSecAttrKeyClass: kSecAttrKeyClassPrivate, kSecAttrKeySizeInBits: 256, kSecAttrKeyCurve: kSecP256KeyCurve ] var error: Unmanaged<CFError>? guard let secKey = SecKeyCreateWithData(decodedData as CFData, attributes as CFDictionary, &error) else { if let createKeyError = error { print("Error creating key: \(createKeyError.takeRetainedValue() as Error)") } fatalError("Failed to create key") } print("SecKey created: \(secKey)") }
方法二:用OpenSSL转换私钥为SEC1格式
将PKCS#8格式的私钥转换为iOS更易解析的SEC1原始EC私钥格式:
openssl ec -in private.key.pem -outform der -out private_sec1.der
将生成的private_sec1.der文件转换为Base64编码后替换到你的Swift代码中,此时无需额外添加曲线参数,原代码即可正常运行。
验证私钥曲线类型
可以通过以下命令确认你的私钥曲线类型,确保参数匹配:
openssl ec -in private.key.pem -text -noout
若输出包含ASN1 OID: prime256v1,则对应kSecP256KeyCurve参数。
内容的提问来源于stack exchange,提问作者TapulaRasa
相关产品推荐
相关产品推荐

