如何将subjectNameAlt扩展名添加到X509_REQ?

如何将subjectNameAlt扩展名添加到X509_REQ?,c,openssl,x509,C,Openssl,X509,我正在创建一个CSR,它将由我的服务器处理。它需要设置subjectNameAlt,以便服务器可以处理它。我已经搜索了很多地方,只找到了如何使用普通的X509证书,而不是X509_REQ。我如何才能做到这一点(使用C和OpenSSL。也就是说,我需要与X509\u get\u ext\u d2i等效的代码,但对于X509\u REQ)? 看看OpenSSL附带的文件。它创建一个请求并添加一个电子邮件地址作为备选名称。剥离后,它会执行以下操作: exts = sk_X509_EXTENSION_n

我正在创建一个CSR,它将由我的服务器处理。它需要设置subjectNameAlt,以便服务器可以处理它。我已经搜索了很多地方,只找到了如何使用普通的X509证书,而不是X509_REQ。我如何才能做到这一点(使用C和OpenSSL。也就是说,我需要与
X509\u get\u ext\u d2i
等效的代码,但对于
X509\u REQ
)?

看看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;
}
[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
从命令行 我将这一部分留给其他人,尽管OP要求一个API

建议将
openssl.cnf
文件复制到一个临时
openssl san.cnf
文件,然后按如下方式进行编辑:

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;
}
[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来实现这一点,而不是通过shell或文件系统。太棒了!我已经找了好几个小时了!如何以编程方式使用c添加[alt_name]中的多值扩展名?我发现您无法将任意数据添加为subject alt name。我在您的示例中看到您使用了“email:…”。我发现在“DNS:”前面加上我想使用的值对我很有用。否则,X509V3_EXT_conf_nid()只返回null。
X509V3_EXT_conf_nid
函数仅对某些扩展使用null上下文。其他扩展需要x509上下文才能生成它们的数据。