Swift从privateKey创建secKey

pxy2qtax  于 2023-09-30  发布在  Swift
关注(0)|答案(1)|浏览(121)

我是新来的,但我有一个私钥,我从p12 cert使用此命令获得它
openssl pkcs12 -in cert.p12 -nodes -out private.key.pem -nocerts
这是结果文件的内容
行李属性localKeyID:== friendlyName:==关键属性:- 开始PRIVATE KEY- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1e12SFqNnD2aiLtB 2x5+K0R2pZDaBh2Drt09zLuL5imhRANCAASduIdkrmXpf5681JwnJHkcMi5zVPAS YFUig95A2w7flEY1lNtZcy/IRDQidqu/6BqLqe0V8P/CBZDa4hvKGzkE -结束PRIVATE KEY-
然后我试图从这个文件的内容创建一个secKey,但我总是得到相同的错误
非托管(_value:错误域=NSOSStatusErrorDomain Code=-50“从数据创建EC私钥失败”UserInfo={numberOfErrorsDeep=0,NSDescription=从数据创建EC私钥失败})
这里的代码

  1. func test() {
  2. let pemContent = """
  3. MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1e12SFqNnD2aiLtB
  4. 2x5+K0R2pZDaBh2Drt09zLuL5imhRANCAASduIdkrmXpf5681JwnJHkcMi5zVPAS
  5. YFUig95A2w7flEY1lNtZcy/IRDQidqu/6BqLqe0V8P/CBZDa4hvKGzkE
  6. """
  7. let pemData = pemContent
  8. .replacingOccurrences(of: "\n", with: "")
  9. .trimmingCharacters(in: .whitespacesAndNewlines)
  10. guard let decodedData = Data(base64Encoded: pemData) else {
  11. fatalError("Failed to decode Base64 data")
  12. }
  13. var attribute = [
  14. kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
  15. kSecAttrKeyClass: kSecAttrKeyClassPrivate,
  16. kSecAttrKeySizeInBits: 256
  17. ] as CFDictionary
  18. // Create the key
  19. var error: Unmanaged<CFError>?
  20. guard let secKey = SecKeyCreateWithData(decodedData as CFData,
  21. [
  22. kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
  23. kSecAttrKeyClass: kSecAttrKeyClassPrivate,
  24. kSecAttrKeySizeInBits: 256
  25. ] as CFDictionary,
  26. &error) else {
  27. if let createKeyError = error {
  28. print("Error creating key: \(createKeyError.takeRetainedValue() as Error)")
  29. }
  30. fatalError("Failed to create key")
  31. }
  32. // Successfully created SecKey
  33. print("SecKey created: \(secKey)")
  34. }

注:相同的关键是工作正常,当我尝试在Android平台,但不是在iOS

rmbxnbpk

rmbxnbpk1#

我能够找到一种方法来做到这一点,我将张贴在这里的任何人有同样的问题,与this question的帮助

  1. func privateKeyFromCertificate() -> SecKey {
  2. let certName : String = "yourCertName"
  3. let resourcePath: String = Bundle.main.path(forResource: certName, ofType: "p12")!
  4. let p12Data: NSData = NSData(contentsOfFile: resourcePath)!
  5. let key : NSString = kSecImportExportPassphrase as NSString
  6. let options : NSDictionary = [key : "CertificatePassword"]
  7. var privateKeyRef: SecKey? = nil
  8. var items : CFArray?
  9. let securityError: OSStatus = SecPKCS12Import(p12Data, options, &items)
  10. //let description : CFString = CFCopyDescription(items)
  11. //print(description)
  12. let theArray : CFArray = items!
  13. if securityError == noErr && CFArrayGetCount(theArray) > 0 {
  14. let newArray = theArray as [AnyObject] as NSArray
  15. let dictionary = newArray.object(at: 0)
  16. if let secIdentity = (dictionary as AnyObject).value(forKey: kSecImportItemIdentity as String) {
  17. let securityError = SecIdentityCopyPrivateKey(secIdentity as! SecIdentity , &privateKeyRef)
  18. if securityError != noErr {
  19. privateKeyRef = nil
  20. }
  21. }
  22. }
  23. var error:Unmanaged<CFError>?
  24. if let cfdata = SecKeyCopyExternalRepresentation(privateKeyRef!, &error) {
  25. let data:Data = cfdata as Data
  26. let b64Key = data.base64EncodedString()
  27. }
  28. return privateKeyRef!
  29. }
展开查看全部

相关问题