在 iOS 设备上快速创建新的 X509 证书

Posted

技术标签:

【中文标题】在 iOS 设备上快速创建新的 X509 证书【英文标题】:Create new X509 certificate in swift on iOS device 【发布时间】:2020-02-21 12:08:59 【问题描述】:

我的用例如下。 1.当用户第一次打开应用程序时,我需要在ios设备上创建新的X509证书。 2. 我需要使用安全框架快速执行此操作的代码。 3. iOS 安全框架是否支持不使用第三方库? 4. 如果上面第 3 点的答案是否定的,那么我可以使用哪些 thisrdparty 库?

【问题讨论】:

只需使用 openssl 绑定 swift @Woodstock 感谢您提供信息。 iOS安全框架不支持吗? 【参考方案1】:

您可以使用Security.framework 生成证书。您需要手动添加 x509 标头。

我将在下面发布的 sn-ps 是简化的示例。确保您负责任地处理 nil 值。

以下代码将生成证书:

  func obtainKeyData(_ tag: String) -> Data 
      var keyRef: AnyObject?
      let query: Dictionary<String, AnyObject> = [
          String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
          String(kSecReturnData): kCFBooleanTrue as CFBoolean,
          String(kSecClass): kSecClassKey as CFString,
          String(kSecAttrApplicationTag): tag as CFString,
      ]

      switch SecItemCopyMatching(query as CFDictionary, &keyRef) 
      case noErr:
        return keyRef as! Data
      default:
        fatalError("Error")
      
  

现在您需要为其添加一个 x509 标头。您可以使用Data 类别:

extension Data 
  public func dataByPrependingX509Header() -> Data 
      let result = NSMutableData()

      let encodingLength: Int = (self.count + 1).encodedOctets().count
      let OID: [CUnsignedChar] = [0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
          0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00]

      var builder: [CUnsignedChar] = []

      // ASN.1 SEQUENCE
      builder.append(0x30)

      // Overall size, made of OID + bitstring encoding + actual key
      let size = OID.count + 2 + encodingLength + self.count
      let encodedSize = size.encodedOctets()
      builder.append(contentsOf: encodedSize)
      result.append(builder, length: builder.count)
      result.append(OID, length: OID.count)
      builder.removeAll(keepingCapacity: false)

      builder.append(0x03)
      builder.append(contentsOf: (self.count + 1).encodedOctets())
      builder.append(0x00)
      result.append(builder, length: builder.count)

      // Actual key bytes
      result.append(self)

      return result as Data
  

最后,将两者结合起来创建 x509 格式的证书:

let x509Key = obtainKeyData(keyTag).dataByPrependingX509Header()

作为参考,我从 Heimdall 项目中获得了这段代码,这是一个用于 Swift 的 Security 框架包装器,它目前正在一个私有应用程序中使用。

【讨论】:

以上是关于在 iOS 设备上快速创建新的 X509 证书的主要内容,如果未能解决你的问题,请参考以下文章

iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤

Facebook SDK 4.0 iOS 不再快速切换到设备上安装的 Facebook APP

iOS使用openSSL加密应该怎么做

[转]如何创建一个自签名的SSL证书(X509)

x509:由未知权威 CMD K6.io 签署的证书

https://registry.gitlab.com/v2/: x509: 未知权威签署的证书