Поиск по сайту:

Как создать самозаверяющий сертификат с помощью PowerShell


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

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

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

Чтобы создать самоподписанный сертификат с помощью PowerShell, вы можете использовать командлет New-SelfSignedCertificate. Этот командлет включен в модуль PKI.

Существует множество вариантов создания сертификатов. Распространенными типами самозаверяющих сертификатов являются SSLServerAuthentication (по умолчанию для командлета) и CodeSigning. Кроме того, вы можете создать DocumentEncryptionCert, который очень полезен для шифрования файлов, и, наконец, сертификат Custom, который позволяет указать множество пользовательских параметров.

Давайте продолжим и создадим обычный сертификат SSLServerAuthentication. Это тот, который обычно используется для защиты веб-сайтов с шифрованием SSL. Вы можете увидеть пример этого ниже. В этом примере сертификат хранится в Cert:LocalMachineMy Certificate Store.

$Params = @{
    "DnsName"           = @("mywebsite.com","www.mywebsite.com")
    "CertStoreLocation" = "Cert:LocalMachineMy"
    "NotAfter"          = (Get-Date).AddMonths(6)
    "KeyAlgorithm"      = "RSA"
  "KeyLength"         = "2048"
}

PS C:> New-SelfSignedCertificate @Params

PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineMy

Thumbprint                                Subject              EnhancedKeyUsageList
----------                                -------              --------------------
4EFF6B1A0F61B4BG692C77F09889BD151EE8BB58  CN=mywebsite.com     {Client Authentication, Server Authentication}

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

*Обратите внимание, что если вы попытаетесь запустить это не как администратор, вы получите сообщение об ошибке, подобное приведенному ниже:

New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Отказано в доступе. 0x80090010 (-2146893808 NTE_PERM)

Как видно из Отказано в доступе, у вас еще нет разрешения на его запуск.*

Поиск информации о нашем сертификате

Давайте удостоверимся, что сертификат был создан так, как мы ожидали. Чтобы найти информацию о конкретном сертификате с помощью PowerShell, вы можете использовать командлет Get-ChildItem точно так же, как вы можете перечислить файлы в каталоге.

PS C:> Get-ChildItem -Path "Cert:LocalMachineMy" | Where-Object Thumbprint -EQ 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58 | Select-Object *

PSPath                   : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
                           58
PSParentPath             : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy
PSChildName              : 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
PSDrive                  : Cert
PSProvider               : Microsoft.PowerShell.SecurityCertificate
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              : {mywebsite.com, www.mywebsite.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             :
HasPrivateKey            : True
PrivateKey               : System.Security.Cryptography.RSACng
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 6/22/2020 11:50:15 AM
NotBefore                : 12/22/2019 10:40:20 AM
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {48, 130, 3, 55...}
SerialNumber             : 608C4D5E6B8D41B44ADDC6BD725FE264
SignatureAlgorithm       : System.Security.Cryptography.Oid
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
Thumbprint               : 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
Version                  : 3
Handle                   : 2628421609632
Issuer                   : CN=mywebsite.com
Subject                  : CN=mywebsite.com

Здесь много полезной информации, но вы можете заметить, что в DnsNameList теперь отображаются оба сайта. Кроме того, дата NotAfter правильно заполнена и составляет 6 месяцев с даты создания.

Сертификат подписи кода

Если вы работаете в PowerShell, вы знаете о политиках выполнения. Если у вас есть политика выполнения, установленная на AllSigned, вам нужно будет подписывать каждый скрипт, работающий в вашей системе. Создать сертификат для этого довольно просто!

PS C:> New-SelfSignedCertificate -Type 'CodeSigningCert' -DnsName 'MyHost'

PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineMY

Thumbprint                                Subject              EnhancedKeyUsageList
----------                                -------              --------------------
14D535EG834370293BA103159EB00876A79959D8  CN=MyHost            Code Signing

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

Возможно, вы раньше с этим не сталкивались, но PowerShell с API защиты данных может шифровать файлы в вашей системе с помощью сертификата защиты документов. С помощью командлета New-SelfSignedCertificate мы можем легко создать сертификат для шифрования ваших документов.

$Params = @{
    "DnsName"           = "MyHost"
    "CertStoreLocation" = "Cert:CurrentUserMy"
    "KeyUsage"          = "KeyEncipherment","DataEncipherment","KeyAgreement"
    "Type"              = "DocumentEncryptionCert"
}

PS C:> New-SelfSignedCertificate @Params

Thumbprint                                Subject              EnhancedKeyUsageList
----------                                -------              --------------------
14D535EG934370293BA203159EB00876A79959D8  CN=MyHost            Document Encryption

С этим типом сертификата теперь вы можете использовать сертификат, созданный для шифрования и расшифровки контента с помощью команд PowerShell, таких как Protect-CMSMessage и UnProtect-CMSMessage.

Шифрование/дешифрование контента, подобное этому, становится полезным, если вам нужно передать зашифрованные данные, поскольку затем вы можете использовать этот сертификат в другой системе для расшифровки данных. Если вы полагаетесь на стандартный API защиты данных (DPAPI), встроенный в Windows, вы не сможете расшифровать данные в других системах или для других пользователей.

Краткое содержание

PowerShell делает создание самоподписанных сертификатов невероятно простым. Эти сертификаты имеют множество применений, но важно помнить, что их следует использовать только при тестировании. У вас не будет действующей цепочки доверия сертификатов для проверки ваших самозаверяющих сертификатов.

Видя, как быстро и легко создавать самозаверяющие сертификаты, вы можете начать делать это сегодня и должным образом шифровать любые соединения или данные, которые вам нужны!