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