Swift 3/4 - 从椭圆曲线密钥对生成 SecCertificate
Swift 3/4 - Generate SecCertificate from Elliptic Curve Keypair
目前我正在我的 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
}
这个有效,因为当我检查我的密钥是否存在时,我也可以 encrypt/decrypt 和 sign/verify。
Soo.. 在下一步中,我需要生成一个 SecCertificate,它基本上可以保存我的 public 密钥...这只是一个要求。
但是实际上没有 API/Documentation 如何做到这一点..我唯一看到的 api 是关于如何从现有的 der 文件等生成 SecCertificate..
所以我的问题是:
如何从现有的椭圆曲线密钥对 (SecKey) 生成 SecCertificate 对象?
谢谢和问候!
一般而言,证书和加密函数的文档记录非常糟糕,在 Swift / iOS 中几乎不支持。
但是这里的第一个问题是:为什么需要证书,你想做什么?主要问题是您无法凭空创建有效证书。证书必须由证书颁发机构 (CA) 签名,以便拥有 CA 证书的任何人都可以验证证书是否有效。
(当然你可以创建一个自签名证书,但在大多数情况下这没有用。此外,我不知道如何轻松地做到这一点。所有 API 调用 Swift / iOS假设你已经有一个有效的证书。它似乎不是为了在你的应用程序中创建证书。)
所以首先,您需要一个证书颁发机构,它可以签署您的证书。然后,您需要从您的密钥对创建证书签名请求并将其发送给您的 CA。然后您将获得一个签名证书,您可以在您的应用程序中使用它。正确顺序的步骤是:
- 创建/查找证书颁发机构 (CA)
- 创建您的密钥对
- 创建证书签名请求 (CSR)。我目前使用 CertificateSigningRequestSwift,因为 Apple 根本不提供任何功能来执行此操作。
- 将您的 CSR 发送到 CA 并接收证书 (CRT)。
- 将 CRT 与私钥一起保存在 P12 信任库中。我使用 OpenSSL-for-iPhone 来执行此操作。
- 从 P12 信任库中获取
SecIdentity
或 SecCertificate
这需要大量工作,但经过长时间的研究,这是我在 Swift / iOS 中获得证书的唯一方法。特别是使用 OpenSSL 的处理非常棘手(查看 this post of me 以了解复杂性)。所以,问题又是你想做什么。如果你想创建一个 SSL 客户端,你需要走完整的路,但如果你只是想加密一些东西,解决方案可能会容易得多。
目前我正在我的 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
}
这个有效,因为当我检查我的密钥是否存在时,我也可以 encrypt/decrypt 和 sign/verify。
Soo.. 在下一步中,我需要生成一个 SecCertificate,它基本上可以保存我的 public 密钥...这只是一个要求。
但是实际上没有 API/Documentation 如何做到这一点..我唯一看到的 api 是关于如何从现有的 der 文件等生成 SecCertificate..
所以我的问题是:
如何从现有的椭圆曲线密钥对 (SecKey) 生成 SecCertificate 对象?
谢谢和问候!
一般而言,证书和加密函数的文档记录非常糟糕,在 Swift / iOS 中几乎不支持。
但是这里的第一个问题是:为什么需要证书,你想做什么?主要问题是您无法凭空创建有效证书。证书必须由证书颁发机构 (CA) 签名,以便拥有 CA 证书的任何人都可以验证证书是否有效。
(当然你可以创建一个自签名证书,但在大多数情况下这没有用。此外,我不知道如何轻松地做到这一点。所有 API 调用 Swift / iOS假设你已经有一个有效的证书。它似乎不是为了在你的应用程序中创建证书。)
所以首先,您需要一个证书颁发机构,它可以签署您的证书。然后,您需要从您的密钥对创建证书签名请求并将其发送给您的 CA。然后您将获得一个签名证书,您可以在您的应用程序中使用它。正确顺序的步骤是:
- 创建/查找证书颁发机构 (CA)
- 创建您的密钥对
- 创建证书签名请求 (CSR)。我目前使用 CertificateSigningRequestSwift,因为 Apple 根本不提供任何功能来执行此操作。
- 将您的 CSR 发送到 CA 并接收证书 (CRT)。
- 将 CRT 与私钥一起保存在 P12 信任库中。我使用 OpenSSL-for-iPhone 来执行此操作。
- 从 P12 信任库中获取
SecIdentity
或SecCertificate
这需要大量工作,但经过长时间的研究,这是我在 Swift / iOS 中获得证书的唯一方法。特别是使用 OpenSSL 的处理非常棘手(查看 this post of me 以了解复杂性)。所以,问题又是你想做什么。如果你想创建一个 SSL 客户端,你需要走完整的路,但如果你只是想加密一些东西,解决方案可能会容易得多。