OpenSSL: làm thế nào để tạo CSR với Tên thay thế chủ thể tương tác (SAN)?


11

Tôi muốn định cấu hình OpenSSL để khi chạy openssl req -newđể tạo yêu cầu ký chứng chỉ mới, tôi được nhắc cho bất kỳ tên chủ đề thay thế nào được đưa vào CSR.

Tôi đã thêm dòng này vào [req_attributes]phần của tôi openssl.cnf:

subjectAltName                  = Alternative subject names

Điều này có hiệu ứng mong muốn mà bây giờ tôi được nhắc cho SAN khi tạo CSR:

$ openssl req -new -out test.csr -key ./test.key                            <<<
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [New York]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Example Co]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:test.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Alternative subject names []:DNS:alt1.example.com

Trong ví dụ trên, tôi đã nhập DNS:alt1.example.comkhi được nhắc cho SAN.

Vấn đề là CSR kết quả dường như không được định dạng tốt:

$ openssl req -text -in ./test.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=US, ST=New York, O=The Banes, CN=test.thebanes.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    [...]
                Exponent: 65537 (0x10001)
        Attributes:
            X509v3 Subject Alternative Name:unable to print attribute

OpenSSL phàn nàn rằng nó không thể in giá trị của thuộc tính Tên thay thế chủ đề. Từ các ví dụ trực tuyến (nơi mọi người mã hóa SAN vào openssl.cnf của họ, thay vì nhắc nhở họ tương tác như tôi muốn), tôi hy vọng sẽ thấy điều này thay vào đó:

        Attributes:
            X509v3 Subject Alternative Name:
                DNS:alt1.example.com

Vậy, làm thế nào tôi có thể tạo ra một CSR được hình thành tốt với các SAN được nhắc tương tác?


Thật không may, tôi nghĩ rằng không có giải pháp nào để làm điều đó với "thuần" openssl- bạn sẽ cần một tập lệnh sẽ xử lý tệp cấu hình của nó cho điều đó. :( PS Một giải pháp đã được chứng minh để thực hiện điều đó theo cách không tương tác có tại đây: stackoverflow.com/a/9158662/2693875
Greg Dubicki

Câu trả lời:


4

Bản thân tôi đã chiến đấu với đứa trẻ nhỏ này ... thật là một Pita!

Giải pháp của tôi: Tôi đã chuyển tất cả tệp openssl.cnf vào tệp Bộ công cụ mẫu chỉ để lại phần sans làm phần thay thế, sau đó bọc một tập lệnh perl xung quanh nó.

Kịch bản perl nhắc nhở các mục SAN, sau đó chèn chúng vào mẫu, lưu mẫu vào tệp tạm thời và sau đó tôi gọi openssl req với tùy chọn -config chỉ vào tệp tạm thời. loại bỏ tệp tạm thời sau khi CSR được tạo.

Bạn cũng có thể muốn xem tại: http://www.openssl.org/docs/apps/config.html

Có những người khác đã ghi đè $ ENV ngay trước khi thực hiện và thực hiện cuộc gọi tới openssl req bằng perl hoặc shell và thực hiện điều tương tự theo cách hiệu quả hơn một chút: http://blog.loftninjas.org/2008/11/11/ cấu hình-ssl-request-with-topicaltname-with-openssl /


Giải pháp $ ENV không hiệu quả với tôi. :(
Greg Dubicki

2

Tôi cũng đang tìm kiếm một giải pháp. Và đây là, những gì bạn muốn:

[req]
default_bits      = 2048
default_key_file  = private.key.pem
...
...
attributes        = req_attributes

[req_attributes]
subjectAltName = Alternative DNS names, Email adresses or IPs (comma seperated list)
#optional default value
subjectAltName_default = DNS:myhost.com.au,IP:127.0.0.1,EMAIL:my@here.org

Và bạn có thể nhận được điều này bằng cách nhắc cho tên chủ đề thay thế :)

#openssl req -in mytest1/temp.csr.pem -noout -text
    Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=DE, ST=Sachsen, L=Heidenau, O=IT Rab\xC3\xB6se, OU=ssl
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:d8:cd:14:ca:d0:06:6c:8c:11:e9:52:bc:46:39:
                    c1:cf:5a:6e:dd:3b:a8:85:15:6b:13:82:82:4a:48:
                    cb:53:ea:70:ea:f4:02:b2:ef:b1:41:b2:d7:11:c7:
                    11:ba:07:1b:be:8c:30:bc:60:d2:82:83:a1:e1:19:
                    75:3b:69:03:01:3c:2b:7b:85:f4:2e:a9:58:68:8f:
                    0e:f4:5e:50:e1:3f:9e:cf:46:a0:eb:69:aa:1e:cb:
                    3a:99:cb:1d:93:60:d0:3b:38:96:87:45:19:51:f4:
                    40:72:e5:a7:5e:62:37:41:44:48:64:47:95:14:97:
                    4f:27:d0:0c:e7:6f:c1:e1:37
                Exponent: 65537 (0x10001)
        Attributes:
            X509v3 Subject Alternative Name:DNS:www.google.de,EMAIL:im@you.org
    Signature Algorithm: sha1WithRSAEncryption
        9d:2b:e4:eb:1b:c0:b6:0b:b4:62:a7:4d:01:68:98:68:36:98:
        1e:e9:bc:59:24:0f:1b:32:7b:da:9d:39:a4:0f:2c:70:3e:aa:
        f7:07:e7:6b:9b:3b:00:b3:71:e0:54:07:78:c7:6e:57:e3:89:
        07:e1:93:f1:77:e7:cc:0e:d0:ed:c5:d0:a3:5d:1a:cd:bb:d8:
        5f:64:25:81:1b:a8:2f:ef:c7:84:7a:f6:b8:52:4e:4c:1c:8d:
        83:b7:9b:02:8e:b2:39:68:a1:fe:f1:59:8b:e0:c4:91:f1:a9:
        c7:b3:82:a3:d2:92:2b:e5:79:9f:29:b6:63:e7:cf:9d:17:98:
        fe:70

Điều này hoạt động khi nhìn vào CSR, nhưng khi tôi tạo chứng chỉ, nó không giữ SAN.
Jess

Nếu định dạng đúng cho SAN? Danh sách được phân tách bằng dấu phẩy. Chỉ kiểm tra DNS tiền tố SAN, nếu không được hỗ trợ IP, EMAIL. Ví dụ: INPUT >>DNS:my.dns.com, DNS:my.otherdns.org
raiserle

Đồng ý. Đây là chức năng bình thường của openssl wtf ! Bạn cũng phải cung cấp SAN cho CA-command như -extensions <string>, hoặc -extfile <file>. mta.openssl.org/pipermail/openssl-users/2016-Janemony/iêu
raiserle

1

"Chủ đề này" không nên có trong phần này: thuộc tính = req_attribut. Nhưng trong một phần cho req_extensions = (gọi nó là bất cứ điều gì bạn muốn).

Và không cần tất cả các BS như

subjectAltName           = Alternative subject names
subjectAltName_default   = DNS:www.g00gle.com

Chỉ cần nhập những gì bạn muốn, bao nhiêu bạn muốn:

subjectAltName = DNS:*.g00gle.com, DNS:g00gle.com, DNS:192.168.1.2

(Cái cuối cùng thực hiện truy cập nội bộ như " https://192.168.1.2 " mà không cần cảnh báo)

Vì vậy, một cái gì đó như:

[ req ]
req_extensions     = my_extensions

[my_extensions]
subjectAltName     = DNS:*.g00gle.com, DNS:g00gle.com, DNS:192.168.1.2

Chúc mừng!


1
Đây KHÔNG phải là những gì OP yêu cầu - anh ấy muốn một giải pháp tương tác .
Greg Dubicki

1
Không nên ghi lại IP bằng cách sử dụng "IP: 192.168.1.2", không phải là bản ghi định dạng DNS? Tôi đã lưu ý cuộc thảo luận này từ năm 2013 về các lỗi giữa các trình duyệt khi sử dụng DNS hoặc IP để lưu trữ địa chỉ IP dưới dạng SAN - michaelm.info/blog/?p=1281 - nhưng bây giờ lỗi này phải được xử lý.
Chris Woods
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.