Насколько безопасна моя пользовательская логика проверки SSL для обработки исключения RemoteCertificateNameMismatch?

Я пытаюсь загрузить файл в свой домен https://vault.veodin.com/, размещенный на веб-сайте webfaction. .com

Когда вы открываете этот URL, браузер предупреждает вас о несоответствии имени, потому что SSL-сертификат выдан для webfaction.com, а не для veodin.com

Соответственно возникает ошибка sslPolicyError System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch, когда я пытаюсь загрузить файл в этот домен с помощью .Net WebClient.

Для моей цели достаточно убедиться, что цель загрузки размещена на *.webfaction.com.

Можно ли доверять в этом случае certificate.subject?

Задний план:

Обновление: я использовал пользовательский метод CertificateValidationCallback, чтобы проверить, что субъект сертификата и эмитент сертификата соответствуют моим ожиданиям.

ServicePointManager.ServerCertificateValidationCallback = 
   MyCertificatePolicy.CertificateValidationCallBack;

...

 public class MyCertificatePolicy
    {
        public static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
        {
            // If the certificate is a valid, signed certificate, return true.
            if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
            {
                return true;
            }

            //if there is a RemoteCertificateNameMismatch, but the Name is webfaction.com
            //then we can trust the certificate despite the name error
            else if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch
            && certificate.Subject == "CN=*.webfaction.com, OU=WebFaction, O=Swarma Limited, L=London, S=England, C=GB"
            && certificate.Issuer == "CN=DigiCert Global CA, OU=www.digicert.com, O=DigiCert Inc, C=US")
            {
                return true;
            }
            else
            {
                // In all other cases, return false.
                return false;
            }
        }
    }

person Cilvic    schedule 15.09.2011    source источник
comment
Любой желающий может сгенерировать сертификат с любым общим именем. Вы также должны проверить, кто является эмитентом сертификата (цепочки).   -  person vcsjones    schedule 15.09.2011
comment
@vcjones, спасибо, я обновил код, чтобы включить эмитента.   -  person Cilvic    schedule 16.09.2011
comment
Теперь вы только проверяете, создал ли кто-нибудь сертификат эмитента с указанным вами именем и выдал ли он (возможно, сам) сертификат для webfaction.com. вы должны проверить фактический сертификат эмитента в хранилище сертификатов или жестко закодировать хэш сертификата эмитента (но это означает, что вы должны обновить свой код при изменении сертификата эмитента)   -  person eFloh    schedule 16.09.2011
comment
@eFloh спасибо за сценарий, я думал, что это вызовет RemoteCertificateChainErrors   -  person Cilvic    schedule 16.09.2011
comment
@Cilvic: О, я, возможно, проглядел. Без проверки это кажется логичным. Если бы злоумышленник поместил пользовательский корневой сертификат в доверенное хранилище, это снова активировало бы мой сценарий, но в этом случае, я думаю, у вас больше проблем на этой машине.   -  person eFloh    schedule 19.09.2011