【问题标题】:Swift 3/4 - Generate SecCertificate from Elliptic Curve KeypairSwift 3/4 - 从椭圆曲线密钥对生成 SecCertificate
【发布时间】:2018-08-30 16:31:22
【问题描述】:

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

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 是关于如何从现有的 der 文件等生成 SecCertificate。

所以我的问题是:

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

谢谢和问候!

【问题讨论】:

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


    【解决方案1】:

    一般来说,证书和加密函数的文档记录非常糟糕,在 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

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

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      相关资源
      最近更新 更多