Windows 10, веб-сервер IIS: настройка протокола HTTPS для сайта, часть 2

Oct 24, 2022 19:40

Начало:
0. HTTPS: что это за протокол, знакомство
1. Криптография: простейшие термины этой науки
2. Система шифрования с открытым ключом
3. Зачем нужны центры сертификации при асимметричном шифровании
4. Зачем нужны самозаверенные сертификаты открытого ключа
5. Windows 10: хранилища сертификатов и инструменты для работы с ними
6. Windows 10, веб-сервер IIS: настройка протокола HTTPS для сайта, часть 1
7. Windows 10, PowerShell: файл сертификата открытого ключа (X.509) изнутри

В одном из предыдущих постов я описал, как настроил работу с локальным сайтом через протокол HTTPS, создав из диспетчера веб-сервера IIS самозаверенный сертификат открытого ключа и установив его на локальный веб-сервер. (Я работаю в операционной системе «Windows 10».) Однако, мой браузер «Microsoft Edge» (на движке «Chromium») не признал работу через протокол HTTPS с использованием этого самозаверенного сертификата безопасной, так как самозаверенный сертификат был выдан на имя моего компьютера «IlyaComp», которое не совпадает с названием домена локального сайта «localhost». В результате браузер при каждой попытке зайти на локальный сайт постоянно выдает грозное предупреждение о том, что соединение с данным сайтом по данному протоколу является небезопасным (хотя пройти на сайт можно, если проигнорировать это предупреждение).

В этом посте я опишу, как решить эту проблему.

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

Поскольку диспетчер веб-сервера IIS не дает доступа к нужным свойствам создаваемого самозаверенного сертификата, то, очевидно, следует воспользоваться каким-нибудь другим способом создания сертификата с нужными свойствами. Одним из альтернативных способов является использование командлета New-SelfSignedCertificate из программы-оболочки «PowerShell» (я использую версию 7 этой программы).

Так как мы собираемся поместить самозаверенный сертификат в хранилище сертификатов компьютера, то для выполнения этой операции потребуются права администратора компьютера, то есть программу-оболочку «PowerShell» следует запускать от имени пользователя, имеющего права администратора операционной системы.

Создадим самозаверенный сертификат:

(админ) PS C:\> New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "Cert:\LocalMachine\My"

PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My

Thumbprint Subject EnhancedKeyUsageList
---------- ------- --------------------
5BBDFEFF483344198DB7A223270624A6FD582E04 CN=localhost {Проверка подлинности клиента, Проверка подлинности сер…

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

PS C:\> cd Cert:\LocalMachine\My
PS Cert:\LocalMachine\My> $c = Get-Item 5BBDFEFF483344198DB7A223270624A6FD582E04
PS Cert:\LocalMachine\My> $c | Format-List DnsNameList, FriendlyName, Issuer, Subject

DnsNameList : {localhost}
FriendlyName :
Issuer : CN=localhost
Subject : CN=localhost

Использованные в коде выше команды были подробно рассмотрены в предыдущем посте.

Как видно из значений свойств полученного самозаверенного сертификата, приведенных выше, мы даже не берем на себя труд определить «Понятное имя» (FriendlyName) сертификата, которое требовал диспетчер веб-сервера IIS при создании самозаверенного сертификата через него. (Хотя командлет New-SelfSignedCertificate позволяет это сделать.) «Понятное имя» нужно только для отображения сертификата в разных интерфейсах (окнах, списках), но оно не влияет на работу сертификата.

Важно то, что теперь свойства Issuer, Subject и DnsNameList содержат нужное нам название домена «localhost» вместо названия компьютера «IlyaComp», которое вставлял диспетчер веб-сервера IIS при создании самозаверенного сертификата через него.

Тестируем самозаверенный сертификат, полученный с помощью «PowerShell»

Создаем в диспетчере веб-сервера IIS привязку сайта с типом протокола HTTPS и портом 443 (по умолчанию). Как это сделать, было показано в одном из предыдущих постов. В окне настройки свойств привязки сайта кроме протокола и порта следует из выпадающего списка «SSL-сертификат» выбрать только что созданный с помощью «PowerShell» самозаверенный сертификат. После сохранения привязки сайта этот сертификат появится и в списке диспетчера служб IIS «Сертификаты сервера» веб-сервера (то есть самому этот сертификат туда добавлять, как мы это делали в случае создания самозаверенного сертификата из диспетчера служб IIS, не нужно).

При заходе на сайт в браузере по URL-адресу https://localhost/ опять получаем предупреждение, но теперь уже другое:



Раньше было «NET::ERR_CERT_COMMON_NAME_INVALID», а теперь: «NET::ERR_CERT_AUTHORITY_INVALID». Нажав на кнопку «Advanced», получим расширенное сообщение:

This server couldn't prove that it's localhost; its security certificate is not trusted by your computer's operating system. This may be caused by a misconfiguration or an attacker intercepting your connection.

Еще можно просмотреть содержимое нашего сертификата из вышеупомянутого списка «Сертификаты сервера» в диспетчере служб IIS. Там сказано, что следует сделать для того, чтобы избавиться от этого предупреждения:



Итак, там сказано: «Нет доверия к этому корневому сертификату центра сертификации. Чтобы включить доверие, установите этот сертификат в хранилище доверенных корневых сертификатов центров сертификации».

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

Копируем созданный ранее сертификат в подхранилище «Доверенные корневые центры сертификации»

Запускаем сохраненную консоль «certlm.msc» (я запускаю ее из командной строки программы-оболочки «PowerShell» с помощью команды «certlm»). Для работы с этой сохраненной консолью понадобится поднять права текущего пользователя до прав администратора операционной системы (после запуска «certlm.msc» из-под обычного пользователя операционная система «Windows 10» сама задаст вопрос: «Разрешить этому приложению вносить изменения на вашем устройстве?» Положительный ответ на этот вопрос и будет подъемом прав до администраторских, если у текущего пользователя на это есть разрешение в рамках операционной системы.).

Сначала следует скопировать в буфер обмена самозаверенный сертификат, ранее помещенный в подхранилище Cert:\LocalMachine\My (по-русски подхранилище «My» называется «Личное»):



После этого следует вставить скопированное из буфера обмена в целевое подхранилище сертификатов «Доверенные корневые центры сертификации»:



В результате этих манипуляций наш самозаверенный сертификат должен быть виден как в подхранилище «Личное», так и в подхранилище «Доверенные корневые центры сертификации».

Заключение

Ничего дополнительно делать не нужно (привязка сайта в диспетчере служб IIS с этим самозаверенным сертификатом была сделана ранее, см. выше в этом посте; там ничего ни добавлять, ни обновлять не требуется). Можно уже в браузере перейти по URL-адресу https://localhost/ и браузер покажет домашнюю страницу локального сайта (если она существует) без предупреждений по поводу небезопасности самозаверенного сертификата, установленного на веб-сервере IIS. Теперь браузер считает этот сертификат успешно обеспечивающим безопасность:



При этом у меня остался настроенным и доступ к локальному сайту по протоколу HTTP, то есть в браузере можно ввести URL-адрес http://localhost/ и перейти на свой локальный сайт. Мой браузер «Microsoft Edge» (на движке «Chromium») явно не выдает для протокола HTTP никаких предупреждений. Однако, иконка в адресной строке браузера (слева от URL-адреса) сменилась с замочка (для HTTPS) на кружок с латинской буквой «i» (щелкнув мышью по этой иконке, можно просмотреть информацию о соединении, и вот там уже есть предупреждение о том, что данное соединение небезопасно):



В URL-адресе можно явно вводить номер порта. Но, так как у меня порты для протоколов HTTPS и HTTP настроены по умолчанию (443 и 80 соответственно), то явный ввод номера порта не требуется (для случаев по умолчанию браузер сам подставит нужные номера портов).

Источники:

1. https://stackoverflow.com/questions/8169999/how-can-i-create-a-self-signed-cert-for%20-localhost

2. https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/working-with-certificates

3. https://learn.microsoft.com/en-us/powershell/module/pki/new-selfsignedcertificate

Инструмент, Образование, Сайтостроение, Программирование

Previous post Next post
Up