Большинство администраторов Windows, знакомых с PKI, знают о том. MakeCert.exe
, который позволяет создавать самоподписанные сертификаты. Этот инструмент входит в состав Microsoft .NET Framework SDK и Microsoft Windows SDK. Создать самоподписанный сертификат можно с помощью встроенной команды PowerShell New-SelfSignedCertificate
без использования дополнительных инструментов.
New-SelfSignedCertificate: Создание самоподписного сертификата с помощью PowerShell
Чтобы создать самоподписанный сертификат с помощью PowerShell, вы можете использовать встроенную функцию New-SelfSignedCertificate команда, которая является частью PowerShell PKI (Инфраструктура открытых ключей):
Чтобы перечислить все доступные команды в модуле PKI, выполните команду:
Get-Command -Module PKI
Рекомендуется использовать самоподписанные сертификаты для задач тестирования/разработки или для обеспечения сертификатами внутренних служб интрасети (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess и т. д.), если вы не можете развернуть инфраструктуру PKI/CA или приобрести доверенный сертификат у внешнего поставщика.
Чтобы создать сертификат, необходимо указать значения параметров -DnsName (имя сервера, имя может быть произвольным и даже отличаться от текущего имени хоста) и -CertStoreLocation (локальное хранилище сертификатов, в которое будет помещен сгенерированный сертификат).
Чтобы создать новый SSL-сертификат (с типом SSLServerAuthentication по умолчанию) для DNS-имени test.contoso.com (используйте FQDN-имя) и поместить его в личные сертификаты на компьютере, выполните следующую команду:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\My
Команда вернет Thumbprint, Subject и EnhancedKeyUsageList нового сертификата. По умолчанию такой сертификат может использоваться для аутентификации клиента (1.3.6.1.5.5.7.3.2) или аутентификации сервера (1.3.6.1.5.5.7.3.1).
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
Если вы указали нестандартный криптографический провайдер (CSP) (например, с помощью параметра -KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider"
параметры), убедитесь, что он установлен на вашем компьютере (по умолчанию используется Microsoft Enhanced Cryptographic Provider). В противном случае появится ошибка:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).
По умолчанию самоподписанный сертификат создается со следующими параметрами:
- Криптографический алгоритм: RSA;
- Длина ключа: 2048 бит;
- Допустимое использование ключа: Аутентификация клиента и Аутентификация сервера;
- Сертификат может быть использован для: Цифровая подпись, Шифрование ключей;
- Срок действия сертификата: 1 год;
- Криптопровайдер: Microsoft Software Key Storage Provider.
Эта команда создает новый сертификат и импортирует его в личное хранилище сертификатов компьютера. Откройте программу certlm.msc оснастку MMC и убедитесь, что новый сертификат появился в окне Личный раздел хранилища сертификатов компьютера.
С помощью команды Get-ChildItem можно отобразить все параметры созданного сертификата по его отпечатку пальца:
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *
PSPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My\2175A76B10F843676951965F52A718F635FFA043 PSParentPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My PSChildName : 2175A76B10F843676951965F52A718F635FFA043 PSDrive : Cert PSProvider : Microsoft.PowerShell.Security\Certificate PSIsContainer : False EnhancedKeyUsageList : {Client Authentication (1.3.6.1.5.5.7.3.2), Server Authentication (1.3.6.1.5.5.7.3.1)} DnsNameList : {test.contoso.com} SendAsTrustedIssuer : False EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty PolicyId : Archived : False Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid} FriendlyName : IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName NotAfter : 12/4/2023 5:35:15 PM NotBefore : 12/4/2022 5:15:15 PM HasPrivateKey : True PrivateKey : PublicKey : System.Security.Cryptography.X509Certificates.PublicKey RawData : {48, 130, 3, 45...} SerialNumber : 6797F5E3F870478D4D3798BEB291DBF3 SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName SignatureAlgorithm : System.Security.Cryptography.Oid Thumbprint : 2175A76B10F843676951965F52A718F635FFA043 Version : 3 Handle : 2834444631568 Issuer : CN=test.contoso.com Subject : CN=test.contoso.com
$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $3years -CertStoreLocation cert:\LocalMachine\My
Можно создать цепочку сертификатов. Сначала создается корневой сертификат (CA). Затем на его основе генерируется сертификат SSL-сервера:
$rootCert = New-SelfSignedCertificate -Subject 'CN=TestRootCA,O=TestRootCA,OU=TestRootCA' -KeyExportPolicy Exportable -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -Provider 'Microsoft Enhanced RSA and AES Cryptographic Provider'
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature
Чтобы изменить длину ключа сертификата и алгоритм шифрования, необходимо воспользоваться функцией -KeyAlgorithm
, -KeyLength
, и -HashAlgorithm
опции. Например:
New-SelfSignedCertificate -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm "SHA256" …
[Криптопровайдер платформы Microsoft позволяет использовать чип Trusted Platform Module устройства (TPM 2.0) для защиты ключа.
New-SelfSignedCertificate -Type Custom -Provider "Microsoft Platform Crypto Provider" ...
Для защиты документов и электронной почты можно сгенерировать сертификат шифрования документов. Для этого используйте DocumentEncryptionCert
тип при создании сертификата:
$Params = @{
"DnsName" = "myhostname"
"CertStoreLocation" = "Cert:\\CurrentUser\\My"
"KeyUsage" = "KeyEncipherment","DataEncipherment","KeyAgreement"
"Type" = "DocumentEncryptionCert"
}
$doccert=New-SelfSignedCertificate @Params
Проверьте значение EnhancedKeyUsageList сертификата:
$doccert|select EnhancedKeyUsageList
{Document Encryption (1.3.6.1.4.1.311.80.1)}
Создание сертификата с альтернативным именем субъекта (SAN) с помощью PowerShell
Команда New-SelfSignedCertificate позволяет создать сертификат с несколькими различными Альтернативные имена субъектов (САНs).
Makecert.exe
инструмент, в отличие от команды New-SelfSignedCertificate, не может создавать сертификаты SAN и Wildcard.[/alert]Если вы хотите создать сертификат с несколькими именами, первое имя параметра DnsName будет использоваться в качестве CN (Common Name) сертификата. Например, создадим самоподписанный сертификат SAN со следующими именами:
- Имя субъекта (CN):
adfs1.contoso.com
- Альтернативное имя субъекта (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:\LocalMachine\My
Кроме того, вы можете сгенерировать подстановочный знак сертификат для всего пространства доменных имен, указав *.contoso.com в качестве имени сервера.
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname *.contoso.com
Вы можете сгенерировать самоподписанный сертификат не только для имени хоста DNS, но и для IP-адреса. Для этого необходимо использовать -TextExtension
вместо параметра -DnsName. Например:
New-SelfSignedCertificate -TextExtension @("2.5.29.17={text}IPAddress=10.1.2.3&DNS=TESTServer1&DNS=TESTServer1.local")
Как видите, поле Subject Alternative Name теперь содержит IP-адрес хоста и его DNS-имена.
Как экспортировать самоподписанный сертификат в Windows?
Чтобы экспортировать сгенерированный сертификат с закрытым ключом в защищенный паролем PFX-файл, необходимо указать его Thumbprint. Его можно скопировать из результатов команды New-SelfSignedCertificate. Также необходимо указать пароль безопасности сертификата и преобразовать его в формат SecureString:
$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force –AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPassword
Вы можете экспортировать открытый ключ сертификата следующим образом (закрытый ключ не включается в экспорт):
Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cer
Убедитесь, что файл сертификата *.CER (PFX) появился в указанном каталоге. Если щелкнуть его правой кнопкой мыши и выбрать опцию «Установить сертификат«, вы можете воспользоваться пунктом меню Мастер импорта сертификатов чтобы добавить сертификат в список доверенных корневых сертификатов на вашем компьютере.
Выберите местоположение хранилища сертификатов -> Локальная машина, Поместите все сертификаты в следующее хранилище -> Доверенные корневые центры сертификации.
[alert]Вы можете создать сертификат и сразу же импортировать его в хранилище доверенных корневых сертификатов компьютера с помощью команд:
$SelfSignCert=New-SelfSignedCertificate …..
$certFile = Export-Certificate -Cert $SelfSignCert -FilePath C:\ps\export-certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
Вы можете развернуть этот открытый ключ или сам файл сертификата на всех пользовательских компьютерах и серверах в домене Active Directory с помощью GPO (How to deploy certificates to users with GPO?).
Генерация самоподписного сертификата для подписи кода в Windows
В PowerShell 3.0 команда New-SelfSifgnedCertificate генерирует только SSL-сертификаты, которые нельзя использовать для подписи кода драйвера, приложения или сценария (в отличие от сертификатов, генерируемых утилитой MakeCert).
Команду New-SelfSifgnedCertificate можно использовать для выпуска Подписание кода сертификаты в PowerShell версии 5.0 и новее.
Чтобы создать самоподписанный сертификат для подписи кода приложения, выполните команду:
$cert = New-SelfSignedCertificate -Subject "My Code Signing Certificate” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My
Теперь вы можете подписать файл сценария PowerShell с помощью самоподписанного сертификата:
Set-AuthenticodeSignature -FilePath C:\PS\my_posh_script.ps1 -Certificate $cert
Если вы получаете сообщение UnknownError предупреждение при выполнении команды, означающее, что сертификат не является доверенным, поскольку находится в личном хранилище сертификатов пользователя.
Вам нужно переместить его в хранилище доверенных корневых сертификатов (не забывайте периодически проверять хранилище корневых сертификатов Windows на наличие недоверенных и подозрительных сертификатов и обновлять списки доверенных корневых сертификатов).
Move-Item -Path $cert.PSPath -Destination "Cert:\CurrentUser\Root"
Теперь вы можете использовать этот самоподписанный сертификат для подписи своих сценариев PowerShell, драйверов или приложений.
Создание самоподписного SSL-сертификата SHA-256 в IIS на Windows Server
Обратите внимание, что при создании самоподписного сертификата для IIS через консоль Internet Information Manager (используя Создать самоподписанный сертификат пункт меню действия), создается SSL-сертификат с использованием алгоритма шифрования SHA-1. Такие сертификаты считаются недоверенными во многих браузерах и не могут использоваться для создания безопасного соединения (или вы можете увидеть другие предупреждения и ошибки SSL). Команда New-SelfSignedCertificate позволяет создать более популярный тип сертификата с использованием алгоритма шифрования SHA-256.
Вы можете привязать самоподписанный сертификат SHA-256, созданный с помощью PowerShell, к сайту IIS на Windows Server. Если вы создадите SSL-сертификат с помощью PowerShell и поместите его в хранилище сертификатов компьютера, он будет автоматически доступен для сайтов IIS.
Откройте консоль IIS Manager (inetmgr.exe
), выберите свой сайт, а затем выберите сертификат, созданный в разделе Привязка сайта опции. Сохраните изменения.
Вы также можете привязать сертификат SSL по его отпечатку к сайту IIS:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https