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 VirtualHost
nghe trên 443 - hãy nhớ rằng, newroot.pem
chứ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:
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:
À 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!