TsgcWebSocketClient | SChannel Certificate Revocation

TLSOptions.VerifyCertificate를 True로 설정하면 서버 인증서 체인을 신뢰할 수 있고 그 인증서가 연결 대상 호스트의 이름을 담고 있다는 점이 확인됩니다. 그러나 해당 인증서가 발급된 이후에 해지되었는지 여부에 대해서는 아무것도 알려주지 않습니다.

이 공백은 중요합니다. 인증서가 해지되었지만 아직 만료되지 않은 도난당한 개인 키는 여전히 인증에 성공하며, 바로 이런 경우를 위해 해지가 존재합니다. 해지는 TLSOptions.SChannel_Options.Revocation을 통해 요청한 경우에만 확인됩니다.


oClient.TLS := True;
oClient.TLSOptions.IOHandler := iohSChannel;
oClient.TLSOptions.VerifyCertificate := True;
oClient.TLSOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;

상태는 인증서 체인이 구성되는 동안 조회되며, 이는 인증서에 지정된 CRL 배포 지점 또는 OCSP 응답자에 핸드셰이크 중에 접속한다는 뜻입니다. 이 확인이 기본적으로 꺼져 있는 이유가 바로 이것입니다. 활성화하면 새 연결마다 네트워크 트래픽이 추가됩니다.

Check

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

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

Timeout

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

CacheOnly

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

IgnoreRevocationOffline

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

IgnoreNoRevocationCheck

인증서가 CRL 배포 지점과 OCSP 응답자를 전혀 게시하지 않아 상태를 확인할 수 없을 때 어떻게 처리할지 결정합니다. 기본값은 True로 인증서를 수락합니다.

두 Ignore 속성 중 어느 것도 해지가 확인된 인증서를 수락하는 일은 없습니다. 이 결과는 항상 거부됩니다.

보고되는 오류

연결이 거부되면 그 이유가 다음 중 하나로 OnSChannelVerifyPeer 이벤트에 전달됩니다:

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

보안 기본값

TLSOptions.PresettlspSecureDefaults로 설정하면 다른 강화된 기본값과 함께 이 확인이 scrcChainExcludeRoot로 활성화되고, 두 가지 소프트 실패 설정은 그대로 유지되므로 이를 켜더라도 기존에 동작하던 연결이 끊어지지 않습니다. 프리셋을 적용하기 전에 직접 선택한 범위는 변경되지 않습니다.


oClient.TLSOptions.Preset := tlspSecureDefaults;