[server] 인증 기관 루트 인증서 만료 및 갱신

2004 년에는 Linux에서 OpenSSL을 사용하고 OpenVPN과 함께 제공되는 간단한 관리 스크립트를 사용하여 소규모 인증 기관을 설정했습니다. 당시에 찾은 안내서에 따라 루트 CA 인증서의 유효 기간을 10 년으로 설정했습니다. 그 이후로 OpenVPN 터널, 웹 사이트 및 전자 메일 서버에 대한 많은 인증서에 서명했으며 모두 유효 기간이 10 년입니다 (이는 잘못되었지만 당시에는 더 잘 알지 못했습니다).

CA 설정에 대한 많은 가이드를 찾았지만 관리, 특히 루트 CA 인증서가 만료 될 때 수행해야 할 작업에 대한 정보는 거의 없었습니다. 이는 2014 년에 약간의 시간이 걸릴 것입니다. 질문 :

  • 루트 CA 인증서가 만료 된 후 유효 기간이 연장 된 인증서가 만료 되 자마자 유효하지 않습니까 (CA 인증서의 유효 기간 동안 서명 되었기 때문에) 계속 유효합니까?
  • 루트 CA 인증서를 갱신하고 만료 기간 동안 원활하게 전환하려면 어떤 작업이 필요합니까?
    • 다른 유효 기간으로 현재 루트 CA 인증서를 다시 서명하고 클라이언트 인증서가 클라이언트에 유효한 상태로 유지되도록 새로 서명 된 인증서를 클라이언트에 업로드 할 수 있습니까?
    • 아니면 모든 클라이언트 인증서를 새 루트 CA 인증서로 서명 된 새 인증서로 바꿔야합니까?
  • 루트 CA 인증서는 언제 갱신해야합니까? 만료가 가까워 지거나 만료 전에 합리적인 시간이 있습니까?
  • 루트 CA 인증서의 갱신이 주요 작업이되는 경우, 다음 갱신시보다 원활하게 전환하기 위해 (물론 유효 기간을 100 년으로 설정하지 않은 경우) 어떻게해야합니까?

일부 클라이언트에 대한 유일한 액세스는 현재 CA 인증서로 서명 된 인증서를 사용하는 OpenVPN 터널을 통해 이루어 지므로 상황이 약간 더 복잡해집니다. 따라서 모든 클라이언트 인증서를 교체해야하는 경우 복사해야합니다. 새 파일을 클라이언트에 보내고 터널을 다시 시작한 다음 내 손가락을 건너서 나중에 다시 나오기를 바랍니다.



답변

루트 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/

우리는이 지시어를 VirtualHost443 에서 청취 하도록 설정할 것입니다 . 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는 다른 체인 (이전 루트)을 제시하지만 신뢰할 수있는 (신규) 루트에 대해 자동으로 그것을 찾고 인증서의 유효성을 검사합니다. 신뢰할 수있는 루트에서 새 루트를 제거하고 원래 루트 인증서를 추가하면 모든 것이 잘됩니다.

구근


그게 다야! 갱신 할 때 동일한 개인 키를 유지하고 신뢰할 수있는 새로운 루트를 바꾸면 거의 모두 작동합니다 . 행운을 빕니다!


답변

원래 CA 키의 갱신 된 인증서에서 CA 확장이 누락 될 수 있음을 알았습니다. 이 날 (그것이 만들어 더 적절했다 ./renewedselfsignedca.conf V3의 CA 확장이 정의되고, ca.keyca.crt는 CA 키 및 인증서 원본 것으로 가정) :

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


답변

유효한 루트 기간을 연장하는 기본 모드 (공개 X.509 및 연관된 개인 키가 필요함) :

공개 X.509 및 개인 키에서 CSR을 생성하십시오.

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

개인 키를 사용하여 CSR에 다시 서명하십시오.

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


답변

@Bianconiglio plus -set_serial이 나를 위해 일했습니다. 내 서버는 인트라넷이므로 부작용이 무엇인지 걱정할 필요가 없으며 이제 “적절한”솔루션으로 작업 할 시간이 있습니다.

다음 구성 가능한 스크립트를 사용했습니다. 변수 CACRT, CAKEY 및 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


답변

루트 인증서가 만료되면 서명 한 인증서도 만료됩니다. 새 루트 인증서를 생성하고 새 인증서를 서명해야합니다. 몇 년마다 프로세스를 반복하지 않으려면 유일한 유일한 옵션은 루트 인증서의 유효 날짜를 10 년 또는 20 년과 같이 연장하는 것입니다.

루트 인증서를 “갱신”할 수 없습니다. 새로운 것을 생성하기 만하면됩니다.

오래된 것이 만료되기 최소 1 년 또는 2 년 전에 새 루트를 생성하여 문제가 발생했을 때 타임 월에 대항하지 않고 전환 할 시간을 가지십시오. 이렇게하면 새 인증서로 치아 문제가 해결 될 때까지 항상 기존 인증서로 일시적으로 다시 전환 할 수 있습니다.

VPN 터널까지는 실험 할 몇 개의 테스트 베드 서버를 설정하여 클라이언트 컴퓨터로 작업하기 전에 수행해야 할 작업을 정확하게 이해할 수 있습니다.


답변

우리는 같은 문제를 겪었고 데비안 서버가 최신이 아니었고 openSSL에 다음과 같은 문제가 있었기 때문에 우리의 경우였습니다.

https://ko.wikipedia.org/wiki/Year_2038_problem

데비안 6에서 사용 가능한 마지막 OpenSSL 버전은이 문제를 일으 킵니다. 23.01.2018 이후에 생성 된 모든 인증서는 Vality : for 1901 year!

해결책은 OpenSSL을 업데이트하는 것입니다. 클라이언트에 대한 구성 파일 (인증서 포함)을 다시 작성할 수 있습니다.


답변