gpt4 book ai didi

ios - 使用 OpenSSL 从 SecKey 生成 CSR

转载 作者:搜寻专家 更新时间:2023-10-30 22:15:54 25 4
gpt4 key购买 nike

我用 SecKeyGeneratePair 创建了一个公钥/私钥对(椭圆曲线)。

如何使用 SecKey 实例在 Swift 中使用 OpenSSL 生成 CSR?

最佳答案

据我所知,Apple 自己的安全框架目前没有公开用于生成 CSR 的 API。它在技术上被 OpenSSL 包装;所以如果你有 OpenSSL(我个人更喜欢 LibreSSL,libtls 让生活变得轻松)。

作为替代方案,您也可以使用 Commoncrypto,我的回答不会涵盖它,但那里有很多例子

因此,让我们逐步了解如何执行此操作。我发现使用 OpenSSL 的最简单方法是完全忽略文档并直接阅读源代码。

为了实现我们所需要的,我们需要“复制”以下 2 个命令:

openssl ecparam -out server.key -name prime256v1 -genkey

openssl req -new -key server.key -out server.csr

重要提示:一定要选择一条安全曲线。使用 openssl ecparam -list_curves 获取您的 openssl 版本支持的曲线列表。 Read more

第一步生成 key

ecparam 告诉我们必须先查看 sslsource/apps/openssl/ecparam.c。

来源为我们提供了 3 个步骤:设置BIO写入,设置组参数,最后生成 key 。

第 2 步生成 CSR

遵循相同的原则,但这次查看 req.capps.c 中的一些代码,其中包含 req.c< 中使用的一些样板代码

我使用这种方法创建了一个可以在 swift 中运行的粗略但有效的概念证明,您可以在 github 上查看:CertificateTool该代码将在您可以编译 swift4+ 工具链的任何系统和某些版本的 openSSL 上运行。

编辑:

生成 EC key :

//
// ECKey.swift
// CertificateToolPackageDescription
//
// Created by Antwan van Houdt on 10/01/2018.
//
import CLibreSSL

public class ECKey {
internal let secretKey: OpaquePointer
private let group: OpaquePointer

public init() {
group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)
EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE)
EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED)

secretKey = EC_KEY_new()
EC_KEY_set_group(secretKey, group)
EC_KEY_generate_key(secretKey)
}

deinit {
EC_KEY_free(secretKey)
EC_GROUP_free(group)
}
}

创建签名请求:

//
// CertificateRequest.swift
// CertificateToolPackageDescription
//
// Created by Antwan van Houdt on 10/01/2018.
//
import CLibreSSL

public enum NIDType: String {
case email = "emailAddress"
case hostName = "CN"
case organizationalUnit = "OU"
case organization = "O"
case city = "L"
case state = "ST"
case countryCode = "C"
}

public class CertificateSigningRequest {
private let request: UnsafeMutablePointer<X509_REQ>
private let key: ECKey
private let name: UnsafeMutablePointer<X509_NAME>

public init(key: ECKey, email: String, hostName: String, organizationalUnit: String, organization: String, countryCode: String, state: String, city: String) {
request = X509_REQ_new()
self.key = key

name = X509_NAME_new()
X509_REQ_set_version(request, 2)

self.add(name: email, type: .email)
self.add(name: hostName, type: .hostName)
self.add(name: organizationalUnit, type: .organizationalUnit)
self.add(name: organization, type: .organization)
self.add(name: countryCode, type: .countryCode)
self.add(name: city, type: .city)
self.add(name: state, type: .state)

X509_REQ_set_subject_name(request, name)

self.setPublicKey()
}

deinit {
X509_REQ_free(request)
X509_NAME_free(name)
}

private func add(name: String, type: NIDType) {
var buff = Array(name.utf8)
X509_NAME_add_entry_by_NID(self.name, OBJ_txt2nid(type.rawValue), MBSTRING_UTF8, &buff, Int32(buff.count), 0, 0)
}

private func setPublicKey() {
let certKey = EVP_PKEY_new()
EVP_PKEY_set1_EC_KEY(certKey, key.secretKey)

X509_REQ_set_pubkey(request, certKey)
X509_REQ_sign(request, certKey, EVP_sha256())

EVP_PKEY_free(certKey)
}
}

注意此代码不包含任何 BIO 相关函数(目前)以将 PEM 数据写入文件或数据缓冲区,但它们确实很容易添加。

免责声明:我不是专业的密码学家,也不了解 OpenSSL API 的所有细节。我不能保证我提供的代码是 100% 正确的实现。始终警惕从网络下载的代码,尤其是加密代码。

关于ios - 使用 OpenSSL 从 SecKey 生成 CSR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com