Làm thế nào để bạn ký một Yêu cầu ký chứng chỉ với Cơ quan chứng nhận của bạn?


195

Trong quá trình tìm kiếm, tôi đã tìm thấy một số cách ký Yêu cầu ký chứng chỉ SSL:

  1. Sử dụng x509mô-đun:

    openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    
  2. Sử dụng camô-đun:

    openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
    

Lưu ý: Tôi không chắc chắn về việc sử dụng đúng tham số cho cái này. Xin tư vấn sử dụng đúng nếu tôi sử dụng nó.

Cách nào một người nên sử dụng để ký yêu cầu chứng chỉ với Cơ quan chứng nhận của bạn? Là một phương pháp tốt hơn phương pháp kia (ví dụ, một phương pháp không được chấp nhận)?



1
Tôi thích tập lệnh nhỏ này thiết lập CA và cho phép bạn tạo chứng chỉ "cấp dưới" đã ký. Lưu ý, nếu bạn muốn hệ thống của mình hài lòng về các certs (như đối với S / MIME hoặc whatnot), bạn cần thêm chứng chỉ CA dưới dạng "root đáng tin cậy".
bình

Từ những gì tôi có thể thấy, calà cho các trường hợp khi bạn nghiêm túc hơn về việc trở thành một CA.
x-yuri

Bạn có thể tìm thấy câu trả lời của tôi thú vị.
x-yuri

Stack Overflow là một trang web dành cho các câu hỏi lập trình và phát triển. Câu hỏi này dường như lạc đề vì nó không liên quan đến lập trình hay phát triển. Xem những chủ đề nào tôi có thể hỏi về đây trong Trung tâm trợ giúp. Có lẽ Super User hoặc Unix & Linux Stack Exchange sẽ là một nơi tốt hơn để hỏi.
jww

Câu trả lời:


458
1. Using the x509 module
openssl x509 ...
...

2 Using the ca module
openssl ca ...
...

Bạn đang thiếu khúc dạo đầu cho những lệnh đó.

Đây là một quy trình gồm hai bước. Trước tiên, bạn thiết lập CA của mình và sau đó bạn ký chứng chỉ thực thể cuối (còn gọi là máy chủ hoặc người dùng). Cả hai lệnh đều tách hai bước thành một. Và cả hai đều cho rằng bạn đã có tệp cấu hình OpenSSL đã được thiết lập cho cả chứng chỉ CA và Máy chủ (thực thể cuối).


Đầu tiên, tạo một tệp cấu hình cơ bản :

$ touch openssl-ca.cnf

Sau đó, thêm các mục sau vào nó:

HOME            = .
RANDFILE        = $ENV::HOME/.rnd

####################################################################
[ ca ]
default_ca    = CA_default      # The default ca section

[ CA_default ]

default_days     = 1000         # How long to certify for
default_crl_days = 30           # How long before next CRL
default_md       = sha256       # Use public key default MD
preserve         = no           # Keep passed DN ordering

x509_extensions = ca_extensions # The extensions to add to the cert

email_in_dn     = no            # Don't concat the email in the DN
copy_extensions = copy          # Required to copy SANs from CSR to cert

####################################################################
[ req ]
default_bits       = 4096
default_keyfile    = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions    = ca_extensions
string_mask        = utf8only

####################################################################
[ ca_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default = US

stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = Maryland

localityName                = Locality Name (eg, city)
localityName_default        = Baltimore

organizationName            = Organization Name (eg, company)
organizationName_default    = Test CA, Limited

organizationalUnitName         = Organizational Unit (eg, division)
organizationalUnitName_default = Server Research Department

commonName         = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test CA

emailAddress         = Email Address
emailAddress_default = test@example.com

####################################################################
[ ca_extensions ]

subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints       = critical, CA:true
keyUsage               = keyCertSign, cRLSign

Các trường ở trên được lấy từ một phức tạp hơn openssl.cnf(bạn có thể tìm thấy nó /usr/lib/openssl.cnf), nhưng tôi nghĩ chúng là những yếu tố cần thiết để tạo chứng chỉ CA và khóa riêng.

Tinh chỉnh các lĩnh vực trên cho phù hợp với khẩu vị của bạn. Mặc định giúp bạn tiết kiệm thời gian nhập cùng thông tin trong khi thử nghiệm tệp cấu hình và các tùy chọn lệnh.

Tôi đã bỏ qua những thứ liên quan đến CRL, nhưng các hoạt động CA của bạn nên có chúng. Xem openssl.cnfvà phần liên quan crl_ext.

Sau đó, thực hiện như sau. Việc -nodesbỏ qua mật khẩu hoặc cụm mật khẩu để bạn có thể kiểm tra chứng chỉ. Đó là một ý tưởng thực sự tồi để bỏ qua mật khẩu hoặc cụm mật khẩu.

$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

Sau khi lệnh thực thi, cacert.pemsẽ là chứng chỉ của bạn cho các hoạt động CA và cakey.pemsẽ là khóa riêng. Nhớ lại khóa riêng không có mật khẩu hoặc cụm mật khẩu.

Bạn có thể đổ chứng chỉ với những điều sau đây.

$ openssl x509 -in cacert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
        Validity
            Not Before: Jan 24 14:24:11 2014 GMT
            Not After : Feb 23 14:24:11 2014 GMT
        Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d:
                    ...
                    39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b:
                    59:05:9f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
            X509v3 Authority Key Identifier:
                keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage:
                Certificate Sign, CRL Sign
    Signature Algorithm: sha256WithRSAEncryption
         4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7:
         ...
         cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5:
         38:ff:fd:55:68:2c:3e:37

Và kiểm tra mục đích của nó với các mục sau (đừng lo lắng về việc này Any Purpose: Yes, hãy xem "quan trọng, CA: FALSE" nhưng "Bất kỳ mục đích CA: Có" ).

$ openssl x509 -purpose -in cacert.pem -inform PEM
Certificate purposes:
SSL client : No
SSL client CA : Yes
SSL server : No
SSL server CA : Yes
Netscape SSL server : No
Netscape SSL server CA : Yes
S/MIME signing : No
S/MIME signing CA : Yes
S/MIME encryption : No
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes
Time Stamp signing : No
Time Stamp signing CA : Yes
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
...
aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP
tTj//VVoLD43
-----END CERTIFICATE-----

Đối với phần hai, tôi sẽ tạo một tệp cấu hình khác dễ tiêu hóa. Thứ nhất, touchcác openssl-server.cnf(bạn có thể thực hiện một trong các giấy chứng nhận cho người sử dụng cũng).

$ touch openssl-server.cnf

Sau đó mở nó và thêm vào như sau.

HOME            = .
RANDFILE        = $ENV::HOME/.rnd

####################################################################
[ req ]
default_bits       = 2048
default_keyfile    = serverkey.pem
distinguished_name = server_distinguished_name
req_extensions     = server_req_extensions
string_mask        = utf8only

####################################################################
[ server_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default = US

stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = MD

localityName         = Locality Name (eg, city)
localityName_default = Baltimore

organizationName            = Organization Name (eg, company)
organizationName_default    = Test Server, Limited

commonName           = Common Name (e.g. server FQDN or YOUR name)
commonName_default   = Test Server

emailAddress         = Email Address
emailAddress_default = test@example.com

####################################################################
[ server_req_extensions ]

subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

####################################################################
[ alternate_names ]

DNS.1  = example.com
DNS.2  = www.example.com
DNS.3  = mail.example.com
DNS.4  = ftp.example.com

Nếu bạn đang phát triển và cần sử dụng máy trạm của mình làm máy chủ, thì bạn có thể cần thực hiện các thao tác sau cho Chrome. Nếu không, Chrome có thể khiếu nại Tên chung không hợp lệ ( ERR_CERT_COMMON_NAME_INVALID) . Tôi không chắc mối quan hệ giữa địa chỉ IP trong SAN và CN trong trường hợp này là gì.

# IPv4 localhost
IP.1     = 127.0.0.1

# IPv6 localhost
IP.2     = ::1

Sau đó, tạo yêu cầu chứng chỉ máy chủ. Hãy chắc chắn bỏ qua -x509 *. Thêm -x509sẽ tạo ra một chứng chỉ, và không phải là một yêu cầu.

$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM

Sau khi lệnh này được thực thi, bạn sẽ có một yêu cầu servercert.csrvà một khóa riêng serverkey.pem.

Và bạn có thể kiểm tra lại.

$ openssl req -text -noout -verify -in servercert.csr
Certificate:
    verify OK
    Certificate Request:
        Version: 0 (0x0)
        Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/emailAddress=test@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
                    ...
                    f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
                    86:e1
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Subject Key Identifier:
                1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
            Netscape Comment:
                OpenSSL Generated Certificate
    Signature Algorithm: sha256WithRSAEncryption
         6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81:
         ...
         76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88:
         a9:63:d0:a7

Tiếp theo, bạn phải ký tên với CA.


Bạn gần như đã sẵn sàng để ký chứng chỉ của máy chủ bởi CA. CA openssl-ca.cnfcần thêm hai phần trước khi ban hành lệnh.

Đầu tiên, mở openssl-ca.cnfvà thêm hai phần sau.

####################################################################
[ signing_policy ]
countryName            = optional
stateOrProvinceName    = optional
localityName           = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional

####################################################################
[ signing_req ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment

Thứ hai, thêm phần sau vào [ CA_default ]phần openssl-ca.cnf. Tôi đã để chúng ra ngoài sớm hơn, bởi vì chúng có thể làm phức tạp mọi thứ (chúng không được sử dụng vào thời điểm đó). Bây giờ bạn sẽ thấy cách chúng được sử dụng, vì vậy hy vọng chúng sẽ có ý nghĩa.

base_dir      = .
certificate   = $base_dir/cacert.pem   # The CA certifcate
private_key   = $base_dir/cakey.pem    # The CA private key
new_certs_dir = $base_dir              # Location for new certs after signing
database      = $base_dir/index.txt    # Database index file
serial        = $base_dir/serial.txt   # The current serial number

unique_subject = no  # Set to 'no' to allow creation of
                     # several certificates with same subject.

Thứ ba, chạm index.txtserial.txt:

$ touch index.txt
$ echo '01' > serial.txt

Sau đó, thực hiện như sau:

$ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr

Bạn sẽ thấy tương tự như sau:

Using configuration from openssl-ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'MD'
localityName          :ASN.1 12:'Baltimore'
commonName            :ASN.1 12:'Test CA'
emailAddress          :IA5STRING:'test@example.com'
Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days)
Sign the certificate? [y/n]:Y

1 out of 1 certificate requests certified, commit? [y/n]Y
Write out database with 1 new entries
Data Base Updated

Sau khi lệnh thực thi, bạn sẽ có chứng chỉ máy chủ mới được đúc servercert.pem. Khóa riêng đã được tạo trước đó và có sẵn trong serverkey.pem.

Cuối cùng, bạn có thể kiểm tra chứng chỉ mới đúc của mình bằng cách sau:

$ openssl x509 -in servercert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 9 (0x9)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
        Validity
            Not Before: Jan 24 19:07:36 2014 GMT
            Not After : Oct 20 19:07:36 2016 GMT
        Subject: C=US, ST=MD, L=Baltimore, CN=Test Server
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
                    ...
                    f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
                    86:e1
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
            X509v3 Authority Key Identifier:
                keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E

            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
            Netscape Comment:
                OpenSSL Generated Certificate
    Signature Algorithm: sha256WithRSAEncryption
         b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a:
         ...
         45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c:
         56:a5:eb:c8:7e:9f:6b:7a

Trước đó, bạn đã thêm vào như sau CA_default: copy_extensions = copy. Bản sao mở rộng này được cung cấp bởi người đưa ra yêu cầu.

Nếu bạn bỏ qua copy_extensions = copy, thì chứng chỉ máy chủ của bạn sẽ thiếu Tên thay thế chủ đề (SAN) như www.example.commail.example.com.

Nếu bạn sử dụng copy_extensions = copy, nhưng không xem qua yêu cầu, thì người yêu cầu có thể lừa bạn ký một cái gì đó như root cấp dưới (thay vì máy chủ hoặc chứng chỉ người dùng). Điều đó có nghĩa là anh ấy / cô ấy sẽ có thể đúc các chứng chỉ mà chuỗi trở lại gốc đáng tin cậy của bạn. Hãy chắc chắn để xác minh yêu cầu với openssl req -verifytrước khi ký.


Nếu bạn bỏ qua unique_subject hoặc đặt nó thành yes, thì bạn sẽ chỉ được phép tạo một chứng chỉ dưới tên phân biệt của chủ đề.

unique_subject = yes            # Set to 'no' to allow creation of
                                # several ctificates with same subject.

Cố gắng tạo chứng chỉ thứ hai trong khi thử nghiệm sẽ dẫn đến kết quả như sau khi ký chứng chỉ máy chủ của bạn với khóa riêng của CA:

Sign the certificate? [y/n]:Y
failed to update database
TXT_DB error number 2

Vì vậy, unique_subject = nolà hoàn hảo để thử nghiệm.


Nếu bạn muốn đảm bảo Tên tổ chức thống nhất giữa các CA tự ký, CA cấp dưới và chứng chỉ thực thể cuối , sau đó thêm các mục sau vào tệp cấu hình CA của bạn:

[ policy_match ]
organizationName = match

Nếu bạn muốn cho phép Tên tổ chức thay đổi, hãy sử dụng:

[ policy_match ]
organizationName = supplied

Có các quy tắc khác liên quan đến việc xử lý tên DNS trong chứng chỉ X.509 / PKIX. Tham khảo các tài liệu này cho các quy tắc:

RFC 6797 và RFC 7469 được liệt kê, vì chúng hạn chế hơn các tài liệu RFC và CA / B khác. 6797 và 7469 của RFC cũng không cho phép địa chỉ IP.


4
Cảm ơn vì câu trả lời sâu rộng đó ... Tuy nhiên, tôi bị lạc ở đây. Những gì tôi hiểu từ những gì bạn đã viết: openssl reqđược sử dụng để tạo CSR, openssl req -x509được sử dụng để tạo chứng chỉ CA (tôi thấy ở một số nơi khác bạn cũng có thể tạo chứng chỉ tự ký), openssl cađược sử dụng để ký CSR bằng chứng chỉ CA. Đúng? Điều khiến tôi bối rối là các phần giống nhau của tệp openssl.cnf được sử dụng với các giá trị khác nhau tùy thuộc vào lệnh ... Tôi nghĩ rằng tôi hoàn toàn bị mất bây giờ.
Bernard Rosset

27
Đầu tiên, openssl req -x509được sử dụng để tạo CA. Thứ hai,openssl req được sử dụng để tạo CSR của máy chủ. Thứ ba, openssl cađược sử dụng để tạo chứng chỉ máy chủ và chứng nhận bằng chữ ký của CA.
jww

1
"Điều làm tôi bối rối là các phần giống nhau của openssl.cnf ..." - Phải. Đó là lý do tại sao tôi chia chúng ra cho bạn openssl-ca.cnfopenssl-server.cnf. Sau khi bạn quen với chúng và cách các phần được gọi, bạn có thể kết hợp chúng thành một thứ quái dị như thế nào openssl.cnf.
jww

1
@JeffPuckettII - Đây là một phần phổ biến. Nó được sử dụng bởi cả tiện ích CA và tiện ích Req. Chúng nên là phần mở rộng v3.
jww

5
@ahnkle Tùy chọn sử dụng -day cho mọi thứ khác với 30 ngày mặc định. Tài liệu OpenSSL
george

14

Ngoài câu trả lời của @jww, tôi muốn nói rằng cấu hình trong openssl-ca.cnf,

default_days     = 1000         # How long to certify for

xác định số ngày mặc định mà chứng chỉ được ký bởi root-ca này sẽ hợp lệ. Để đặt tính hợp lệ của chính root-ca, bạn nên sử dụng tùy chọn '-day n' trong:

openssl req -x509 -days 3000 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

Không làm như vậy, root-ca của bạn sẽ chỉ có hiệu lực trong một tháng mặc định và bất kỳ chứng chỉ nào được ký bởi CA gốc này cũng sẽ có hiệu lực trong một tháng.

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.