В конечном итоге я решил написать класс, реализующий ICertificatePolicy с настраиваемой логикой проверки:
private X509CertificateCollection _certs;
private ICertificatePolicy _defaultPolicy;
public bool CheckValidationResult(ServicePoint svcPoint, X509Certificate cert, WebRequest req, int problem)
{
if ((_defaultPolicy != null) && _defaultPolicy.CheckValidationResult(svcPoint, cert, req, problem))
{
return true;
}
foreach (X509Certificate caCert in _certs)
{
if (caCert.Equals(cert))
{
return true;
}
}
return false;
}
(проверка ошибок опущена для краткости.)
_defaultPolicy
можно установить на ServicePointManager.CertificatePolicy
, чтобы разрешить использование хранилища сертификатов по умолчанию в дополнение к настраиваемым сертификатам.
_certs
содержит дополнительные сертификаты. Он генерируется путем анализа файла PEM и вызова _certs.Add(new X509Certificate(Convert.FromBase64String(base64cert)));
CertificatePolicy
устарел ServerCertificateValidationCallback
, но мне нужно было поддерживать старую версию .NET.