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


96

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

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

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

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

답변:


142

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

구근


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


2
어쨌든, 동일한 개인 키를 재사용하려는 경우 새 루트 인증서를 만드는 요점은 무엇입니까? 이 작업을 계속 반복하면 인증서 만료 날짜가 언제입니까? 루트 만료는 관리자가 키를 깰려고하는 계속 발전하는 컴퓨터보다 더 안전한 새로운 개인 키를 만들도록 강요하는 데 사용되었다고 생각했습니다. 20 년 전에 만들어진 40 비트 키는 충분하지 않습니다
jvhashe

2
@jvhashe 루트 인증서가 더 이상 암호화 적으로 강력하지 않으면 만료 날짜와 상관없이 제거해야합니다. 자신의 루트를 생성하는 경우 더 이상 지구상에 있지 않을 때 수백 년이 지나서 만료되도록 설정하는 것을 막을 수있는 것은 없습니다. 만료는 루트 인증서와 거의 관련이 없으며 하위 인증서의 경우 만료는 실제로 암호화 강도와 관련이 없습니다 (10 월에 모든 1024 비트 인증서를 철회 할 준비가 된 CA에 문의하십시오)-자세한 내용은 여기 를 참조 하십시오 .
Shane Madden

3
위의 외에도이 방법이 작동하려면 일련 번호가 동일해야합니다.
Scott Presnell

2
-set_serial 01- 이런 씨발??? 일련 번호는 재사용 할 수 없습니다 . RFC 4158, Internet X.509 공개 키 인프라 : 인증 경로 작성을 참조 했습니까 ? 아니면 당신이 따라갈 때 그냥 만들고 있습니까? 사용자 에이전트가 경로 작성을 시작할 때 발생하는 문제에 대해 전혀 모릅니다.

1
@jww 답을 읽었습니까? 그것은 암호화가 작동한다는 사실을 보여줍니다. 이 명령은 문자 그대로 이전 루트 인증서와 새 루트 인증서 간의 관계를 테스트하기 위해 나중에 확인할 수있는 테스트 인증서를 생성하는 것입니다. 누군가 그 명령을 직접 사용하고 있다면 분명히 무언가 깨지기를 희망하며, 맹목적으로 그것을 실행하기 전에 무언가의 맥락에주의를 기울여야한다는 것을 알고 있습니다 (또는 01실험실에서 허용 가능한 일련 번호 인지 여부 에 대한 핸들을 날려야 함).
Shane Madden

14

원래 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

2
이것은 매우 도움이되는 추가되었습니다. 원래의 루트 CA에 임의의 설정이있는 경우 실제로 유효한 답변으로 인해 호환되는 인증서가 생성되지 않습니다.
Theuni

1
둘째, 매우 도움이되었습니다. 또 다른 추가 사항 : 수락 한 답변에 대한 의견에서 Scott Presnell과 같이 갱신 된 인증서의 16 진수 일련 번호를 수동으로 지정하여 이전 인증서와 일치하도록해야했습니다. 이것은 -set_serial 0xdeadbeefabba후자의 x509 명령에 (실제 시리얼 번호 :)가 아닌 것을 의미했습니다 . 그래야만 클라이언트 인증서가 갱신 된 CA 인증서에 대해 성공적으로 확인되었습니다.
JK Laiho

이 방법은 이전 인증서와 동일한 정보를 유지하므로 더 쉽습니다.
lepe

이 솔루션에 대한 스크립트와 -set_serial을 작성했습니다. – 답변보기
Wolfgang Fahl

이 답변은이 문제를 해결하기 위해 거의 하루를 보낸 후 나에게 많은 작업을 저장했습니다. 나는 거의 포기하려고했습니다.
Onitlikesonic

2

유효한 루트 기간을 연장하는 기본 모드 (공개 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

1

@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

0

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

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

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

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


이 회신 은 키를 재사용하여 루트 인증서를 갱신 할 수 있다고 제안하는 것 같습니다. 그러나 새 인증서의 서명이 다르기 때문에 기존 클라이언트 인증서의 유효성을 검사하지 않으므로 처음부터 시작하는 것과 다르지 않다고 생각합니다.
Remy Blank

예, 유효 기간을 연장 할 수 있으며 모든 pki, 클라이언트 인증서를 다시 작성하고 새 루트를 다시 신뢰하는 것보다 작업이 적습니다 ...
ggrandes

새로운 최종 엔터티 인증서 발급에 관한 부분이 반드시 사실은 아닙니다. 하위 키 CA 및 최종 엔터티 인증서에 AKI (Authority Key Identifier)가 어떻게 표시되는지에 따라 다릅니다. AKID가 {Distinguished Name, Serial Number}를 기반으로하는 경우 연속성이 달성됩니다. RFC 4518, Internet X.509 공개 키 인프라 : 인증 경로 작성 도 참조하십시오 .

0

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.