Swift 3/4 - 从椭圆曲线 key 对生成 SecCertificate

标签 swift cryptography certificate elliptic-curve key-pair

目前我正在我的 iOS 应用程序中成功生成椭圆曲线 key 对:

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
}

这个之所以有效,是因为当我检查我的 key 是否存在时,它们确实存在,而且我还可以加密/解密和签名/验证。

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

但是实际上没有关于如何执行此操作的API/文档..我看到的唯一API是关于如何从现有的der文件等生成SecCertificate..

所以我的问题是:

如何从现有的椭圆曲线 key 对 (SecKey) 生成 SecCertificate 对象?

谢谢并问候!

最佳答案

一般来说,证书和加密函数的文档记录非常糟糕,并且在 Swift/iOS 中几乎不支持。

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

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

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

  1. 创建/查找证书颁发机构 (CA)
  2. 创建您的 key 对
  3. 创建证书签名请求 (CSR)。我目前使用CertificateSigningRequestSwift因为 Apple 根本不提供任何功能来执行此操作。
  4. 将您的 CSR 发送给 CA 并接收证书 (CRT)。
  5. 将 CRT 与私钥一起保存在 P12 信任存储中。我用OpenSSL-for-iPhone来做到这一点。
  6. 从 P12 信任存储区获取 SecIdentitySecCertificate

这是一项艰巨的工作,但经过长时间的研究,这是我获得 Swift/iOS 工作证书的唯一方法。尤其是 OpenSSL 的处理非常棘手(请查看 this post of me 以了解其复杂性)。所以,问题又是你想做什么。如果您想创建一个 SSL 客户端,则需要完全了解,但如果您只想加密一些内容,解决方案可能会容易得多。

关于Swift 3/4 - 从椭圆曲线 key 对生成 SecCertificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49408289/

相关文章:

Swift:将 View 添加到窗口时不显示阴影

ios - 如何在联系人框架中仅查找更新的联系人标识符或项目

c# - 加密 QRCode 有效负载,输入长度与输出长度相同

unit-testing - 如何测试密码学方法

ios - 在 UITableview swift 中使用 UILabel 和 UIWebView 设置 heightForRow

swift - 将 UInt32 数组编码到 UInt8 的正确方法

java - 通过tcp进行aes加解密。使用填充密码解密时输入长度必须是16的倍数

security - RFC 2986 和 RFC 4211 之间的区别以及哪一个是证书签名请求的规范?

java - 如何将私钥和公钥(pvk、spc)和证书(cer)导入 keystore ?

ios - XCode 6 和没有 XC 的 Ad-Hoc 分发 : provisioning