Большинству администраторов Windows, знакомых с темой PKI, известна утилита MakeCert.exe, с помощью которой можно создать самоподписанный сертификат. Эта утилита включена в состав Microsoft .NET Framework SDK и Microsoft Windows SDK. В Windows 8 и Windows Server 2012 появилась встроенная возможность создания самоподписанного сертификата средствами PowerShell 3.0 и выше без использования специальных утилит.

Использование командлета New-SelfSignedCertificate для создания сертфикатов

Для создания самоподписанного сертификата в PowerShell предлагается использовать командлет New-SelfSignedCertificate, входящий в состав модуля PoSh с именем PKI (Public Key Infrastructure).

Чтобы вывести список всех доступных командлетов в модуле PKI, выполните команду:

Get-Command -Module PKI

Самоподписанные сертификаты рекомендуется использовать в тестовых целях или для обеспечения сертификатами внутренних интранет служб (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess и т.п.), в тех случая когда по какой-то причине приобретение сертификата у внешнего провайдера или разворачивание инфраструктуры PKI/CA невозможны.

Для создания сертификата нужно указать значения DnsName (DNS имя сервера, имя может быть произвольным и отличаться от имени localhost) и CertStoreLocation (раздел локального хранилища сертификатов, в который будет помещен сгенерированный сертификат). Командлет можно использовать для создания самоподписанного сертификата в Windows 10 (в нашем примере), Windows 8/8.1 и Windows Server 2016/2012/2012 R2.

Чтобы создать сертификат для DNS имени test.contoso.com и поместить его в список персональных сертификатов компьютера, выполним команду:

New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:LocalMachineMy

Directory: Microsoft.PowerShell.SecurityCertificate::LocalMachineMy
Thumbprint Subject
———- ——-
2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 CN=test.contoso.com

По-умолчанию генерируется самоподписанный сертификат со следующим настройками:

  • Криптографический алгоритм: RSA;
  • Размер ключа: 2048бит;
  • Допустимые вариантов использования ключа: Client Authentication и Server Authentication;
  • Сертификат может использоваться для: Digital Signature, Key Encipherment ;
  • Срок действия сертификата: 1год.

Данная команда создаст новый сертификат и импортирует его в персональное хранилище компьютера. Открыв оснастку certlm.msc, проверим, что в разделе Personal хранилища сертификатов компьютера появился новый сертификат.

$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $add3year -CertStoreLocation cert:LocalMachineMy

Чтобы экспортировать полученный сертификат c закрытым ключом в pfx файл, защищенный паролем, нам понадобится его отпечаток (Thumbprint), который нужно скопировать из результатов выполнения команды New-SelfSignedCertificate:

$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force –AsPlainText

Export-PfxCertificate -Cert cert:LocalMachineMy2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 -FilePath C: est.pfx -Password $CertPassword

Можно экспортировать открытый ключ сертификата:

Export-Certificate -Cert Cert:LocalMachineMy2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 -FilePath C: estcert.cer

Полученный открытый ключ или сам файл сертификата можно установить на веб-сервер или клиентах домена с помощью GPO (пример установки сертификата на ПК с помощью групповых политик).

Одной из полезных возможностей командлета New-SelfSignedCertificate является возможность создать сертификат с несколькими различными именами Subject Alternative Names (SAN).

К примеру, создадим сертификат, у которого указаны следующие имена:

  • Subject Name (CN): adfs1.contoso.com
  • Subject Alternative Name (DNS): web_gw.contoso.com
  • Subject Alternative Name (DNS): enterprise_reg.contoso.com

Команда создания сертификата будет такой:

New-SelfSignedCertificate -DnsName adfs1.contoso.com,web_gw.contoso.com,enterprise_reg.contoso.com -CertStoreLocation cert:LocalMachineMy

Также можно выписать сертификат для всего пространства имен в домене, для этого в качестве имени сервера указывается *.contoso.com.

New-SelfSignedCertificate -certstorelocation cert:localmachinemy -dnsname *.contoso.com

Создаем самоподписанный сертфикат типа Code Signing для подписывания кода

В PoweShell 3.0 командлет New-SelfSifgnedCertificate генерировал только SSL сертификаты, которые нельзя было использоваться для подписывания кода драйверов и приложений (в отличии сертификатов, генерируемых утилитой MakeCert).

В PowerShell 5 новая версия командлета New-SelfSifgnedCertificate теперь может использоваться для выпуска сертификатов типа Code Signing.

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

$cert = New-SelfSignedCertificate -Subject "Cert for Code Signing” -Type CodeSigningCert -CertStoreLocation cert:LocalMachineMy

Set-AuthenticodeSignature -FilePath C:PS est_script.ps1 -Certificate $cert

Если при выполнении команды появится предупреждение UnknownError, значит этот сертификат недоверенный, т.к. находится в персональном хранилище сертификатов пользователя.

Move-Item -Path $cert.PSPath -Destination "Cert:CurrentUserRoot"

После этого вы можете подписать свой PowerShell скрипт с помощью данного самоподписанного сертификата.

Для того чтобы сгенерировать самоподписанный сертификат потребуется установить на сервер пакет openssl (часто он установлен по умолчанию)

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

openssl req -new -x509 -days 365 -sha256 -newkey rsa:2048 -nodes -out example.pem -keyout example.key

После ее выполнения возникает ряд диалогов, в которых нужно указать данные организации и домен для которого выпускается сертификат

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:some state
Locality Name (eg, city) []:mycity
Organization Name (eg, company) [Internet Widgits Pty Ltd]:company
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:mail@example.com

Результатом будут создавшиеся файлы example.pem и example.key

Обычно этого достаточно и файлы уже можно использовать

Путь к ним теперь необходимо будет указывать при настройке различного ПО, использующего сертификаты: веб- (Apache, Nginx) и почтовых серверов (Postfix, Exim, Dovecot).

Генерация самоподписанного сертификата в несколько шагов

Далее описан тот же процесс, что и ранее, но не в одной команде, а по шагам.

openssl genrsa -des3 -out example.key 1024

Создаем запрос на сертификат на основе ключа

openssl req -new -key example.key -out cert.csr

Появится файл example.src

Парольная фраза при использовании приватного ключа

Каждый раз когда мы производим какие-либо операции с приватным ключом система запрашивает парольную фразу. Чтобы не вводить ее каждый раз производим следующие действия. Генерируем ключ .nopass и заменяем использовавшийся ранее ключ.

openssl rsa -in example.key -out example.key.nopass

После этого парольная фраза уже не понадобится

Генерируем сертификат

openssl x509 -req -days 365 -in example.csr -signkey example.key -out example.crt

Читайте также про то, как установить SSL сертификат на Apache и на Nginx

SSL-сертификаты — самый распространенный тип сертификатов в Интернете. Чаще всего их устанавливают на сайтах, которые собирают персональные данные пользователей (email, пароли, данные банковских карт и др.). Чтобы эти данные не перехватили, соединение защищается специальным протоколом HTTPS, шифрующим всю информацию, которой обмениваются посетитель и сайт. Для работы этого протокола как раз и нужны SSL-сертификаты, приставка SSL (Secure Socket Layer) в названии которых — это технология, обеспечивающая шифрование соединения между веб-сервером (сайтом) и браузером.

Когда сайт работает по защищенному протоколу HTTPS браузер сообщает об этом пользователю в адресной строке. Например, в браузере Google Chrome отображается замок зеленого цвета и надпись Secure (безопасный):

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

В сертификате хранится следующая информация:

  • полное (уникальное) имя владельца сертификата;
  • открытый ключ владельца сертификата;
  • дата окончания сертификата;
  • полное (уникальное) название центра сертификации;
  • цифровая подпись центра сертификации.

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

Сами же SSL-сертификаты делятся на несколько типов. В самых простых проверяется только домен, в самых дорогих — производится целый ряд проверок, а название организации отображается в адресной строке рядом с доменом.

Доверенные и недоверенные сертификаты

Выпуском SSL-сертификатов занимаются центры сертификации или, как их еще называют, удостоверяющие центы (Certification Authority, CA). Как правило, это авторитетные IT-организации, пользующиеся известным открытым криптографическим ключом:

  • Sectigo/Comodo;
  • GeoTrust;
  • RapidSSL;
  • Thawte и другие.

Сертификаты этих организаций называют доверенными. К недоверенным же сертификатам относятся:

  • самоподписанные сертификаты, которые владельцы сайтов выдают и подписывают сами себе;
  • сертификаты, подписанные недоверенными центрами;
  • цифровые подписи, выданные центрами, утратившими доверие.

Почему не стоит пользоваться самоподписанными сертификатами?

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

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

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

В итоге у самоподписанного сертификата можно разглядеть только одно достоинство — бесплатность. Но и этому найдется альтернатива в виде SSL-сертификатов проверенных центров сертификации, которые тоже выпускаются бесплатно. Например, сертификаты Let’s Encrypt. Однако не стоит забывать и про недостатки Let’s Encrypt:

  • Ограниченный срок действия
    Бесплатные сертификаты Let’s Encrypt рассчитаны на 90 дней. Для автоматического перевыпуска необходимо настроить планировщик, который будет запускать скрипт перевыпуска или принимать настройки центра сертификации, которые смогут вносить изменения в конфигурацию ваших серверов.
  • Отсутствие технической поддержки
    Вам остается самостоятельно изучать документацию по Let’s Encrypt на английском языке на официальном сайте или искать ее на других специализированных площадках.
  • Нет расширенных проверок
    При выпуске сертификата проверяется только домен, проверка организации не производится.
  • Проблемы с поддержкой в браузерах
    При использовании сертификатов Let’s Encrypt некоторые браузеры выводят сообщения о том, что они не доверяют этому сертификату (при использовании устаревших браузеров и операционных систем или по другой причине).

Поэтому рекомендуем вам обратить внимание на платные сертификаты проверенных брендов. Например, облачные провайдеры VPS/VDS или IaaS часто предлагают приобрести надежные SSL-сертификаты вместе с услугой хостинга, причем стоимость такого сертификата будет намного ниже, чем при его приобретении непосредственно у центров сертификации.