루트 CA에 동일한 개인 키를 유지하면 모든 인증서가 새 루트에 대해 계속해서 유효성을 검사 할 수 있습니다. 당신에게 필요한 것은 새로운 루트를 신뢰하는 것입니다.
인증서 서명 관계는 개인 키의 서명을 기반으로합니다. 새로운 공개 인증서를 생성하는 동안 동일한 개인 키 (및 내재적으로 동일한 공개 키)를 유지하면서 새로운 유효 기간과 다른 새 속성이 필요에 따라 변경되면 신뢰 관계가 유지됩니다. CRL도 인증서와 같이 개인 키로 서명 된 것처럼 기존 인증서에서 새 인증서로 계속 이어질 수 있습니다.
자, 확인합시다!
루트 CA를 만듭니다.
openssl req -new -x509 -keyout root.key -out origroot.pem -days 3650 -nodes
하위 인증서를 생성하십시오.
openssl genrsa -out cert.key 1024
openssl req -new -key cert.key -out cert.csr
자녀 증명서에 서명하십시오 :
openssl x509 -req -in cert.csr -CA origroot.pem -CAkey root.key -create_serial -out cert.pem
rm cert.csr
모든 인증서가 설정되었습니다. 신뢰를 확인합시다 :
# openssl verify -CAfile origroot.pem -verbose cert.pem
cert.pem: OK
자 이제 10 년이 지났다고합시다. 동일한 루트 개인 키에서 새 공개 인증서를 생성 해 봅시다.
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
그리고 .. 작동 했습니까?
# openssl verify -CAfile newroot.pem -verbose cert.pem
cert.pem: OK
근데 왜? 다른 파일 이지요?
# sha1sum newroot.pem
62577e00309e5eacf210d0538cd79c3cdc834020 newroot.pem
# sha1sum origroot.pem
c1d65a6cdfa6fc0e0a800be5edd3ab3b603e1899 origroot.pem
그렇다고해서 새로운 공개 키가 인증서의 서명과 암호 적으로 일치하지는 않습니다. 다른 일련 번호, 동일한 계수 :
# 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
실제 인증서 유효성 검사에서 작동하는지 확인하기 위해 조금 더 나아가 보겠습니다.
아파치 인스턴스를 시작하고 이동시켜 보자 (데비안 파일 구조, 필요에 따라 조정) :
# cp cert.pem /etc/ssl/certs/
# cp origroot.pem /etc/ssl/certs/
# cp newroot.pem /etc/ssl/certs/
# cp cert.key /etc/ssl/private/
우리는이 지시어를 VirtualHost
443 에서 청취 하도록 설정할 것입니다 . newroot.pem
루트 인증서 cert.pem
는 생성되어 서명 될 때조차 존재하지 않았 음을 기억하십시오 .
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/cert.key
SSLCertificateChainFile /etc/ssl/certs/newroot.pem
openssl이 어떻게 보이는지 확인하십시오.
# 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)
좋아, 그리고 MS의 암호화 API를 사용하는 브라우저는 어떻습니까? 먼저 루트를 신뢰해야합니다. 그러면 새로운 루트의 일련 번호로 모든 것이 좋습니다.
그리고 우리는 여전히 오래된 뿌리를 가지고 일해야합니다. Apache 설정을 다음과 같이 전환하십시오.
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/cert.key
SSLCertificateChainFile /etc/ssl/certs/origroot.pem
Apache를 완전히 다시 시작하면 다시로드해도 인증서가 올바르게 전환되지 않습니다.
# 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)
그리고 MS crypto API 브라우저를 사용하여 Apache는 이전 루트를 제시하지만 새 루트는 여전히 컴퓨터의 신뢰할 수있는 루트 저장소에 있습니다. Apache는 다른 체인 (이전 루트)을 제시하지만 신뢰할 수있는 (신규) 루트에 대해 자동으로 그것을 찾고 인증서의 유효성을 검사합니다. 신뢰할 수있는 루트에서 새 루트를 제거하고 원래 루트 인증서를 추가하면 모든 것이 잘됩니다.
그게 다야! 갱신 할 때 동일한 개인 키를 유지하고 신뢰할 수있는 새로운 루트를 바꾸면 거의 모두 작동합니다 . 행운을 빕니다!