Создание сертификата и CSR с помощью Windows PowerShell / .Net без использования внешних программ или библиотек. - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы создать закрытый ключ и CSR, отправить CSR в центр сертификации, получить сертификат после его выдачи и иметь закрытый ключ и сертификат в виде отдельных файлов PEM, подходящих для использования в приложениях не от Microsoft (оникак правило, веб-серверы).Я бы не хотел использовать Java Keytool или OpenSSL для генерации ключей и запросов на подпись сертификатов в Windows PowerShell на Windows Server 2016. CSR будут отправляться в службы сертификации Microsoft Active Directory.

OpenSSL и Java не являются(и не будет) установлен на компьютерах, требующих сертификатов.Поскольку сертификаты предназначены для приложений, не принадлежащих Microsoft, я также хочу избегать использования хранилища сертификатов на компьютерах.Я не против использовать «certreq» для фактической отправки завершенного CSR и получения полученного сертификата после его утверждения.

У меня есть некоторый код, основанный на C # Экспорт частного / открытого ключа RSA из RSACryptoServiceProvider в PEMстрока , которая извлекает закрытый ключ из сертификата X509.До сих пор в качестве эксперимента я успешно использовал это с хранилищем ключей PKCS12 (где ключ и CSR были созданы с помощью Keytool).

Вдохновлен Автоматизируйте процесс создания личного ключа, CSRи последний подписанный сертификат в .NET Core Я собрал следующее, но мне не хватило вдохновения, и я действительно не знал, что я делаю.Как мне завершить процесс отправки CSR в CA (или вывести CSR в виде файла для использования с certreq)?

[int]$KeyLength = 2048
$ComputerName = "jon"
$Domain = "domain.local"
[string]$DistinguishedName = "CN=$($ComputerName).$($Domain),OU=Unit,O=Org,C=GB"
$HashAlgo = [System.Security.Cryptography.HashAlgorithmName]::SHA256
$RSASigPadding = [System.Security.Cryptography.RSASignaturePadding]::Pkcs1

$RSAKey = [System.Security.Cryptography.RSA]::Create($KeyLength)
$Certificate = [System.Security.Cryptography.X509Certificates.CertificateRequest]::new($DistinguishedName,$RSAKey,$HashAlgo,$RSASigPadding)

# Add Basic Constraints
$BasicConstraints = [System.Security.Cryptography.X509Certificates.X509BasicConstraintsExtension]::new($false,$false,0,$false)
$BCExtension = [System.Security.Cryptography.X509Certificates.X509Extension]::new($BasicConstraints,$false)
$Certificate.CertificateExtensions.Add($BCExtension)

# Add Subject Key Identifier extension
$SubjectKeyIdentifier = [System.Security.Cryptography.X509Certificates.X509SubjectKeyIdentifierExtension]::new($Certificate.PublicKey,$false)
$SKIExtension = [System.Security.Cryptography.X509Certificates.X509Extension]::new($SubjectKeyIdentifier,$false)
$Certificate.CertificateExtensions.Add($SKIExtension)

# Add Key Usage
$KeyUsageFlags = [System.Security.Cryptography.X509Certificates.X509KeyUsageFlags]::DigitalSignature -bor [System.Security.Cryptography.X509Certificates.X509KeyUsageFlags]::KeyEncipherment
$KeyUsage = [System.Security.Cryptography.X509Certificates.X509KeyUsageExtension]::new($KeyUsageFlags,$true)
$KUExtension = [System.Security.Cryptography.X509Certificates.X509Extension]::new($KeyUsage,$true)
$Certificate.CertificateExtensions.Add($KUExtension)

# Add EKU
$ServerAuthentication = [System.Security.Cryptography.Oid]::New("Server Authentication")
$EKUOidCollection = [System.Security.Cryptography.OidCollection]::new()
$EKUOidCollection.Add($ServerAuthentication) | out-null # this outputs 0
$EnhancedKeyUsage = [System.Security.Cryptography.X509Certificates.X509EnhancedKeyUsageExtension]::new($EKUOidCollection,$false)
$EKUExtension = [System.Security.Cryptography.X509Certificates.X509Extension]::new($EnhancedKeyUsage,$false)
$Certificate.CertificateExtensions.Add($EKUExtension)

# Add SAN
$SubjectAlternateNameBuilder = [System.Security.Cryptography.X509Certificates.SubjectAlternativeNameBuilder]::new()
$SubjectAlternateNameBuilder.AddDnsName("$($ComputerName).$($Domain)")
$Certificate.CertificateExtensions.Add($SubjectAlternateNameBuilder.Build())
...