- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我用 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.c
和 apps.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/
(Python)任何人都可以建议用另一个大小为 400k*800k 的 csr 矩阵 B 的列中的值填充 csr 矩阵 A 的最简单和最快的方法。我失败的尝试: #x is a list of siz
我必须以 pem 格式提交 CSR。 我已经使用 OpenSSL 生成了 CSR,但在将其转换为 PEM 格式时遇到了困难。 我必须从 example.csr 获取示例 - csr.pem。如何实现?
两年前,我获得了 VeriSign/Symantec SSL 证书。发起此请求时,我们在与证书的通用名称无关的随机服务器上创建了一个 CSR。为了创建 Java keystore ,我执行了以下两个步
由于一些不愉快的原因,我一直在尝试使用 bouncycaSTLe API 手动构建我自己的证书签名请求。 从表面上看,我选择这样做是因为我需要 CSR 的预签名版本,以便使用存储在 HSM 中的 ke
我正在使用 OpenSSL C API 构建 CSR。代码如下: static void seedPRNG() { const int openSSLseedsize = 128; uint8_t *
我正在关注 https://godaddy.com/help/windows-generate-csr-for-code-or-driver-signing-certificate-7282 生成 C
包含公钥和组织详细信息的 CSR(证书签名请求)是否使用私钥加密? - 如果是,证书颁发机构如何解密它,因为 CSR 中的公钥也被加密了? - 如果没有,CA 如何确定 CSR 颁发者拥有私钥? 最佳
我正在 iPhone 开发者门户中使用开发配置助手,但是当我到达它要求我生成并上传 CSR 的部分时,我尝试上传它,但它只是给了我这个错误: 所选的 CSR 无效。请检查文件并重试。 有人知道这意味着
我通过钥匙串(keychain)访问生成 .certSigningRequest 文件(钥匙串(keychain)访问 -> 证书助理 -> 从证书颁发机构请求证书...,我填写了我的邮件并将其保存到
我们可以从签名的证书中生成用于证书签名的 CSR(证书签名请求)吗?当使用不同的权限再次签名时,它应该与原始私钥一起使用。 最佳答案 你不能用你现有的 key 创建一个新的 CSR 吗? openss
我正在尝试使用 Python 加密将挑战 OID 添加到 CSR 的属性部分。我已经查看了文档,到目前为止,我只能向主题添加额外的属性,但这不是我需要的。使用以下代码: OID_CHALLENGE =
我正在创建我的第一个 iOS 应用程序,并尝试设置我的推送通知证书。当我上传 CSR 证书以生成证书时,我只是看到一个旋转的轮子,上面写着“正在加载...”,该过程持续了几个小时。这个过程需要多长时间
我想找到一种方法来操作 scipy.sparse.csr_matrix,以便根据列获得其元素的总和。例如,如果我有这个: (2, 883) 0.0194935608679 (10, 883)
我目前正在学习证书签名请求 (certificates Signing Requests, csr) 的工作原理。我的 csr 的内容是这样的 openssl req -text -noout -ve
我想为 2 个域购买多域通配符证书:*.domain1.org 和 *.domain2.org 我应该如何生成 CSR?因为我尝试使用通用名称 *.domain1.org 生成它,但我尝试购买的网站不
如何在cmd.exe上运行csr生成命令 openssl req -nodes -newkey rsa:2048 -keyout www_mydomain_com.key -out www_mydom
我有一个证书请求(见底部),我希望最好从命令行 (Unix) 获取指纹。如果我的目标只是验证两台机器上 PEM 文件的完整性,我可以使用例如sha256sum csr.pem 值,但我想获得与 Pup
我想做的是,创建一个 CSR 并使用受密码保护的私钥( key )。 在 OpenSSL 中,我可以创建一个带有密码的私钥,如下所示: openssl genrsa -des3 -out privke
我正在创建一个网页来获取敏感的客户信息,并希望它位于受 SSL 保护的页面上。 CA 要求我提供 CSR。 我计划在服务器上安装 OpenSSL 并创建其中一个。 这是否意味着我在其上创建 CSR 的
我正在尝试通过以下方法创建证书请求 (CSR),我需要在其中提供私钥,我的理解是 CSR 需要/仅包含公钥信息以及有关请求者的其他详细信息,例如公司名称等等。但是如果在创建 CSR 时提取公钥并传递它
我是一名优秀的程序员,十分优秀!