자체 서명 된 루트 CA가 서명 한 인증서를 무효화하지 않고 재발급


12

회사 내부의 일부 내부 서비스에 대해 자체 서명 된 루트 인증 기관을 만들었습니다. 그런 다음이 CA에 서명 한 해당 서비스에 대한 인증서를 작성했습니다.

이제이 CA에서 발급 된 기존 서버 인증서를 무효화하지 않고 루트 CA에 x509 확장 (CRL 배포 지점)을 추가하려고합니다. 이게 가능해?

내가 이해하는 것처럼 해당 개인 키에 대한 액세스가 필요 하고 인증서 ID에 대한 "전체 권한"에 충분하기 때문에 내 직감은 "예" 입니다. 즉, 인증서가 생성 될 때 공개 키와 함께 일종의 nonce가 인증서에 통합되지 않은 경우입니다.

나는 여전히 SSL 인증서 관리에 익숙하지 않지만 표준 신뢰 체인의 기본 사항을 이해합니다. 다른 PKI 암호화의 기본 사용에 익숙합니다. SSH 키를 관리하고 서명 및 암호화에 GPG를 사용합니다. 나는 컴퓨터 과학을 공부했지만 암호 해독에있어 독학입니다.

나는 원래의 IIRC에 대한 CSR을 만들지 않았다 (나는 그것이 직접적인 결과라고 생각한다 openssl req -new -x509). 물론 원래 CA의 개인 키를 가지고 있으며이를 사용하여 원래 인증서를 인증서 서명 요청으로 "역방향으로"바꿀 수있었습니다. openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key

나는 이것이 위에서 언급 한 nonce를 효과적으로 "추출"하고 crlDistributionPoints필드 를 사용하여 인증서를 다시 만들 수 있기를 원했기 때문에 원래 CA로 서명 된 모든 인증서는 여전히이 새로운 CA에 대해 유효성을 검사하지만 예외는 예외입니다. 클라이언트는 필드에 지정된 HTTP URL에서 (현재 비어있는) CRL 파일을 검색합니다.

그래서 확장 설정 파일을 만들었습니다 ext.conf:

[ cert_ext ] 
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl

그리고 CSR에서 루트 CA의 새 버전을 생성했습니다.

openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem

이제 인증서를 볼 때 openssl x509 -text -in MyNewCA.pem | less

CRL 확장 부분을 볼 수 있습니다.

X509v3 extensions:
    X509v3 Subject Key Identifier: 
        82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
    X509v3 CRL Distribution Points: 

        Full Name:
          URI:http://security.mycompany.co.za/root.crl`

그러나 아아! 이전에 서명 한 인증서가이 인증서에 대해 더 이상 유효하지 않습니다.

openssl verify -verbose -CAfile MyCA.pem git.pem 
git.pem: OK

openssl verify -verbose -CAfile MyNewCA.pem git.pem 
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate

주로 인증서의 작동 방식과 이유에 대한 더 많은 통찰력을 찾고 있습니다. 그러나 나는이 문제로 이어지는 문제에 대한 해결책을 환영합니다. 그래서 여기에도 배경 정보가 있습니다.

나는이 혼란에있어 어떻게 내 CA는 Windows에서 인증서 GUI를 설치 → 탐색기 RMB를 통해 설치하거나되면 HTTPS 내부 서비스에 큰 일을 /usr/local/share/ca-certificates다음 update-ca-certificates데비안과 우분투. 그러나 최근 예외가 발생했습니다. Windows의 Git, 특히 Windows 보안 채널을 SSL 백엔드로 사용하도록 설치된 경우. 기본적으로 SSL 인증서에 CRL 필드가 있어야한다고 주장합니다.

따라서 계속 실행되는 오류 메시지가 Microsoft와 관련이 있기 때문에 실제로 Windows 보안 채널 문제인 것 같습니다. fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.

OpenSSL을 사용하여 Git을 설치하고 git.http.sslcainfo가 가리키는 파일에 내 CA를 수동으로 연결하면 작동하지만 사용자 가이 프로세스가 더 많은 노력을 기울이는 것보다 SSL 신원 확인에 신경 쓰지 않을까 두려워합니다. "easy"Windows 인증서 설치 프로그램 GUI를 클릭하십시오.


1
공개 키와 주체 만 인증서를 고유하게 만듭니다. 따라서 둘 중 하나라도 변경하지 않으면 다른 모든 필드와 확장명을 변경하여 인증서에 다시 서명 할 수 있어야합니다.
garethTheRed

@garethTheRed 아, 그건 말이됩니다. 어떻게해야할지 모르겠습니다. 자세한 내용을 정교하게 설명하거나 답변을 게시 할 수 있습니까? -x509toreq기존 루트 CA에서 모든 고유 정보를 복구 하기를 원했지만 정보가 없거나 프로세스에 문제가 있습니다.
AngerySysadmin

1
req -new -x509그리고 x509 -req -signkey자체 서명 된 인증서의 일련 번호를 기본값으로 임의의 숫자로 (이것은 무시할 수는 있지만) 사실상 nonce입니다. 자녀 인증서 (또는 그중 하나)에 'keyid'옵션 대신 또는 'issuer + serial'옵션을 사용하는 AuthorityKeyIdentifier가 포함되어있는 경우 ( ca업스트림 기본 구성 파일과 함께 사용하는 경우) 이전 루트와 동일한 일련의 새 루트를 작성해야합니다. 사용하십시오 -set_serial. ...
dave_thompson_085

... 그러나 일부 인증서는 기존 인증서와 동일한 이름 및 일련의 새 인증서를 가져 오려고하면 불행 할 수 있습니다. 오래된 것을 먼저 청소해야 할 수도 있습니다.
dave_thompson_085

1
근처 크로스 - 속는 security.stackexchange.com/questions/17331/... PS : 나는 생각 이있는 경우 CRLDP의 부족이 문제가 아니라 수도 CA에 대한 CRL을 캐시 수동으로 윈도우를 얻을 수있어,하지만 어떻게 불편할 것이라고 모르겠어요
dave_thompson_085

답변:


6

인증서의 주체 이름공개 키 가 일치하는 한 두 개의 인증서가 동일한 것으로 간주됩니다 .

따라서 키를 재사용하고 새 인증서의 주체 이름이 이전과 동일한 지 확인하기 만하면됩니다. 그런 다음 다른 필드 및 / 또는 확장을 변경할 수 있으며 결과 인증서는 동일하게 간주됩니다.

예를 들어, OpenSSL 구성 파일을 작성하십시오.

[ req ]

prompt             = no
string_mask        = default
distinguished_name = x509_distinguished_name
x509_extensions     = x509_ext

[ x509_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.
# Adjust for your setup:

countryName = za
organizationName = My Company
organizationalUnitName = Security
commonName = My Root CA

[ x509_ext ]

basicConstraints = critical,CA:true
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier = hash
crlDistributionPoints = URI:http://security.mycompany.co.za/root.crl

예를 들어 rootca.cnf. 의 요소가 [req_distinguished_name]원래 루트 CA 인증서 의 요소와 동일한 지 확인하십시오 (이는 동일한 주체 이름 부분 임).

다음을 실행하십시오.

openssl req -new -x509 -key rootca.key -out MyNewCA.pem -config rootca.cnf

rootca.key원래 인증서에 사용 된 개인 키는 어디 입니까 (이는 동일한 공개 / 개인 키 부분입니다).

이것 MyNewCA.pem으로 다음을 확인할 수 있습니다.

$ openssl x509 -noout -text -in MyNewCA.pem

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 17564687072266118846 (0xf3c24dd49d5166be)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=za, O=My Company, OU=Security, CN=My Root CA
    Validity
        Not Before: Jul 15 05:05:54 2017 GMT
        Not After : Aug 14 05:05:54 2017 GMT
    Subject: C=za, O=My Company, OU=Security, CN=My Root CA
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (2048 bit)
            Modulus:
                00:c8:3d:32:8a:56:31:f6:27:1a:ce:9e:b2:1d:fb:
                ce:9f:ce:5b:42:25:aa:fe:8b:f4:34:32:ac:b3:02:
                50:71:f8:c3:43:0c:c7:2c:9f:fe:48:1b:c6:c0:e7:
                d6:44:a9:e7:d7:a0:7e:58:f4:b6:38:61:7e:d0:af:
                0f:56:21:e7:49:7a:66:13:f5:7a:fe:3d:ab:65:f8:
                01:eb:52:a7:3b:ae:a0:cf:50:57:b9:e0:09:0b:1f:
                90:14:fb:18:56:1d:57:99:a9:76:a2:63:d1:c2:d3:
                a3:f4:3a:ff:91:0d:ee:8d:44:13:58:00:09:93:da:
                e8:6a:fd:64:5f:c3:42:8e:2a:49:6e:0d:73:b7:b9:
                d4:6c:c6:ce:30:c5:82:24:a5:00:37:17:a0:1d:f1:
                c9:e9:e3:18:48:22:4f:33:96:a7:3c:a9:31:f1:3f:
                14:40:6a:74:e8:78:82:45:04:d4:4b:56:0b:cd:be:
                48:8d:03:fb:39:70:0b:91:99:70:06:bd:5e:8b:f2:
                d1:f4:6f:fc:ce:e7:f8:3c:0a:20:ea:35:b8:5f:2f:
                ee:8d:ff:d3:93:85:6b:fb:71:db:1b:e6:e9:1d:a7:
                f8:e4:ae:f4:71:fe:35:a7:89:24:af:69:a4:34:3b:
                14:66:05:02:5e:2a:1d:ac:e0:d2:48:6c:13:4e:75:
                58:93
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Key Usage: critical
            Certificate Sign, CRL Sign
        X509v3 Subject Key Identifier: 
            3B:45:93:3A:2A:BC:39:29:36:13:6C:BD:B6:B4:31:C7:E7:BB:32:73
        X509v3 CRL Distribution Points: 

            Full Name:
              URI:http://security.mycompany.co.za/root.crl

Signature Algorithm: sha256WithRSAEncryption
     4d:96:d4:03:4f:e3:7c:26:be:59:f8:23:87:60:f7:4c:d3:a1:
     1c:77:a1:14:e3:e7:da:c8:2a:a3:1b:06:2a:4d:55:1c:83:26:
     73:46:0d:8a:e4:b7:d1:1e:38:cc:78:90:00:01:b3:8e:f9:3c:
     62:be:04:09:90:4e:22:87:b1:aa:bd:f9:73:bd:a7:76:ad:d5:
     ae:2d:7a:1c:1e:1a:67:c8:57:4c:f9:6d:8b:62:d6:e5:ea:e0:
     40:5c:12:28:7e:ea:f0:0c:d6:cd:f4:1d:d5:56:09:ad:43:b4:
     eb:8c:68:ce:56:a2:a8:ae:a4:d5:35:bb:58:b8:ed:82:82:b5:
     ef:cb:e2:6d:76:61:ed:ee:a5:1f:68:95:07:ed:5b:f0:65:92:
     d2:dc:1d:c6:fa:7f:e0:c9:38:c2:c6:6f:03:38:e7:3a:b0:24:
     06:e0:bc:07:dd:e7:a0:dc:74:09:e5:37:7b:66:e1:6f:47:4c:
     71:ff:02:48:7f:d4:4f:ce:cb:91:e9:ee:cd:b6:f1:0a:03:19:
     3e:19:05:7d:8f:48:e7:f1:cc:07:37:3d:91:3c:6f:54:71:3c:
     a2:6c:55:c3:03:c1:7f:eb:9e:70:f1:8f:a1:fb:62:33:8b:86:
     2c:79:bc:76:e2:01:9a:68:df:af:40:a1:b2:9c:f6:a1:e1:6e:
     2a:dd:1a:d6

원본 대신이 새 인증서를 사용하십시오.

인증서의 유효 기간과 같은 다른 필드와 확장명을 변경할 수 있지만 basicConstraints = critical,CA:true루트 CA 인증서에 대한 제약 조건 (이외 ) 은 없어야합니다 .


추가 고려 사항이 있으면 대체 루트 CA 인증서 basicConstraintkeyUsage확장자 가 없거나 확장명 이 없다는 사실만으로 문제가 될 수 있습니다 . 두 가지 확장을 ext.conf첫 번째에 추가하고 -x509toreq게시 한 방법을 사용하여 결과로 생성 된 새 루트 CA 인증서를 테스트 해 보는 것이 좋습니다.


포괄적 인 답변에 감사드립니다. 실제로 더 잘 이해하는 데 도움이되었습니다. 이것과 @ dave_thompson_085의 의견으로 나는 어린이 인증서를 무효화하지 않는 방식으로 내 CA를 재생성했습니다. 원래의 시도에는 몇 가지 잘못된 점이있었습니다 (아마도 자세한 답변을 게시해야합니까?). "주제 이름"이 특정 필드로 구성된 필드라는 명백한 내성이지만 중요한 점에 감사합니다. 어떻게 든 다른 사람이 답변을 게시할지 의심 하므로이 답변을 수락합니다.
AngerySysadmin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.