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 응답자에 핸드셰이크 중에 접속한다는 뜻입니다. 이 확인이 기본적으로 꺼져 있는 이유가 바로 이것입니다. 활성화하면 새 연결마다 네트워크 트래픽이 추가됩니다.
체인의 어느 범위까지 해지 상태를 조회할지 선택합니다.
| scrcDisabled | 기본값. 해지 상태를 조회하지 않으며 요구하지도 않습니다. |
| scrcEndCertificate | 서버 인증서만 확인합니다. 연결당 한 번만 조회하므로 가장 비용이 적은 옵션입니다. |
| scrcChainExcludeRoot | 서버 인증서와 중간 인증서를 확인하고 루트는 확인하지 않습니다. 자체 서명된 루트가 자신에 대한 CRL을 게시하는 경우는 드물기 때문에 일반적으로 선택하는 값입니다. |
| scrcChain | 루트를 포함한 전체 체인을 확인합니다. |
URL별이 아니라 해지 정보 조회 전체에 허용되는 밀리초 단위 시간이므로, 응답하지 않는 응답자가 핸드셰이크를 지연시킬 수 없습니다. 기본값은 5000입니다. 값이 0이면 Windows 기본값이 그대로 적용되며, 이는 상당히 더 길 수 있습니다.
True이면 Windows가 이미 캐시해 둔 해지 데이터만 사용하고 핸드셰이크가 네트워크에 접속하지 않으므로 결코 지연되지 않습니다. 그 대신 캐시가 비어 있으면 상태를 알 수 없게 되며, 이는 IgnoreNoRevocationCheck가 결정합니다. 기본값은 False입니다.
응답자에 연결할 수 없을 때 어떻게 처리할지 결정합니다. 기본값은 True로 인증서를 수락하며, 이는 웹 브라우저가 사용하는 소프트 실패 동작입니다. 대신 거부하려면 False로 설정하십시오. 거부하는 쪽이 더 엄격하지만, 모든 연결이 응답자에 도달할 수 있는지에 의존하게 되므로 응답자 장애가 곧 애플리케이션의 장애가 됩니다.
인증서가 CRL 배포 지점과 OCSP 응답자를 전혀 게시하지 않아 상태를 확인할 수 없을 때 어떻게 처리할지 결정합니다. 기본값은 True로 인증서를 수락합니다.
두 Ignore 속성 중 어느 것도 해지가 확인된 인증서를 수락하는 일은 없습니다. 이 결과는 항상 거부됩니다.
연결이 거부되면 그 이유가 다음 중 하나로 OnSChannelVerifyPeer 이벤트에 전달됩니다:
| ecCryptRevoked | 인증서가 발급자에 의해 해지되었습니다. 항상 거부됩니다. |
| ecCryptRevocationOffline | 응답자에 연결할 수 없었습니다. IgnoreRevocationOffline이 False인 경우에만 거부됩니다. |
| ecCryptNoRevocationCheck | 인증서가 해지 정보를 게시하지 않습니다. IgnoreNoRevocationCheck가 False인 경우에만 거부됩니다. |
TLSOptions.Preset을 tlspSecureDefaults로 설정하면 다른 강화된 기본값과 함께 이 확인이 scrcChainExcludeRoot로 활성화되고, 두 가지 소프트 실패 설정은 그대로 유지되므로 이를 켜더라도 기존에 동작하던 연결이 끊어지지 않습니다. 프리셋을 적용하기 전에 직접 선택한 범위는 변경되지 않습니다.
oClient.TLSOptions.Preset := tlspSecureDefaults;