Giấy chứng nhận ủy quyền gốc hết hạn và gia hạn


96

Vào năm 2004, tôi đã thiết lập một tổ chức chứng nhận nhỏ sử dụng OpenSSL trên Linux và các tập lệnh quản lý đơn giản được cung cấp với OpenVPN. Theo các hướng dẫn tôi tìm thấy tại thời điểm đó, tôi đặt thời hạn hiệu lực cho chứng chỉ CA gốc là 10 năm. Kể từ đó, tôi đã ký nhiều chứng chỉ cho các đường hầm OpenVPN, các trang web và máy chủ email, tất cả đều có thời hạn hiệu lực là 10 năm (điều này có thể đã sai, nhưng lúc đó tôi không biết rõ hơn).

Tôi đã tìm thấy nhiều hướng dẫn về việc thiết lập CA, nhưng chỉ có rất ít thông tin về quản lý của nó và đặc biệt, về những gì phải làm khi chứng chỉ CA gốc hết hạn, điều này sẽ xảy ra vào năm 2014. Vì vậy, tôi có những điều sau đây Câu hỏi:

  • Các chứng chỉ có thời hạn hiệu lực kéo dài sau khi hết hạn chứng chỉ CA gốc sẽ không hợp lệ ngay sau khi hết hạn, hay chúng sẽ tiếp tục có hiệu lực (vì chúng đã được ký trong thời gian hiệu lực của chứng chỉ CA)?
  • Những hoạt động nào là cần thiết để làm mới chứng chỉ CA gốc và đảm bảo quá trình chuyển đổi suôn sẻ khi hết hạn?
    • Tôi bằng cách nào đó có thể ký lại chứng chỉ CA gốc hiện tại với thời hạn hiệu lực khác và tải lên chứng chỉ mới được ký cho khách hàng để chứng chỉ ứng dụng khách vẫn còn hiệu lực không?
    • Hoặc tôi có cần thay thế tất cả các chứng chỉ ứng dụng khách bằng các chứng chỉ mới được ký bởi chứng chỉ CA gốc mới không?
  • Khi nào nên cấp lại chứng chỉ CA gốc? Gần hết hạn, hoặc một thời gian hợp lý trước khi hết hạn?
  • Nếu việc gia hạn chứng chỉ CA gốc trở thành một công việc chính, tôi có thể làm gì tốt hơn bây giờ để đảm bảo quá trình chuyển đổi suôn sẻ hơn ở lần gia hạn tiếp theo (tất nhiên là không đặt thời hạn hiệu lực lên 100 năm)?

Tình hình trở nên phức tạp hơn một chút bởi thực tế là tôi chỉ truy cập vào một số khách hàng thông qua một đường hầm OpenVPN sử dụng chứng chỉ được ký bởi chứng chỉ CA hiện tại, vì vậy nếu tôi phải thay thế tất cả các máy khách, tôi sẽ cần sao chép các tập tin mới cho khách hàng, khởi động lại đường hầm, bắt chéo ngón tay của tôi và hy vọng rằng nó sẽ xuất hiện sau đó.

Câu trả lời:


142

Giữ cùng khóa riêng trên CA gốc của bạn cho phép tất cả các chứng chỉ tiếp tục xác thực thành công đối với root mới; tất cả những gì bạn cần là tin tưởng vào root mới.

Mối quan hệ ký chứng chỉ dựa trên chữ ký từ khóa riêng; giữ cùng một khóa riêng (và, ngầm, cùng một khóa chung) trong khi tạo chứng chỉ công khai mới, với thời hạn hiệu lực mới và bất kỳ thuộc tính mới nào khác được thay đổi khi cần, sẽ giữ mối quan hệ tin cậy. CRL cũng vậy, có thể tiếp tục từ chứng chỉ cũ sang chứng chỉ mới, giống như chứng chỉ, được ký bởi khóa riêng.


Vì vậy, hãy xác minh!

Tạo một CA gốc:

openssl req -new -x509 -keyout root.key -out origroot.pem -days 3650 -nodes

Tạo chứng chỉ con từ nó:

openssl genrsa -out cert.key 1024
openssl req -new -key cert.key -out cert.csr

Ký giấy chứng nhận con:

openssl x509 -req -in cert.csr -CA origroot.pem -CAkey root.key -create_serial -out cert.pem
rm cert.csr

Tất cả đặt ở đó, mối quan hệ chứng chỉ bình thường. Hãy xác minh lòng tin:

# openssl verify -CAfile origroot.pem -verbose cert.pem
cert.pem: OK

Ok, vì vậy, bây giờ hãy nói 10 năm trôi qua. Hãy tạo một chứng chỉ công khai mới từ cùng một khóa riêng gốc.

openssl req -new -key root.key -out newcsr.csr
openssl x509 -req -days 3650 -in newcsr.csr -signkey root.key -out newroot.pem
rm newcsr.csr

Và .. nó đã làm việc?

# openssl verify -CAfile newroot.pem -verbose cert.pem
cert.pem: OK

Nhưng tại sao? Chúng là những tập tin khác nhau, phải không?

# sha1sum newroot.pem
62577e00309e5eacf210d0538cd79c3cdc834020  newroot.pem
# sha1sum origroot.pem
c1d65a6cdfa6fc0e0a800be5edd3ab3b603e1899  origroot.pem

Có, nhưng, điều đó không có nghĩa là khóa công khai mới không khớp với chữ ký trên chứng chỉ. Số sê-ri khác nhau, cùng một mô-đun:

# openssl x509 -noout -text -in origroot.pem
        Serial Number:
            c0:67:16:c0:8a:6b:59:1d
...
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:bd:56:b5:26:06:c1:f6:4c:f4:7c:14:2c:0d:dd:
                    3c:eb:8f:0a:c0:9d:d8:b4:8c:b5:d9:c7:87:4e:25:
                    8f:7c:92:4d:8f:b3:cc:e9:56:8d:db:f7:fd:d3:57:
                    1f:17:13:25:e7:3f:79:68:9f:b5:20:c9:ef:2f:3d:
                    4b:8d:23:fe:52:98:15:53:3a:91:e1:14:05:a7:7a:
                    9b:20:a9:b2:98:6e:67:36:04:dd:a6:cb:6c:3e:23:
                    6b:73:5b:f1:dd:9e:70:2b:f7:6e:bd:dc:d1:39:98:
                    1f:84:2a:ca:6c:ad:99:8a:fa:05:41:68:f8:e4:10:
                    d7:a3:66:0a:45:bd:0e:cd:9d
# openssl x509 -noout -text -in newroot.pem
        Serial Number:
            9a:a4:7b:e9:2b:0e:2c:32
...
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:bd:56:b5:26:06:c1:f6:4c:f4:7c:14:2c:0d:dd:
                    3c:eb:8f:0a:c0:9d:d8:b4:8c:b5:d9:c7:87:4e:25:
                    8f:7c:92:4d:8f:b3:cc:e9:56:8d:db:f7:fd:d3:57:
                    1f:17:13:25:e7:3f:79:68:9f:b5:20:c9:ef:2f:3d:
                    4b:8d:23:fe:52:98:15:53:3a:91:e1:14:05:a7:7a:
                    9b:20:a9:b2:98:6e:67:36:04:dd:a6:cb:6c:3e:23:
                    6b:73:5b:f1:dd:9e:70:2b:f7:6e:bd:dc:d1:39:98:
                    1f:84:2a:ca:6c:ad:99:8a:fa:05:41:68:f8:e4:10:
                    d7:a3:66:0a:45:bd:0e:cd:9d

Chúng ta hãy đi xa hơn một chút để xác minh rằng nó hoạt động trong xác nhận chứng chỉ thế giới thực.

Khởi động một cá thể Apache và hãy thử xem (cấu trúc tệp debian, điều chỉnh khi cần):

# cp cert.pem /etc/ssl/certs/
# cp origroot.pem /etc/ssl/certs/
# cp newroot.pem /etc/ssl/certs/
# cp cert.key /etc/ssl/private/

Chúng tôi sẽ thiết lập các chỉ thị này khi VirtualHostnghe trên 443 - hãy nhớ rằng, newroot.pemchứng chỉ gốc thậm chí không tồn tại khi cert.pemđược tạo và ký.

SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/cert.key
SSLCertificateChainFile /etc/ssl/certs/newroot.pem

Hãy xem cách openssl thấy nó:

# openssl s_client -showcerts -CAfile newroot.pem -connect localhost:443

Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=server.lan
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
MIICHzCCAYgCCQCapHvpKw4sMjANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJB
...
-----END CERTIFICATE-----
(this should match the actual contents of newroot.pem)
...
Verify return code: 0 (ok)

Ok, còn trình duyệt sử dụng API mật mã của MS thì sao? Trước tiên, hãy tin tưởng vào root, sau đó tất cả đều tốt, với số sê-ri của root mới:

newroot

Và, chúng ta vẫn nên làm việc với root cũ. Chuyển cấu hình của Apache xung quanh:

SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/cert.key
SSLCertificateChainFile /etc/ssl/certs/origroot.pem

Thực hiện khởi động lại đầy đủ trên Apache, tải lại sẽ không chuyển đổi certs đúng cách.

# openssl s_client -showcerts -CAfile origroot.pem -connect localhost:443

Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=server.lan
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
MIIC3jCCAkegAwIBAgIJAMBnFsCKa1kdMA0GCSqGSIb3DQEBBQUAMFQxCzAJBgNV
...
-----END CERTIFICATE-----
(this should match the actual contents of origroot.pem)
...
Verify return code: 0 (ok)

Và, với trình duyệt API mã hóa MS, Apache đang trình bày root cũ, nhưng root mới vẫn nằm trong kho gốc đáng tin cậy của máy tính. Nó sẽ tự động tìm thấy nó và xác nhận chứng chỉ dựa vào gốc đáng tin cậy (mới), mặc dù Apache trình bày một chuỗi khác (gốc cũ). Sau khi tước gốc mới từ gốc đáng tin cậy và thêm chứng chỉ gốc ban đầu, tất cả đều ổn:

cũ


À chính nó đấy! Giữ cùng khóa riêng khi bạn gia hạn, trao đổi trong thư mục gốc đáng tin cậy mới và hầu như tất cả chỉ hoạt động . Chúc may mắn!


2
Dù sao, điểm tạo chứng chỉ gốc mới là gì nếu bạn chỉ sử dụng lại cùng khóa riêng? Nếu bạn tiếp tục làm điều này nhiều lần, thì thời điểm thậm chí có ngày hết hạn cho chứng chỉ là gì? Tôi nghĩ rằng hết hạn gốc đã được sử dụng để buộc quản trị viên tạo một khóa riêng mới hơn (rất có thể mạnh hơn) an toàn hơn trước các máy tiến bộ đang cố gắng phá khóa. Khóa 40 bit được tạo cách đây 20 năm không đủ an toàn cho
jvhashe

2
@jvhashe Nếu chứng chỉ gốc không còn đủ mạnh về mặt mật mã, thì bạn nên loại bỏ nó bất kể ngày hết hạn. Nếu bạn đang tạo gốc của riêng mình, không có gì ngăn bạn thiết lập nó để hết hạn hàng trăm năm trước khi bạn không còn ở trên hành tinh này nữa. Hết hạn hầu như không liên quan đến chứng chỉ gốc - và đối với chứng chỉ con, hết hạn không thực sự là về sức mạnh mật mã (hãy hỏi các CA đang chuẩn bị thu hồi tất cả các certs 1024 bit vào tháng 10) - xem tại đây để biết thêm thông tin.
Shane Madden

3
Ngoài những điều trên, tôi thấy rằng số sê-ri cần phải giống nhau để phương thức này hoạt động.
Scott Presnell

2
-set_serial 01- WTF ??? BẠN KHÔNG THỂ TÌM KIẾM SỐ SỐ SERIAL . Bạn thậm chí đã tham khảo RFC 4158, Internet X.509 Cơ sở hạ tầng khóa công khai: Xây dựng đường dẫn chứng nhận ? Hay bạn chỉ đang làm cho nó lên khi bạn đi cùng? Bạn không biết về những vấn đề bạn đang gây ra trong các tác nhân người dùng khi họ bắt đầu xây dựng đường dẫn.

1
@jww Bạn đã đọc câu trả lời chưa? Đó chỉ là một minh chứng cho thực tế rằng mật mã hoạt động. Lệnh đó thực sự chỉ là tạo ra một chứng chỉ kiểm tra mà chúng ta có thể xác minh sau này, nhằm mục đích kiểm tra mối quan hệ giữa chứng chỉ gốc cũ và chứng chỉ gốc mới. Nếu ai đó đang sử dụng các lệnh đó trực tiếp, tôi chắc chắn hy vọng điều gì đó bị phá vỡ và họ nhận ra rằng họ cần chú ý đến bối cảnh của một thứ gì đó trước khi chạy nó một cách mù quáng (hoặc bay khỏi tay cầm về việc liệu 01một chuỗi nối tiếp có thể chấp nhận được trong phòng thí nghiệm).
Shane Madden

14

Tôi đã nhận thấy rằng các tiện ích mở rộng CA có thể bị thiếu trong chứng chỉ được gia hạn của khóa CA gốc. Điều này hoạt động phù hợp hơn với tôi (nó tạo ra ./renewedelfsignca.conf trong đó các tiện ích mở rộng v3 CA được xác định và ca.keyca.crt được coi là khóa và chứng chỉ CA gốc):

openssl x509 -x509toreq -in ca.crt -signkey ca.key -out renewedselfsignedca.csr
echo -e "[ v3_ca ]\nbasicConstraints= CA:TRUE\nsubjectKeyIdentifier= hash\nauthorityKeyIdentifier= keyid:always,issuer:always\n" > renewedselfsignedca.conf
openssl x509 -req -days 1095 -in renewedselfsignedca.csr -signkey ca.key -out renewedselfsignedca.crt -extfile ./renewedselfsignedca.conf -extensions v3_ca

2
Đây là một bổ sung cực kỳ hữu ích. Câu trả lời thực sự hợp lệ không dẫn đến chứng chỉ tương thích đủ cho tôi nếu bạn có cài đặt tùy ý trên gốc gốc của mình.
Theuni

1
Thứ hai, rất hữu ích. Một bổ sung khác: như Scott Presnell trong các nhận xét cho câu trả lời được chấp nhận, tôi cũng phải chỉ định thủ công số sê-ri thập lục phân của chứng chỉ được gia hạn sao cho khớp với số cũ. Điều này có nghĩa là thêm -set_serial 0xdeadbeefabba(không phải là serial serial thực :)) vào lệnh x509 sau. Chỉ sau đó, chứng chỉ ứng dụng khách của tôi mới xác minh thành công đối với chứng chỉ CA được gia hạn.
JK Laiho

Phương pháp này dễ dàng hơn vì nó giữ thông tin giống với chứng chỉ trước đó.
lepe

Tôi đã tạo một tập lệnh cho giải pháp này cộng với -set_serial - xem câu trả lời của tôi
Wolfgang Fahl

Câu trả lời này đã tiết kiệm cho tôi rất nhiều công việc, sau khi dành gần một ngày cho một vấn đề đòi hỏi điều này, tôi gần như sắp bỏ cuộc, tôi ngả mũ chào bạn vì điều này!
Onitlikeike

2

Chế độ cơ bản để kéo dài thời gian root hợp lệ (bạn cần khóa công khai X.509 và khóa riêng được liên kết):

Tạo CSR từ X.509 công khai và khóa riêng:

openssl x509 -x509toreq -in XXX.crt -signkey XXX.key -out XXX.csr

Ký lại CSR bằng khóa riêng:

openssl x509 -in XXX.csr -out XXX.crt -signkey XXX.key -req -days 365

1

@Bianconiglio plus -set_serial làm việc cho tôi. Máy chủ của tôi chỉ là mạng nội bộ nên tôi không lo lắng nhiều về tác dụng phụ là gì và bây giờ tôi có thời gian để làm việc với một giải pháp "phù hợp".

Tôi đã sử dụng kịch bản cấu hình sau đây. Chỉ cần đặt các biến CACRT, CAKEY và NEWCA.

# WF 2017-06-30
# https://serverfault.com/a/501513/162693
CACRT=SnakeOilCA.crt
CAKEY=SnakeOilCA.key
NEWCA=SnakeOilCA2017
serial=`openssl x509 -in $CACRT -serial -noout | cut -f2 -d=`
echo $serial
openssl x509 -x509toreq -in $CACRT -signkey $CAKEY -out $NEWCA.csr
echo -e "[ v3_ca ]\nbasicConstraints= CA:TRUE\nsubjectKeyIdentifier= hash\nauthorityKeyIdentifier= keyid:always,issuer:always\n" > $NEWCA.conf
openssl x509 -req -days 3650 -in $NEWCA.csr -set_serial 0x$serial -signkey $CAKEY -out $NEWCA.crt -extfile ./$NEWCA.conf -extensions v3_ca
openssl x509 -in $NEWCA.crt -enddate -serial -noout

0

Khi chứng chỉ gốc của bạn hết hạn, các certs bạn đã ký với nó cũng vậy. Bạn sẽ phải tạo một chứng chỉ gốc mới và ký chứng chỉ mới với nó. Nếu bạn không muốn lặp lại quy trình cứ sau vài năm thì lựa chọn thực sự duy nhất là gia hạn ngày hợp lệ trên chứng chỉ gốc giống như mười hoặc hai mươi năm: Root tôi tạo ra để sử dụng cho riêng mình, tôi đặt ra hai mươi năm.

Bạn không thể "gia hạn" chứng chỉ gốc. Tất cả những gì bạn có thể làm là tạo ra một cái mới.

Tạo một gốc mới ít nhất một hoặc hai năm trước khi cái cũ của bạn hết hạn để bạn có thời gian thay đổi mà không phải chống lại bức tường thời gian nếu có sự cố xảy ra. Bằng cách đó, bạn luôn có thể tạm thời quay trở lại các certs cũ cho đến khi bạn giải quyết được vấn đề mọc răng với cái mới.

Theo như các đường hầm VPN, tôi sẽ thiết lập một vài máy chủ thử nghiệm để thử nghiệm để bạn hiểu chính xác những gì bạn phải làm trước khi bạn làm điều đó với máy của khách hàng.


Câu trả lời này dường như gợi ý rằng có thể gia hạn chứng chỉ gốc, bằng cách sử dụng lại khóa của nó. Nhưng tôi nghi ngờ điều này không khác gì bắt đầu từ đầu, vì chứng chỉ mới sẽ có một chữ ký khác, và do đó sẽ không xác nhận các chứng nhận khách hàng hiện có.
Remy Trống

vâng, bạn có thể gia hạn thời gian hợp lệ ... và làm việc ít hơn so với tạo lại tất cả pki, chứng chỉ ứng dụng khách và lấy lại root mới ...
ggrandes

Phần về việc cấp chứng chỉ thực thể cuối mới không nhất thiết phải đúng. Nó phụ thuộc vào cách Mã định danh khóa thẩm quyền (AKID) được thể hiện trong các CA cấp dưới và chứng chỉ thực thể cuối. Nếu AKID dựa trên {Tên phân biệt, Số sê-ri} , thì sẽ đạt được tính liên tục. Cũng xem RFC 4518, Internet X.509 Cơ sở hạ tầng khóa công khai: Xây dựng đường dẫn chứng nhận .

0

Chúng tôi đã có cùng một vấn đề và đó là trong trường hợp của chúng tôi vì máy chủ Debian đã lỗi thời và openSSL có vấn đề này:

https://en.wikipedia.org/wiki/Year_2038_propet

Phiên bản OpenSSL cuối cùng có sẵn cho Debian 6 mang đến vấn đề này. Tất cả các chứng chỉ được tạo sau ngày 23.01.2018 tạo ra Vality: cho năm 1901!

Giải pháp là cập nhật OpenSSL. Bạn có thể tạo lại các tệp cấu hình (có chứng chỉ) cho máy khách.

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.