2013-04-12 35 views
7

Tôi đang tạo một CSR sẽ được xử lý bởi máy chủ của tôi. Nó cần đặt subjectNameAlt để máy chủ có thể xử lý nó. Tôi đã tìm kiếm xa và rộng, và chỉ tìm thấy làm thế nào để làm điều đó với certs X509 bình thường, không phải X509_REQ. Làm thế nào tôi có thể làm điều này (với C và OpenSSL. I.e. Tôi cần tương đương với X509_get_ext_d2i nhưng đối với X509_REQ)?Làm cách nào để thêm tiện ích subjectNameAlt vào X509_REQ?

Trả lời

10

Lập trình

Hãy xem tệp demos/x509/mkreq.c đi kèm với OpenSSL. Nó tạo một yêu cầu và thêm địa chỉ email làm tên thay thế. Stripped xuống nó như sau:

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); 

Các add_ext được thực hiện như thế này:

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; 
} 

Từ dòng lệnh

tôi để lại phần này tại chỗ cho người khác, mặc dù OP yêu cầu một API.

https://wiki.cacert.org/FAQ/subjectAltName khuyên để sao chép các tập tin openssl.cnf đến một openssl-san.cnf tập tin tạm thời và sau đó chỉnh sửa đó như thế này:

[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

Tôi muốn làm điều này thông qua c, không thông qua vỏ hoặc hệ thống tập tin. – chacham15

+0

Tuyệt vời! Tôi đã tìm kiếm điều này hàng giờ! – chacham15

+0

Làm cách nào để chúng tôi có thể thêm tiện ích mở rộng đa giá trị như trong [alt_names], sử dụng c theo lập trình? – karim