Swift 3/4 - 从Elliptic Curve Keypair生成SecCertificate

时间:2018-03-21 13:56:06

标签: swift cryptography certificate elliptic-curve key-pair

目前我正在iOS app中成功生成Elliptic Curve KeyPair:

let privateKeyParams: [String: Any] = [
    kSecAttrIsPermanent as String: true,
    kSecAttrApplicationTag as String: privateTag
]

let publicKeyParams: [String: Any] = [
    kSecAttrIsPermanent as String: true,
    kSecAttrApplicationTag as String: publicTag,
    kSecAttrAccessible as String: kSecAttrAccessibleAlways
]

let query: [String: Any] = [
    kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
    kSecPrivateKeyAttrs as String: privateKeyParams,
    kSecPublicKeyAttrs as String: publicKeyParams,
    kSecAttrKeySizeInBits as String: 256 as AnyObject,
]

let status = SecKeyGeneratePair(query as CFDictionary, &self.publicKey, &self.privateKey)

guard status == errSecSuccess else {
    print("Could not generate keypair")
    return
}

guard let pubKey = self.publicKey, let privKey = self.privateKey else {
    print("Keypair null")
    return
}

这个有效,因为当我检查我的密钥是否存在时,他们也可以加密/解密并签名/验证。

Soo ..在下一步我需要生成一个SecCertificate,它基本上会保存我的公钥...这只是一个要求。

但实际上没有关于如何做到这一点的API /文档。我看到的唯一的api是关于如何从现有文件等生成SecCertificate。

所以我的问题是:

如何从现有的Elliptic Curve KeyPair(SecKey)生成SecCertificate对象?

谢谢和问候!

1 个答案:

答案 0 :(得分:2)

证书和加密函数通常记录很差,在Swift / iOS中几乎不受支持。

但这里的第一个问题是:你为什么需要证书?你想做什么?主要问题是您无法凭空创建有效证书。证书必须由证书颁发机构(CA)签名,以便拥有CA证书的任何人都可以验证证书是否有效。

(当然你可以创建一个自签名证书,但在大多数情况下这都没用。另外,我不知道如何轻松地做到这一点.Swift / iOS中的所有API调用都假设你已经拥有一个有效的证书。它似乎并不打算在您的应用程序内创建证书。)

首先,您需要一个可以签署证书的证书颁发机构。然后,您需要从密钥对创建证书签名请求并将其发送到CA.然后,您将获得一个签名证书,您可以在您的应用程序中使用该证书。正确顺序的步骤是:

  1. 创建/查找证书颁发机构(CA)
  2. 创建密钥对
  3. 创建证书签名请求(CSR)。我目前使用CertificateSigningRequestSwift,因为Apple根本没有提供任何功能来执行此操作。
  4. 将您的CSR发送到CA并获得证书(CRT)。
  5. 将CRT与私钥一起保存在P12信任库中。我使用OpenSSL-for-iPhone来执行此操作。
  6. 从P12信任商店获取SecIdentitySecCertificate
  7. 这是一项很多工作,但经过长时间的研究,这是我在Swift / iOS上获得证书的唯一方法。特别是使用OpenSSL处理非常棘手(请查看this post of me以了解复杂性)。所以,问题是你想做什么。如果你想创建一个SSL客户端,你需要全力以赴,但如果你只是想加密一些东西,解决方案可能会容易得多。