Server SSL | SChannel Client Certificate Revocation

SSLOptions.VerifyCertificate를 True로 설정하면 서버는 들어오는 모든 클라이언트에 인증서를 요청하고 클라이언트가 제시한 체인을 검증합니다. 이 검증은 클라이언트 체인을 신뢰할 수 있다는 점을 확인해 줍니다. 그러나 해당 클라이언트 인증서가 발급된 이후에 해지되었는지 여부에 대해서는 아무것도 알려주지 않습니다.

이 공백은 인증서 자체가 자격 증명인 모든 곳에서 중요합니다. 노트북을 분실하거나 직원이 퇴사하여 그에게 발급된 인증서를 해지하더라도, 만료되는 날까지 그 인증서는 여전히 서버에서 세션을 열 수 있습니다. 해지는 SSLOptions.SChannel_Options.Revocation을 통해 요청한 경우에만 확인됩니다.

해지 설정은 클라이언트 인증서를 검증하는 동안 읽히므로, 애초에 서버가 클라이언트 인증서를 요청하도록 만드는 SSLOptions.VerifyCertificate가 True가 아니면 아무런 효과가 없습니다. 인증서를 전혀 제시하지 않는 클라이언트를 거부할지 통과시킬지는 별개의 결정이며, 이는 SSLOptions.VerifyCertificate_Options.FailIfNoCertificate가 결정합니다.


oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.VerifyCertificate := True;
oServer.SSLOptions.VerifyCertificate_Options.FailIfNoCertificate := True;
oServer.SSLOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;

상태는 인증서 체인이 구성되는 동안 조회되며, 이는 클라이언트 인증서에 지정된 CRL 배포 지점 또는 OCSP 응답자에 핸드셰이크 중에 접속한다는 뜻입니다. 이 확인이 기본적으로 꺼져 있는 이유가 바로 이것입니다. 서버가 수락하는 모든 연결 경로에 외부로 나가는 요청이 하나 추가되기 때문입니다.

Check

클라이언트 체인의 어느 범위까지 해지 상태를 조회할지 선택합니다.

scrcDisabled 기본값. 해지 상태를 조회하지 않으며 요구하지도 않습니다.
scrcEndCertificate 클라이언트 인증서만 확인합니다. 연결당 한 번만 조회하므로 가장 비용이 적은 옵션입니다.
scrcChainExcludeRoot 클라이언트 인증서와 이를 발급한 중간 인증서를 확인하고 루트는 확인하지 않습니다. 클라이언트 인증서를 발급하는 CA의 루트가 자신에 대한 CRL을 게시하는 경우는 드물기 때문에 일반적으로 선택하는 값입니다.
scrcChain 루트를 포함한 전체 체인을 확인합니다.

Timeout

URL별이 아니라 해지 정보 조회 전체에 허용되는 밀리초 단위 시간이므로, 응답하지 않는 응답자를 서버가 기다리느라 핸드셰이크가 지연되는 일이 없습니다. 기본값은 5000입니다. 값이 0이면 Windows 기본값이 그대로 적용되며, 이는 상당히 더 길 수 있습니다.

CacheOnly

True이면 Windows가 이미 캐시해 둔 해지 데이터만 사용하고 핸드셰이크가 네트워크에 접속하지 않으므로, 들어오는 연결이 응답자 때문에 지연되는 일이 없습니다. 그 대신 캐시가 비어 있으면 상태를 알 수 없게 되며, 이는 IgnoreNoRevocationCheck가 결정합니다. 기본값은 False입니다.

IgnoreRevocationOffline

응답자에 연결할 수 없을 때 어떻게 처리할지 결정합니다. 기본값은 True로 클라이언트 인증서를 수락하며, 이는 소프트 실패 동작입니다. 대신 거부하려면 False로 설정하십시오. 거부하는 쪽이 더 엄격하지만, 모든 새 연결이 서버에서 응답자에 도달할 수 있는지에 의존하게 되므로 응답자 장애가 곧 모든 클라이언트의 장애가 됩니다.

IgnoreNoRevocationCheck

클라이언트 인증서가 CRL 배포 지점과 OCSP 응답자를 전혀 게시하지 않아 상태를 확인할 수 없을 때 어떻게 처리할지 결정합니다. 기본값은 True로 인증서를 수락합니다. 내부 CA가 발급한 인증서에는 해지 정보가 없는 경우가 많으므로, 클라이언트에 전달하는 모든 인증서가 해지 정보를 게시한다는 점을 확인한 뒤에만 False로 설정하십시오.

두 Ignore 속성 중 어느 것도 해지가 확인된 인증서를 수락하는 일은 없습니다. 이 결과는 항상 거부되며 핸드셰이크가 실패합니다.

보고되는 상태

체인 확인이 클라이언트를 거부하면 그 이유는 다음 중 하나입니다:

ecCryptRevoked 클라이언트 인증서가 발급자에 의해 해지되었습니다. 항상 거부됩니다.
ecCryptRevocationOffline 응답자에 연결할 수 없었습니다. IgnoreRevocationOffline이 False인 경우에만 거부됩니다.
ecCryptNoRevocationCheck 클라이언트 인증서가 해지 정보를 게시하지 않습니다. IgnoreNoRevocationCheck가 False인 경우에만 거부됩니다.

보안 기본값

SSLOptions.PresettlspSecureDefaults로 설정하면 서버에서 이 확인이 scrcChainExcludeRoot로 활성화되어 동일한 프리셋이 클라이언트에 이미 적용하던 것과 일치하게 되고, 두 가지 소프트 실패 설정은 그대로 유지되므로 기존에 허용되던 클라이언트는 계속 허용됩니다. 프리셋을 적용하기 전에 직접 선택한 범위는 변경되지 않습니다.


oServer.SSLOptions.Preset := tlspSecureDefaults;

Notes