c# – Как использовать сертификат клиента для аутентификации и авторизации в веб-API –

c# - Как использовать сертификат клиента для аутентификации и авторизации в веб-API - Сертификаты
Содержание
  1. Что такое ssl-сертификат?
  2. C# – как использовать сертификат клиента для аутентификации и авторизации в веб-api –
  3. Windows 10
  4. Windows 7
  5. Где купить ssl-сертификат?
  6. Зачем нам нужны сертификаты
  7. Защита для бизнеса и клиентов
  8. Как использовать сертификаты в .net коде
  9. Помогла ли вам эта статья?
  10. Приложение
  11. Самозаверяющие сертификаты
  12. Создание самозаверяющегося сертификата в iis
  13. Сертификаты домена
  14. Создание доменного сертификата в iis
  15. Сертификаты, подписанные центром сертификации (ca)
  16. Создание доменного сертификата в iis
  17. Создание самозаверяющегося сертификата в iis
  18. Создание сертификата ssl
  19. Сертификаты, подписанные центром сертификации (ca)
  20. Сертификаты домена
  21. Создание доменного сертификата в iis
  22. Самозаверяющие сертификаты
  23. Создание самозаверяющегося сертификата в iis
  24. Способ 1: установка правильного времени
  25. Способ 2: обновление корневых сертификатов
  26. Способ 3: устранение вирусной угрозы
  27. Способ 4: установка сертификатов geotrust
  28. Заключение

Что такое ssl-сертификат?

c# - Как использовать сертификат клиента для аутентификации и авторизации в веб-API -

Многие наверняка слышали про

, но не все чётко представляют, что это такое и для чего они нужны. По сути, SSL-сертификат — цифровая подпись вашего сайта, подтверждающая его подлинность. Использование сертификата позволяет защитить как владельца сайта, так и его клиентов. SSL-сертификат даёт возможность владельцу применить к своему сайту технологию SSL-шифрования.

C# – как использовать сертификат клиента для аутентификации и авторизации в веб-api –

Я пытаюсь использовать сертификат клиента для аутентификации и авторизации устройств с помощью веб-API, и разработал простое доказательство концепции для работы с проблемами с потенциальным решением. Я столкнулся с проблемой, когда сертификат клиента не получает веб-приложение. Несколько человек сообщили об этой проблеме, в том числе в этом Q & amp; A, но ни у одного из них нет ответа. Я надеюсь предоставить более подробную информацию, чтобы возобновить эту проблему и, надеюсь, получить ответ на мою проблему. Я открыт для других решений. Основное требование – автономный процесс, написанный на C #, может вызывать веб-API и проходить аутентификацию с использованием сертификата клиента.

Веб-API в этом POC очень прост и возвращает только одно значение. Он использует атрибут для проверки использования HTTPS и наличия сертификата клиента.

public class SecureController : ApiController
{
    [RequireHttps]
    public string Get(int id)
    {
        return "value";
    }

}

Вот код для RequireHttpsAttribute:

public class RequireHttpsAttribute : AuthorizationFilterAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
        { 
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden) 
            { 
                ReasonPhrase = "HTTPS Required" 
            }; 
        } 
        else 
        {
            var cert = actionContext.Request.GetClientCertificate();
            if (cert == null)
            {
                actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
                {
                    ReasonPhrase = "Client Certificate Required"
                }; 

            }
            base.OnAuthorization(actionContext); 
        } 
    } 
}

В этом POC я просто проверяю наличие сертификата клиента. Как только это сработает, я могу добавить в сертификат проверки информации для проверки на соответствие списку сертификатов.

Вот настройки в IIS для SSL для этого веб-приложения.

enter image description here

Вот код для клиента, который отправляет запрос с сертификатом клиента. Это консольное приложение.

    private static async Task SendRequestUsingHttpClient()
    {
        WebRequestHandler handler = new WebRequestHandler();
        X509Certificate certificate = GetCert("ClientCertificate.cer");
        handler.ClientCertificates.Add(certificate);
        handler.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
        handler.ClientCertificateOptions = ClientCertificateOption.Manual;
        using (var client = new HttpClient(handler))
        {
            client.BaseAddress = new Uri("https://localhost:44398/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = await client.GetAsync("api/Secure/1");
            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Received response: {0}",content);
            }
            else
            {
                Console.WriteLine("Error, received status code {0}: {1}", response.StatusCode, response.ReasonPhrase);
            }
        }
    }

    public static bool ValidateServerCertificate(
      object sender,
      X509Certificate certificate,
      X509Chain chain,
      SslPolicyErrors sslPolicyErrors)
    {
        Console.WriteLine("Validating certificate {0}", certificate.Issuer);
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

        // Do not allow this client to communicate with unauthenticated servers.
        return false;
    }

Когда я запускаю это тестовое приложение, я получаю код состояния 403 Forbidden с фразой причины «Требуется сертификат клиента», указывающей, что оно попадает в мой RequireHttpsAttribute и не находит никаких клиентских сертификатов. Запустив это через отладчик, я убедился, что сертификат загружается и добавляется в WebRequestHandler. Сертификат экспортируется в загружаемый файл CER. Полный сертификат с закрытым ключом находится в личных и доверенных корневых хранилищах локального компьютера для сервера веб-приложений. Для этого теста клиент и веб-приложение запускаются на одном компьютере.

Я могу вызвать этот метод веб-API с помощью Fiddler, прикрепив тот же сертификат клиента, и он отлично работает. При использовании Fiddler он проходит тесты в RequireHttpsAttribute и возвращает успешный код состояния 200 и возвращает ожидаемое значение.

Кто-нибудь сталкивался с той же проблемой, когда HttpClient не отправляет сертификат клиента в запросе, и нашел решение?

Обновление 1:

Я также попытался получить сертификат из хранилища сертификатов, в котором есть закрытый ключ. Вот как я его получил:

    private static X509Certificate2 GetCert2(string hostname)
    {
        X509Store myX509Store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        myX509Store.Open(OpenFlags.ReadWrite);
        X509Certificate2 myCertificate = myX509Store.Certificates.OfType<X509Certificate2>().FirstOrDefault(cert => cert.GetNameInfo(X509NameType.SimpleName, false) == hostname);
        return myCertificate;
    }

Я убедился, что этот сертификат получен правильно и был добавлен в коллекцию клиентских сертификатов. Но я получил те же результаты, когда код сервера не извлекает никаких клиентских сертификатов.

Для полноты, вот код, используемый для извлечения сертификата из файла:

    private static X509Certificate GetCert(string filename)
    {
        X509Certificate Cert = X509Certificate.CreateFromCertFile(filename);
        return Cert;

    }

Вы заметите, что когда вы получаете сертификат из файла, он возвращает объект типа X509Certificate, а когда вы получаете его из хранилища сертификатов, он имеет тип X509Certificate2. Метод X509CertificateCollection.Add ожидает тип X509Certificate.

Обновление 2: Я все еще пытаюсь понять это и пробовал много разных вариантов, но безрезультатно.

  • Я изменил веб-приложение, чтобы оно работало на имени хоста, а не на локальном хосте.
  • Я установил для веб-приложения требование SSL
  • Я подтвердил, что сертификат был настроен для аутентификации клиента и что он находится в доверенном корне
  • Помимо тестирования сертификата клиента в Fiddler, я также проверил его в Chrome.

В какой-то момент во время попытки этих вариантов он начал работать. Затем я начал откладывать изменения, чтобы посмотреть, что заставило их работать. Он продолжал работать. Затем я попытался удалить сертификат из доверенного корня, чтобы убедиться, что это необходимо, и он перестал работать, и теперь я не могу вернуть его к работе, хотя я вернул сертификат в доверенный корень. Теперь Chrome даже не запрашивает у меня сертификат, аналогичный тому, что он использовал, и он не работает в Chrome, но все еще работает в Fiddler. Должна быть какая-то волшебная конфигурация, которую мне не хватает.

Я также попытался включить «Согласование сертификата клиента» в привязке, но Chrome по-прежнему не запрашивает сертификат клиента. Вот настройки с помощью “netsh http show sslcert”

 IP:port                 : 0.0.0.0:44398
 Certificate Hash        : 429e090db21e14344aa5d75d25074712f120f65f
 Application ID          : {4dc3e181-e14b-4a21-b022-59fc669b0914}
 Certificate Store Name  : MY
 Verify Client Certificate Revocation    : Disabled
 Verify Revocation Using Cached Client Certificate Only    : Disabled
 Usage Check    : Enabled
 Revocation Freshness Time : 0
 URL Retrieval Timeout   : 0
 Ctl Identifier          : (null)
 Ctl Store Name          : (null)
 DS Mapper Usage    : Disabled
 Negotiate Client Certificate    : Enabled

Вот сертификат клиента, который я использую:

enter image description here

enter image description here

enter image description here

Я сбит с толку, в чем проблема. Я добавляю награду для всех, кто может помочь мне в этом разобраться.

Лучший ответ

Трассировка помогла мне найти, в чем проблема (спасибо, Фабиан за это предложение). При дальнейшем тестировании я обнаружил, что могу заставить сертификат клиента работать на другом сервере (Windows Server 2021). Я тестировал это на своей машине разработки (Window 7), чтобы отладить этот процесс. Таким образом, сравнив трассировку с IIS Server, который работал, и тем, который не работал, я смог точно определить соответствующие строки в журнале трассировки. Вот часть журнала, в которой работал сертификат клиента. Это настройка прямо перед отправкой

System.Net Information: 0 : [17444] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=CredentialsNeeded).
System.Net Information: 0 : [17444] SecureChannel#54718731 - We have user-provided certificates. The server has not specified any issuers, so try all the certificates.
System.Net Information: 0 : [17444] SecureChannel#54718731 - Selected certificate:

Вот как выглядел журнал трассировки на машине, на которой произошел сбой сертификата клиента.

System.Net Information: 0 : [19616] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=CredentialsNeeded).
System.Net Information: 0 : [19616] SecureChannel#54718731 - We have user-provided certificates. The server has specified 137 issuer(s). Looking for certificates that match any of the issuers.
System.Net Information: 0 : [19616] SecureChannel#54718731 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [19616] Using the cached credential handle.

Сосредоточившись на строке, в которой указано, что сервер указал 137 эмитентов, я нашел это Вопросы и ответы, похожие на мою проблему. Решение для меня не было помечено как ответ, поскольку мой сертификат находился в доверенном корне. Ответ – тот, который находится под ним, где вы обновляете реестр. Я просто добавил значение в раздел реестра.

HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control SecurityProviders SCHANNEL

Имя значения: SendTrustedIssuerList Тип значения: REG_DWORD Данные значения: 0 (Ложь)

После добавления этого значения в реестр он начал работать на моей машине с Windows 7. Похоже, это проблема Windows 7.

Глядя на исходный код, я также думаю, что с закрытым ключом должна быть какая-то проблема.

На самом деле он проверяет, имеет ли переданный сертификат тип X509Certificate2 и имеет ли он закрытый ключ.

Если он не находит закрытый ключ, он пытается найти сертификат в хранилище CurrentUser, а затем в хранилище LocalMachine. Если он находит сертификат, он проверяет наличие закрытого ключа.

(см. исходный код из класса SecureChannnel, метод EnsurePrivateKey)

Таким образом, в зависимости от того, какой файл вы импортировали (.cer – без закрытого ключа или .pfx – с закрытым ключом) и в каком магазине он может не найти нужный, Request.ClientCertificate не будет заполнен.

Вы можете активировать Network Tracing, чтобы попробовать чтобы отладить это. Это даст вам следующий результат:

Про сертификаты:  1С Отчетность: Указан неправильный алгоритм

У меня действительно была похожая проблема, когда у нас было много доверенных корневых сертификатов. На нашем недавно установленном веб-сервере было больше сотни файлов. Наш корень начинался с буквы Z, поэтому он оказался в конце списка.

Проблема заключалась в том, что IIS отправил клиенту только первые двадцать с чем-то доверенных корней и усек остальные , включая наш. Это было несколько лет назад, не могу вспомнить название инструмента … он был частью пакета администрирования IIS, но Fiddler тоже должен. Осознав ошибку, мы удалили много доверенных корней, которые нам не нужны. Это было сделано методом проб и ошибок, поэтому будьте осторожны при удалении.

После очистки все заработало как шарм.

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

  1. Закрытый ключ фактически экспортируется как часть сертификата.

  2. Удостоверение пула приложений, на котором запущено приложение, имеет доступ к указанному закрытому ключу.

В нашем случае пришлось:

  1. Импортируйте файл pfx в хранилище локального сервера, установив флажок экспорта, чтобы убедиться, что закрытый ключ был отправлен.
  2. Используя консоль MMC, предоставьте учетной записи службы доступ к закрытому ключу сертификата.

Проблема с доверенным корнем, описанная в других ответах, является допустимой, но в нашем случае это не проблема.

Обновление:

Пример от Microsoft:

https://my-sertif.ru/en-us/azure/app-service/app-service-web-configure-tls-mutual-auth#special-considerations-for-certificate-validation

Исходный

Вот как я получил сертификат клиента и проверял, выдал ли его конкретный корневой центр сертификации и является ли он конкретным сертификатом.

Сначала я отредактировал <src>.vsconfigapplicationhost.config и внес следующее изменение: <section name="access" overrideModeDefault="Allow" />

Это позволяет мне редактировать <system.webServer> в web.config и добавлять следующие строки, которые потребуют сертификации клиента в IIS Express. Примечание. Я отредактировал это в целях разработки, не разрешайте переопределения в рабочей среде .

Для производства следуйте инструкциям, подобным этому, чтобы настроить IIS:

https://medium.com/@hafizmohammedg/configuring-client-certificates-on-iis-95aef4174ddb

Web.config :

<security>
  <access sslFlags="Ssl,SslNegotiateCert,SslRequireCert" />
</security>

Контроллер API:

[RequireSpecificCert]
public class ValuesController : ApiController
{
    // GET api/values
    public IHttpActionResult Get()
    {
        return Ok("It works!");
    }
}

Атрибут :

public class RequireSpecificCertAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            X509Certificate2 cert = actionContext.Request.GetClientCertificate();
            if (cert == null)
            {
                actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
                {
                    ReasonPhrase = "Client Certificate Required"
                };

            }
            else
            {
                X509Chain chain = new X509Chain();

                //Needed because the error "The revocation function was unable to check revocation for the certificate" happened to me otherwise
                chain.ChainPolicy = new X509ChainPolicy()
                {
                    RevocationMode = X509RevocationMode.NoCheck,
                };
                try
                {
                    var chainBuilt = chain.Build(cert);
                    Debug.WriteLine(string.Format("Chain building status: {0}", chainBuilt));

                    var validCert = CheckCertificate(chain, cert);

                    if (chainBuilt == false || validCert == false)
                    {
                        actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
                        {
                            ReasonPhrase = "Client Certificate not valid"
                        };
                        foreach (X509ChainStatus chainStatus in chain.ChainStatus)
                        {
                            Debug.WriteLine(string.Format("Chain error: {0} {1}", chainStatus.Status, chainStatus.StatusInformation));
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.ToString());
                }
            }

            base.OnAuthorization(actionContext);
        }
    }

    private bool CheckCertificate(X509Chain chain, X509Certificate2 cert)
    {
        var rootThumbprint = WebConfigurationManager.AppSettings["rootThumbprint"].ToUpper().Replace(" ", string.Empty);

        var clientThumbprint = WebConfigurationManager.AppSettings["clientThumbprint"].ToUpper().Replace(" ", string.Empty);

        //Check that the certificate have been issued by a specific Root Certificate
        var validRoot = chain.ChainElements.Cast<X509ChainElement>().Any(x => x.Certificate.Thumbprint.Equals(rootThumbprint, StringComparison.InvariantCultureIgnoreCase));

        //Check that the certificate thumbprint matches our expected thumbprint
        var validCert = cert.Thumbprint.Equals(clientThumbprint, StringComparison.InvariantCultureIgnoreCase);

        return validRoot && validCert;
    }
}

Затем можно вызвать API с такой сертификацией клиента, протестированной в другом веб-проекте.

[RoutePrefix("api/certificatetest")]
public class CertificateTestController : ApiController
{

    public IHttpActionResult Get()
    {
        var handler = new WebRequestHandler();
        handler.ClientCertificateOptions = ClientCertificateOption.Manual;
        handler.ClientCertificates.Add(GetClientCert());
        handler.UseProxy = false;
        var client = new HttpClient(handler);
        var result = client.GetAsync("https://localhost:44331/api/values").GetAwaiter().GetResult();
        var resultString = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        return Ok(resultString);
    }

    private static X509Certificate GetClientCert()
    {
        X509Store store = null;
        try
        {
            store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);

            var certificateSerialNumber= "‎81 c6 62 0a 73 c7 b1 aa 41 06 a3 ce 62 83 ae 25".ToUpper().Replace(" ", string.Empty);

            //Does not work for some reason, could be culture related
            //var certs = store.Certificates.Find(X509FindType.FindBySerialNumber, certificateSerialNumber, true);

            //if (certs.Count == 1)
            //{
            //    var cert = certs[0];
            //    return cert;
            //}

            var cert = store.Certificates.Cast<X509Certificate>().FirstOrDefault(x => x.GetSerialNumberString().Equals(certificateSerialNumber, StringComparison.InvariantCultureIgnoreCase));

            return cert;
        }
        finally
        {
            store?.Close();
        }
    }
}

Windows 10

Для актуальной на момент написания статьи версии «окон» процесс получения обновлений максимально простой – достаточно убедиться, что активна система их автоматической загрузки, или же вручную установить накопительный пакет. На нашем сайте уже есть соответствующие руководства, приведём на них ссылки ниже.

Подробнее:Как включить автообновления Windows 10Обновления Windows 10 до актуального состояния вручную

Windows 7

С «семёркой» дела обстоят иначе – её официальная поддержка уже прекращена, поэтому настоятельно рекомендуем установить Windows 10. Но если это по тем или иным причинам неприемлемо, выход из ситуации есть – действуйте так:

  1. Перейдите по указанной ниже ссылке.

    Каталог центра обновлений Microsoft

  2. На этой странице воспользуйтесь поисковой строкой, в которую введите запрос KB2813430 и нажмите Enter.
  3. Начать поиск обновления для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере в Windows 7

  4. Появится перечень доступных файлов. Воспользуйтесь сочетанием Ctrl F для вызова поиска, и в качестве запроса введите Windows 7. Внимательно осмотрите найденные ссылки – версии для пользовательских компьютеров называются «Обновление для системы безопасности Windows 7 для систем на базе … (KB2813430)» с указанием разрядности. Выберите соответствующий вашей версии ОС и воспользуйтесь кнопкой «Загрузить».
  5. Загрузка обновления для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере в Windows 7

  6. После скачивания установочного файла запустите его и инсталлируйте, следуя инструкциям на экране.
  7. Установка обновления для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере в Windows 7

    Обновления ОС весьма эффективно устраняют рассматриваемую проблему.

Где купить ssl-сертификат?

c# - Как использовать сертификат клиента для аутентификации и авторизации в веб-API -

Приобретают сертификаты обычно не напрямую у удостоверяющего центра, а через партнёров. В России продажей сертификатов известных удостоверяющих центров (УЦ), таких как Comodo, Geotrust, GoDaddy, GlobalSign, Symantec и прочих, занимается множество компаний.

Зачем нам нужны сертификаты

Прежде чем приступать к работе с сертификатами, необходимо понять, зачем они нам нужны. Давайте рассмотрим пару человек. Традиционно их называют Алисой и Бобом. Им необходимо общаться между собой, и единственным способом, которым они могут это сделать, является обмен сообщениями через открытый канал передачи данных:

Алиса и Боб
Алиса и Боб

Все используемые иконки созданы Vitaly Gorbachev на сайте Flaticon

К сожалению, поскольку канал является открытым, любой при желании может прослушивать и даже изменять сообщения, которыми обмениваются Алиса и Боб:

Человек посередине
Человек посередине

Эта ситуация называется атакой “Человек посередине” (Man in the Middle).

Как Алисе и Бобу защититься от этой опасности? На помощь приходит шифрование. Наиболее древними и распространёнными системами шифрования являются системы с симметричным ключом. В этом случае Алиса и Боб должны оба обладать абсолютно одинаковым (поэтому он и называется симметричным) ключом, который неизвестен никому более.

Правда у хакера остаётся возможность повторить отправку одного или нескольких сообщений, переданных ранее. В ряде случаев это может так же представлять собой серьёзную опасность (представьте себе, что хакер может повторить запрос на перевод денег с одного счёта на другой).

Симметричное шифрование
Симметричное шифрование

Но вернёмся к нашим Алисе и Бобу. Кажется, что проблема решена. Но не тут-то было. Загвоздка в том, как обоим нашим участникам получить одинаковые ключи шифрования так, чтобы этот ключ не узнал никто другой. Ведь общаться они могут только по открытому каналу.

Что же делать? На помощь приходит асимметричное шифрование или шифрование с открытым ключом. Суть его состоит в следующем. Пусть Алиса хочет передать сообщение Бобу. Боб теперь генерирует не один, а два ключа – открытый и закрытый.

Открытый ключ не представляет секрета. Его Боб свободно раздаёт всем желающим общаться с ним. А вот закрытый ключ Боб хранит в тайне и не показывает никому, даже Алисе. Хитрость заключается в том, что если зашифровать сообщение с помощью открытого ключа, то расшифровать его можно только с помощью закрытого ключа. И наоборот, сообщение, зашифрованное закрытым ключом, расшифровывается открытым ключом.

Теперь ясно, как Алиса и Боб должны действовать. Каждый из них генерирует свои открытый и закрытый ключи. Затем они обмениваются открытыми ключами через их канал связи. Поскольку открытые ключи не представляют собой секрета, их можно передавать через открытые каналы.

Закрытые ключи они хранят у себя в тайне. Пусть теперь Боб хочет послать сообщение Алисе. Он шифрует его открытым ключом Алисы и посылает сообщение по каналу. Расшифровать сообщение может только обладатель закрытого ключа, т. е. только Алиса. Хакер этого сделать не может.

Шифрование с открытым ключом
Шифрование с открытым ключом

На самом деле всё чуть сложнее. Дело в том, что шифрование с открытым ключом работает намного медленнее симметричного шифрования. Шифровать таким способом большие объёмы данных представляется неудобным. Поэтому, когда Боб хочет общаться с Алисой, он поступает следующим образом.

Он генерирует новый ключ для системы симметричного шифрования (его обычно называют сеансовым ключом). Потом он шифрует этот сеансовый ключ открытым ключом Алисы и посылает его ей. Теперь у Алисы и Боба есть ключ симметричного шифрования, который неизвестен больше никому. С этого момента они свободно могут пользоваться быстрыми алгоритмами симметричного шифрования.

Казалось бы, проблема решена. Но всё не так просто. Хакеру, контролирующему канал связи, есть что нам сказать. Проблема снова кроется в механизме распространения ключей, но теперь уже открытых ключей. Давайте посмотрим, что может произойти.

Пусть Алиса сгенерировала пару из открытого и закрытого ключа. Теперь она хочет передать свой открытый ключ Бобу. Она посылает этот ключ по каналу передачи данных. В этот момент хакер перехватывает этот ключ, не давая ему достичь Боба. Вместо этого хакер генерирует свою пару из открытого и закрытого ключа.

Про сертификаты:  Обзор на Staffcop Enterprise 4.9
Атака на распространение открытых ключей
Атака на распространение открытых ключей

Да, теперь у нас фигурирует масса различных ключей. Давайте разберёмся, как всё это работает. Пусть Боб хочет послать сообщение Алисе. Он шифрует его открытым ключом, который, как он думает, принадлежит Алисе. Но на самом деле ключ этот принадлежит хакеру.

Хакер перехватывает это сообщение, не давая ему достигнуть Алисы. Поскольку сообщение зашифровано открытым ключом хакера, то он может расшифровать его своим закрытым ключом, прочитать и изменить так, как сочтёт нужным. После этого он зашифровывает сообщение настоящим открытым ключом Алисы (помните, что он сохранил этот ключ у себя) и отправляет его ей.

Что же можно сделать, чтобы избежать подобного развития ситуации? И здесь мы подбираемся вплотную к сертификатам. Представьте себе, что Алиса распространяет по открытому каналу не просто свой открытый ключ, а ключ с прикреплённой к нему биркой, на которой написано, что этот ключ принадлежит Алисе. На бирке так же содержится подпись некоего уважаемого лица, которому доверяют как Алиса, так и Боб:

Подписанный открытый ключ
Подписанный открытый ключ

Считается, что ключ и бирка на нём составляют единое целое. Бирку нельзя отсоединить от одного ключа и присоединить к другому. Тогда, если хакер не может подделать подпись, то он не может подделать и ключ. Боб, получив ключ с биркой, на которой написано, что это ключ Алисы, и стоит подпись, которой он доверяет, может быть уверен, что это именно ключ Алисы, а не кого-то другого.

Можно считать, что ключ с такой биркой и представляют собой сертификат. Но как на самом деле он устроен в цифровом мире?

В цифровом мире всё, что угодно, можно представить в виде последовательности бит (нулей и единиц). Это относится и к нашим ключам. Что же нужно сделать, чтобы создать цифровую подпись для такой последовательности бит? Такая подпись должна обладать следующими свойствами:

Как же создать такую подпись? Можно поступить так. Сначала для нашей последовательности бит считается так называемый хеш. Вы передаёте вашу последовательность бит на вход некоторой функции (называемой функцией хеширования), и она возвращает вам другую последовательность бит, но уже очень короткую. Эта выходная последовательность и называется хешем. Все современные функции хеширования обладают следующими свойствами:

  • Для входной последовательности любой длины они всегда генерируют хеш одной и той же длины. Обычно эта длина не превышает нескольких десятков байт. Помните, что наша подпись должна быть короткой. Именно это свойство хеша и делает его удобным для использования в подписи.

  • Зная только хеш, вы не можете сказать, из какой последовательности бит он был получен. Т. е. восстановление этой последовательности из хеша невозможно.

  • Если у вас есть значение хеша некоторой последовательности бит, то вам очень трудно указать другую последовательность бит, дающую такой же хеш. Действительно, различных файлов длиной в 1 ГБайт очень много. Но для каждого из них можно посчитать хеш длиной, скажем, всего в 32 байта. Различных последовательностей бит длиной в 32 байта намного меньше, чем различных файлов длиной в 1 ГБайт. Это значит, что обязательно будут существовать два различных файла длиной в 1 ГБайт, дающие один и тот же хеш. И тем не менее, зная один такой файл и его хеш, очень сложно узнать другой файл, дающий такой же хеш.

С хешами разобрались. Но, к сожалению, сам по себе хеш не подходит на роль подписи. Да, он короткий, но его может посчитать любой. Хакер может сам вычислить хеш для своего открытого ключа, ничто не препятствует ему сделать это. Как же нам сделать хеш устойчивым к подделке? Здесь на помощь нам снова приходит шифрование с открытым ключом.

Помните, я говорил, что и Алиса, и Боб должны доверять подписи, которая стоит на бирке ключа. Пусть Алиса и Боб доверяют подписи Очень Важного Человека. Как же Очень Важный Человек может подписать ключ? Он генерирует свою пару из открытого и закрытого ключа.

Открытый ключ он передаёт Алисе и Бобу, а закрытый хранит у себя. Когда ему нужно подписать открытый ключ Алисы, он поступает так. Сначала он считает хеш ключа Алисы, а затем шифрует этот хеш своим закрытым ключом. Именно хеш, зашифрованный закрытым ключом Очень Важного Человека (его обычно называют certificate authority) и является подписью. Поскольку никто не знает закрытого ключа Очень Важного Человека, то никто и не может подделать его подпись.

С созданием подписи мы разобрались. Осталось понять, как проверить её подлинность, как проверить то, что подпись не была подделана. Итак, Боб получил некоторый ключ, на бирке которого написано, что это открытый ключ Алисы. А также там присутствует подпись вроде бы Очень Важного Человека.

Как это проверить? Во-первых, Боб вычисляет хеш полученного открытого ключа. Помните, что это может сделать любой. Затем Боб расшифровывает подпись с помощью открытого ключа Очень Важного Человека. Мы помним, что подпись представляет собой тот же зашифрованный хеш.

После этого Боб сравнивает два хеша: посчитанный им самостоятельно и тот, который он получил при расшифровке подписи. Если они совпадают, то всё в порядке, можно верить тому, что это ключ Алисы. Если же хеши отличаются, то доверять такому ключу нельзя. Поскольку хакер не может создать правильную подпись он не может и подсунуть Бобу другой ключ.

Итак, как я уже сказал, сертификат, в сущности, представляет собой ключ и подпись к нему. На практике в него добавляется масса иной информации:

Хеш и подпись строятся по всей совокупности этих данных, чтобы хакер не мог подделать ничего из них.

Однако в нашей строгой схеме всё ещё существует одна брешь. Надеюсь, вы уже поняли к чему я веду. А каким образом Алиса и Боб получают открытый ключ Очень Важного Человека? Ведь если хакер сможет подсунуть им вместо настоящего ключа свой ключ, то всё пропало.

Ну конечно же открытый ключ Очень Важного Человека распространяется так же с помощью сертификата, но теперь уже подписанного Очень-Очень Важным Человеком. Хм… А как же распространяется открытый ключ Очень-Очень Важного Человека? Ну конечно же тоже сертификатом. Ну вы поняли… там сертификаты до самого дна.

Но шутки в сторону. Действительно, сертификат Алисы может быть подписан сертификатом Очень Важного Человека, а тот – сертификатом Очень-Очень Важного Человека. Это называется цепочкой доверия. Но эта цепочка не бесконечна. Обычно она заканчивается корневым сертификатом.

Этот сертификат никем не подписан, а точнее, он подписан сам собой (self-signed certificate). Обычно корневые сертификаты принадлежат очень надёжным компаниям, которые, собственно, и занимаются тем, что подписывают другие сертификаты с помощью своих корневых сертификатов.

Раньше эти компании брали деньги за подписывание сертификатов. Теперь появились сервисы типа Let’s Encrypt, которые делают это бесплатно. Я думаю, что многие большие компании осознали, что лучше предоставлять сертификаты бесплатно и тем самым сделать Интернет более защищённым пространством, нежели иметь массу слабо защищённых сайтов, которые могут быть взломаны и использованы как площадки для атаки на эти же большие компании.

Но вернёмся к сертификатам. Осталось рассмотреть последний вопрос. Почему же мы доверяем корневым сертификатам? Что мешает хакеру подменить их? А всё дело в способе их доставки на компьютеры Боба и Алисы. Дело в том, что основные корневые сертификаты не распространяются по открытому каналу, а устанавливаются вместе с операционной системой. Недавно некоторые браузеры так же стали устанавливаться со своим набором доверенных сертификатов.

Вот и всё, что я сегодня хотел сказать о сертификатах. С ними связана ещё масса интересных вещей, например, механизмы устаревания и отзыва сертификатов, но мы не будем касаться этого здесь. Пора нам перейти к практическим вещам.

Защита для бизнеса и клиентов

c# - Как использовать сертификат клиента для аутентификации и авторизации в веб-API -

Каким же сайтам нужна защита SSL? Да практически всем. Особенно тем, которые в наибольшей степени подвержены атакам: ресурсам финансовых учреждений, крупных брендов, сайтам, работающим с персональными данными и платёжной информацией.

Как использовать сертификаты в .net коде

Итак, у нас есть Web-сервер, написанный на ASP.NET Core. И мы хотим защитить его созданным нами сертификатом. Сперва этот сертификат нужно получить в коде нашего сервера. Здесь есть два варианта.

Первый вариант – получение сертификата из PFX-файла. Этот вариант применяется, если у вас есть файл сертификата, который вы устанавливали в хранилище доверенных сертификатов. Тогда получить сертификат можно так:

var certificate = new X509Certificate2(
    "certificateForServerAuthorization.pfx",
    "p@ssw0rd"
);

Здесь certificateForServerAuthorization.pfx – имя файла сертификата, а p@ssw0rd – пароль, который вы использовали для его защиты.

Но не всегда файл сертификата доступен вам. В таком случае сертификат можно взять напрямую из хранилища:

Помогла ли вам эта статья?

ДАНЕТ

Приложение

В своей работе я использовал следующие материалы:

Исходный код для статьи можно найти на GitHub.

Самозаверяющие сертификаты

Сертификат SSL, подписанный только владельцем веб-сайта, называется самозаверяющим сертификатом. Самозаверяющие сертификаты обычно используются на веб-сайтах, которые доступны только пользователям внутренней сети организации (LAN). Если веб-сайт, использующий самозаверяющий сертификат, находится вне вашей собственной сети, вы не сможете проверить, действительно ли сайт, выпустивший сертификат, представляет указанную в нем организацию. При работе с таким сайтом вы подвергаете риску вашу информацию, поскольку за ним могут стоять злоумышленники.

Про сертификаты:  Как создать SSL сертификат самостоятельно? | IT блоги - Windows, *nix, vmWare, Hyper-V, NetApp, SEO, HTML, видеонаблюдение

Создание самозаверяющегося сертификата в iis

В Manager IIS выполните следующие шаги, чтобы создать самозаверяющийся сертификат:

Последний шаг – связать самозаверяющийся сертификат с SSL-портом 443. Инструкции см. в разделе Привязка сертификата к веб-сайту.

Сертификаты домена

Если сервер находится за файрволом и использование подписанного CA сертификата невозможно, воспользуйтесь сертификатом домена. Доменный сертификат – это внутренний сертификат, подписанный CA вашей организации. Использование сертификатов домена помогает снизить стоимость выпуска сертификатов и облегчает их развертывание, поскольку сертификаты быстро генерируются в вашей организации для доверительного внутреннего пользования.

Пользователи, находящиеся в вашем домене, не увидят предупреждений или неожиданного поведения веб-браузера, обычно связанных с использованием самозаверенных сертификатов, поскольку веб-сайт был проверен сертификатом домена. Однако сертификаты домена не проверяются внешней CA, это означает, что пользователи, заходящие на сайт извне домена, не смогут проверить подлинность вашего сертификата.

Создание доменного сертификата в iis

В Manager IIS выполните следующие шаги, чтобы создать сертификат домена:

Последний шаг – связать сертификат домена с SSL-портом 443. Инструкции см. в разделе Привязка сертификата к веб-сайту.

Сертификаты, подписанные центром сертификации (ca)

Сертификаты, подписанные центром сертификации (CA), следует использовать для производственных систем, особенно если к развертыванию ArcGIS Server предполагается доступ пользователей извне вашей организации. Например, если сервер не защищен файрволом и доступен через Интернет, использование сертификата, подписанного центром сертификации (CA) гарантирует пользователям вне организации, что идентичность веб-сайта подтверждена.

Помимо подписи владельца сайта сертификат SSL может иметь подпись независимого сертифицирующего органа (CA). Центром сертификации (CA) обычно является пользующаяся доверием сторонняя организация, которая может подтвердить подлинность веб-сайта. Если веб-сайт является заслуживающим доверия, центр сертификации добавляет собственную цифровую подпись в самозаверяющий сертификат SSL сайта. Это говорит веб-клиентам, что идентичность веб-сайта проверена.

При использовании сертификата SSL, выданного известным центром защищенное соединение между сервером и веб-клиентом возникает автоматически, и никаких специальных действий пользователю предпринимать не надо. Поскольку веб-сайт проверен CA, вы не увидите предупреждений или неожиданного поведения веб-браузера.

Создание доменного сертификата в iis

В Manager IIS выполните следующие шаги, чтобы создать сертификат домена:

Последний шаг – связать сертификат домена с SSL-портом 443. Инструкции см. в разделе Привязка сертификата к веб-сайту.

Создание самозаверяющегося сертификата в iis

В Manager IIS выполните следующие шаги, чтобы создать самозаверяющийся сертификат:

Последний шаг – связать самозаверяющийся сертификат с SSL-портом 443. Инструкции см. в разделе Привязка сертификата к веб-сайту.

Создание сертификата ssl

Для создания SSL-соединения между Web Adaptor и сервером, веб-серверу требуется сертификат SSL. Сертификат SSL – это цифровой файл, содержащий информацию об удостоверении веб-сервера. Он также содержит метод шифрования, который используется при создании защищенного канала между веб-сервером и ArcGIS Server.

Сертификаты, подписанные центром сертификации (ca)

Сертификаты, подписанные центром сертификации (CA), следует использовать для производственных систем, особенно если к развертыванию ArcGIS Server предполагается доступ пользователей извне вашей организации. Например, если сервер не защищен файрволом и доступен через Интернет, использование сертификата, подписанного центром сертификации (CA) гарантирует пользователям вне организации, что идентичность веб-сайта подтверждена.

Помимо подписи владельца сайта сертификат SSL может иметь подпись независимого сертифицирующего органа (CA). Центром сертификации (CA) обычно является пользующаяся доверием сторонняя организация, которая может подтвердить подлинность веб-сайта. Если веб-сайт является заслуживающим доверия, центр сертификации добавляет собственную цифровую подпись в самозаверяющий сертификат SSL сайта. Это говорит веб-клиентам, что идентичность веб-сайта проверена.

При использовании сертификата SSL, выданного известным центром защищенное соединение между сервером и веб-клиентом возникает автоматически, и никаких специальных действий пользователю предпринимать не надо. Поскольку веб-сайт проверен CA, вы не увидите предупреждений или неожиданного поведения веб-браузера.

Сертификаты домена

Если сервер находится за файрволом и использование подписанного CA сертификата невозможно, воспользуйтесь сертификатом домена. Доменный сертификат – это внутренний сертификат, подписанный CA вашей организации. Использование сертификатов домена помогает снизить стоимость выпуска сертификатов и облегчает их развертывание, поскольку сертификаты быстро генерируются в вашей организации для доверительного внутреннего пользования.

Пользователи, находящиеся в вашем домене, не увидят предупреждений или неожиданного поведения веб-браузера, обычно связанных с использованием самозаверенных сертификатов, поскольку веб-сайт был проверен сертификатом домена. Однако сертификаты домена не проверяются внешней CA, это означает, что пользователи, заходящие на сайт извне домена, не смогут проверить подлинность вашего сертификата. Внешние пользователи увидят в веб-браузере сообщения об отсутствии доверия к сайту, пользователь может считать, что зашел на вредоносный сайт и уйти с него.

Создание доменного сертификата в iis

В Manager IIS выполните следующие шаги, чтобы создать сертификат домена:

Последний шаг – связать сертификат домена с SSL-портом 443. Инструкции см. в разделе Привязка сертификата к веб-сайту.

Самозаверяющие сертификаты

Сертификат SSL, подписанный только владельцем веб-сайта, называется самозаверяющим сертификатом. Самозаверяющие сертификаты обычно используются на веб-сайтах, которые доступны только пользователям внутренней сети организации (LAN). Если веб-сайт, использующий самозаверяющий сертификат, находится вне вашей собственной сети, вы не сможете проверить, действительно ли сайт, выпустивший сертификат, представляет указанную в нем организацию. При работе с таким сайтом вы подвергаете риску вашу информацию, поскольку за ним могут стоять злоумышленники.

Создание самозаверяющегося сертификата в iis

В Manager IIS выполните следующие шаги, чтобы создать самозаверяющийся сертификат:

Последний шаг – связать самозаверяющийся сертификат с SSL-портом 443. Инструкции см. в разделе Привязка сертификата к веб-сайту.

Способ 1: установка правильного времени

Наиболее часто рассматриваемая проблема возникает из-за некорректно установленных времени и даты. Дело в том, что корневые сертификаты безопасности имеют определённый срок действия, и всякие несоответствия между прописанными внутри файла данными и текущими в системе могут приводить к подобному сбою.

  1. Наведите курсор на индикатор времени, который обычно находится в правом части панели задач, нажмите правую кнопку мыши и выберите пункт «Настройка даты и времени».
  2. Открыть настройки времени для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  3. Первым делом нужно активировать переключатель «Установить время автоматически» – после этого ОС при подключении к интернету самостоятельно подгрузит правильные значения.
  4. Автоматическая установка времени для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  5. Если же подключение к сети на целевом компьютере не предполагается, воспользуйтесь кнопкой «Изменить» под строкой «Установка даты и времени вручную».

    Начать ручную установку времени для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

    Здесь самостоятельно задайте корректные значения.

  6. Выполнить ручную установку времени для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  7. Если же показания сбиваются после каждой перезагрузки или выключения ПК/ноутбука, это зачастую говорит о севшей резервной батареи BIOS и, следовательно, её необходимо заменить. Для начала сходите в любой магазин электроники или хозтоваров и приобретите элемент CR2032. Дальнейшие действия включают в себя частичную разборку устройства – если вы сомневаетесь в своих силах, к вашим услугам инструкция от нашего автора, применимая как для настольных ПК, так и для ноутбуков.

    Подробнее: Как поменять батарейку BIOS

Способ 2: обновление корневых сертификатов

Иногда причина проблемы кроется в повреждении или устаревании файлов корневых сертификатов. Устранить этот сбой можно инсталляцией соответствующих апдейтов.

Способ 3: устранение вирусной угрозы

Известны случаи, когда проблемы с доверием сертификатов возникают вследствие активной деятельности зловредного ПО – например, вирус заразил или подменил имеющиеся. Если наблюдаются дополнительные симптомы в виде необычного поведения операционной системы или программ, вы точно столкнулись с атакой зловредов. Воспользуйтесь инструкцией далее для устранения этой проблемы.

Подробнее: Борьба с компьютерными вирусами

Способ 4: установка сертификатов geotrust

Последний метод, достаточно эффективный, но потенциально опасный, заключается в самостоятельном добавлении пользователем новых сертификатов, полученных напрямую с ресурсов поставщика. Далее мы опишем необходимые для этого шаги.

Обратите внимание! Выполнение следующих действий может нарушить безопасность вашего компьютера, поэтому вы делаете это на свой страх и риск!

Ресурс компании GeoTrust

  1. Посетите ресурс компании GeoTrust Primary Certification Authority по представленной выше ссылке.
  2. Вверху таблицы должен быть блок с именем «GeoTrust Primary Certification Authority», взгляните на него – внизу должна быть ссылка, озаглавленная как «Root Download Link», кликните по ней ПКМ и выберите «Сохранить как…». Должен загрузиться документ в формате PEM.
  3. Загрузка файла сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  4. После получения нужных файлов откройте окно «Выполнить» сочетанием клавиш Win R, введите в нём запрос certmgr.msc и нажмите «ОК».
  5. Открыть менеджер сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  6. После открытия требуемой оснастки найдите в меню слева пункт «Доверенные корневые центры», щёлкните по нему ПКМ и последовательно выберите опции «Все задачи»«Импорт».
  7. Начать импорт сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  8. В первом окне «Мастер импорта сертификатов» нажмите «Далее».
  9. Продолжить импорт сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  10. Здесь кликните «Обзор».

    Приступить к выбору файла сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

    С помощью диалогового окна «Проводника» выберите скачанное на шаге 2. Если система его не распознаёт, в меню «Тип» укажите «Все файлы».

    Сохранить корневой сертификат для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

    Нажмите «Далее».

  11. Закончить выбор файла сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  12. Здесь убедитесь, что активна опция «Поместить все сертификаты в выбранное хранилище», а в качестве такового указаны «Доверенные корневые центры сертификации». Убедившись, что всё введено правильно, кликните по кнопке продолжения.
  13. Добавить установку сертификатов для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  14. Система сообщит, что импорт завершён, и предложит закрыть «Мастер…». Сделайте это и перезагрузите компьютер.
  15. Закончить установку корневого сертификата для устранения ошибки «Сертификат безопасности сайта не является действительным» в браузере

  16. После загрузки ОС проверьте наличие ошибки. Если она не пропала, повторите действия из инструкции, но на шаге 4 выберите «Сторонние корневые центры сертификации».

Данный метод помогает устранить проблему только для распространённых сайтов и сервисов, тогда как с малоизвестными действия могут оказаться неэффективными.

Заключение

Вот и подошла к концу наша статья. Она получилась довольно длинной. Я задумывал её как единое место, в котором я мог был в будущем освежить свои знания о сертификатах и их использовании, если что-то забудется. Надеюсь, и вам она окажется полезной.

Оцените статью
Мой сертификат
Добавить комментарий