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?
7
A
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
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
Tuyệt vời! Tôi đã tìm kiếm điều này hàng giờ! – chacham15
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