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

cha*_*m15 8 c openssl x509

我正在创建一个CSR,它将由我的服务器处理.它需要设置subjectNameAlt,以便服务器可以处理它.我已经搜索了很多,并且只找到了如何使用普通的X509证书,而不是X509_REQ.我怎么能这样做(使用C和OpenSSL.即我需要相当于X509_get_ext_d2i但是X509_REQ)?

MvG*_*MvG 11

编程

看看demos/x509/mkreq.cOpenSSL附带的文件.它会创建一个请求并添加一个电子邮件地址作为替代名称.剥下来它做了以下事情:

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);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

从命令行

虽然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
Run Code Online (Sandbox Code Playgroud)

  • 我发现你无法添加任意数据作为主题alt名称.我在你的例子中看到你使用"email:...".我发现在我想用"DNS:"为我工作的价值之前.否则X509V3_EXT_conf_nid()只返回null. (3认同)
  • 我想通过c,而不是通过shell或文件系统来做到这一点. (2认同)