如何将subjectNameAlt扩展名添加到X509_REQ?
我正在创建一个CSR,它将由我的服务器处理。它需要设置subjectNameAlt,以便服务器可以处理它。我已经搜索了很多地方,只找到了如何使用普通的X509证书,而不是X509_REQ。我如何才能做到这一点(使用C和OpenSSL。也就是说,我需要与如何将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
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上下文才能生成它们的数据。