我正在创建一个将由我的服务器处理的CSR。它需要设置subjectNameAlt,以便服务器可以处理它。我已经搜索了很多,并且只找到了如何使用普通的X509证书,而不是X509_REQ。我怎么能这样做(使用C和OpenSSL。即我需要等同于X509_get_ext_d2i
但是X509_REQ
)?
答案 0 :(得分:11)
查看OpenSSL附带的demos/x509/mkreq.c
文件。它会创建一个请求并添加一个电子邮件地址作为替代名称。剥下来做了以下事情:
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