2013-04-12 124 views
7

我正在創建一個將由我的服務器處理的CSR。它需要設置subjectNameAlt,以便服務器可以處理它。我已經搜索了很多,並且只發現瞭如何使用普通的X509證書,而不是X509_REQ。我如何做到這一點(使用C和OpenSSL,即我需要X509_get_ext_d2i的等價物,但X509_REQ)?如何爲X509_REQ添加subjectNameAlt擴展名?

回答

10

編程

看一看的demos/x509/mkreq.c文件附帶的OpenSSL。它創建一個請求並添加一個電子郵件地址作爲替代名稱。剝離下來將執行以下操作:

exts = sk_X509_EXTENSION_new_null(); 
add_ext(exts, NID_subject_alt_name, "email:[email protected]"); 
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 
+2

我想通過C要做到這一點,而不是通過殼或文件系統。 – chacham15

+0

太棒了!我一直在尋找這個好幾個小時! – chacham15

+0

我們如何通過編程使用c來添加像[alt_names]一樣的多值擴展? – karim