c - 如何向 X509_REQ 添加 subjectNameAlt 扩展名?

标签 c openssl x509

我正在创建一个将由我的服务器处理的 CSR。它需要设置 subjectNameAlt 以便服务器可以处理它。我进行了广泛的搜索,只找到了如何使用普通的 X509 证书而不是 X509_REQ 来做到这一点。我该怎么做(使用 C 和 OpenSSL。即我需要 X509_get_ext_d2i 的等价物,但对于 X509_REQ)?

最佳答案

程序化

看看 demos/x509/mkreq.c OpenSSL 附带的文件。它创建一个请求并添加一个电子邮件地址作为备用名称。剥离它执行以下操作:

exts = sk_X509_EXTENSION_new_null();
add_ext(exts, NID_subject_alt_name, "email:steve@openssl.org");
X509_REQ_add_extensions(x, exts);
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);

add_ext 是这样实现的:

int add_ext(STACK_OF(X509_EXTENSION) *sk, int nid, char *value) {
  X509_EXTENSION *ex;
  ex = X509V3_EXT_conf_nid(NULL, NULL, nid, value);
  if (!ex)
    return 0;
  sk_X509_EXTENSION_push(sk, ex);
  return 1;
}

从命令行

尽管 OP 请求了 API,但我将此部分保留给其他人。

https://wiki.cacert.org/FAQ/subjectAltName建议将 openssl.cnf 文件复制到临时 openssl-san.cnf 文件,然后像这样编辑它:

[req]
req_extensions = v3_req

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = host1.yourdomain.tld
DNS.2 = host2.yourdomain.tld

关于c - 如何向 X509_REQ 添加 subjectNameAlt 扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964681/

相关文章:

c - 在 DOS 中为 "Daylight Savings Time"

java - 获取现有证书并操纵内容

c - 我们如何复制包含 RSA key 的 EVP_PKEY?

node.js - 解析 Node 中的 x509 证书字符串

c - 这个 (char*)&x cast 的行为定义明确吗?

c - 二进制搜索树节点插入无法正常工作

c# - 检查数字是否是完全平方数(数字超过 15 位)

c - C 中的 SMTP 客户端阻止 SSL_read

c - 分解大数据以进行 RSA 加密

encryption - 如何在HTTPS协议(protocol)栈中加入自定义加密算法?