it-swarm.com.de

Generieren Sie mit Root CA Signer ein selbstsigniertes Zertifikat

Szenario: Ich verwende PowerShell unter Windows Server 2012r2 , um ein Stammzertifikat zu generieren, und möchte dieses verwenden, um ein neu erstelltes Zwischen- und Webzertifikat in dynamisch generierten (und zerstörten) Entwicklungs-/Testumgebungen zu signieren. Die Skripte werden remote bereitgestellt, und es ist beabsichtigt, die reine PowerShell beizubehalten, wenn dies möglich ist. In Windows 10/2016 ist dies nach dem Generieren des Stammzertifikats relativ einfach:

$Cert = New-SelfSignedCertificate -Signer $Root -Subject "CN=$Subject"

Ich habe das Stammzertifikat mit COM X509Enrollment.CX509CertificateRequestCertificate und Security.Cryptography.X509Certificates.X509Certificate2 in einem bastardisierten PS generiert, das ich seit einiger Zeit habe, hauptsächlich, weil ich sicherstellen musste, dass der Betreff und die Verwendung sehr spezifisch festgelegt wurden. Ich bin nicht ganz sicher, wie ich das Standardzertifikat ohne das oben genannte (das ich zuvor verwendet habe) signieren soll.

Es gibt einige Beispiele für die Verwendung von Bouncy Castle (siehe unten) in C #, die ich in PowerShell einbinden könnte, aber dann müsste ich dies zusätzlich in den dynamischen Entwicklungs-/Testumgebungen bereitstellen, und ich möchte dies in Powershell (über COM) tun können bei Bedarf) mit den geringsten Abhängigkeiten.

4
LimpingNinja

Die ultimative Lösung in meinem Fall, um makecert und openssl zu vermeiden, war die Verwendung von Powershell und BouncyCastle. Ich gabelte das PSBouncyCastle-Repo von PSBouncyCastle von RLipscombe und schob 1.8.1 Bouncy Castle hinein. Meine gegabelte Version ist diejenige, die ich für das Skript verwendet habe, die Gabel befindet sich bei Gegabelt: PSBouncyCastle.New .

Ich habe dann StackOverflow: C # Generate Certificates on the Fly als Inspiration verwendet, um die folgende Powershell zu schreiben: Ich werde dies meinem GitHub hinzufügen und kommentieren, und ich werde dies ändern, sobald ich es tue :

Import-Module -Name PSBouncyCastle.New

function New-SelfSignedCertificate {
  [CmdletBinding()]
  param (
    [string]$SubjectName,
    [string]$FriendlyName = "New Certificate",
    [object]$Issuer,
    [bool]$IsCA = $false,
    [int]$KeyStrength = 2048,
    [int]$ValidYears = 2,
    [hashtable]$EKU = @{}
  )

  # Needed generators
  $random = New-SecureRandom
  $certificateGenerator = New-CertificateGenerator

  if($Issuer -ne $null -and $Issuer.HasPrivateKey -eq $true)
  {
    $IssuerName = $Issuer.IssuerName.Name
    $IssuerPrivateKey = $Issuer.PrivateKey
  }
  # Create and set a random certificate serial number
  $serial = New-SerialNumber -Random $random
  $certificateGenerator.SetSerialNumber($serial)

  # The signature algorithm
  $certificateGenerator.SetSignatureAlgorithm('SHA256WithRSA')

  # Basic Constraints - certificate is allowed to be used as intermediate.
  # Powershell requires either a $null or reassignment or it will return this from the function
  $certificateGenerator = Add-BasicConstraints -isCertificateAuthority $IsCA -certificateGenerator $certificateGenerator

  # Key Usage
  if($EKU.Count -gt 0) 
  {
    $certificateGenerator = $certificateGenerator | Add-ExtendedKeyUsage @EKU
  }
  # Create and set the Issuer and Subject name
  $subjectDN = New-X509Name -Name ($SubjectName)
  if($Issuer -ne $null) {
    $IssuerDN = New-X509Name -Name ($IssuerName)
  }
  else 
  {
    $IssuerDN = New-X509Name -Name ($SubjectName)
  }  
  $certificateGenerator.SetSubjectDN($subjectDN)
  $certificateGenerator.SetIssuerDN($IssuerDN)

  # Authority Key and Subject Identifier
  if($Issuer -ne $null)
  {
    $IssuerKeyPair = ConvertTo-BouncyCastleKeyPair -PrivateKey $IssuerPrivateKey
    $IssuerSerial = [Org.BouncyCastle.Math.BigInteger]$Issuer.GetSerialNumber()
    $authorityKeyIdentifier = New-AuthorityKeyIdentifier -name $Issuer.IssuerName.Name -publicKey $IssuerKeyPair.Public -serialNumber $IssuerSerial
    $certificateGenerator = Add-AuthorityKeyIdentifier -certificateGenerator $certificateGenerator -authorityKeyIdentifier $authorityKeyIdentifier
  }

  # Validity range of the certificate
  [DateTime]$notBefore = (Get-Date).AddDays(-1)
  if($ValidYears -gt 0) {
    [DateTime]$notAfter = $notBefore.AddYears($ValidYears)
  }
  $certificateGenerator.SetNotBefore($notBefore)
  $certificateGenerator.SetNotAfter($notAfter)


  # Subject public key ~and private
  $subjectKeyPair = New-KeyPair -Strength $keyStrength -Random $random
  if($IssuerPrivateKey -ne $null)
  {
    $IssuerKeyPair = [Org.BouncyCastle.Security.DotNetUtilities]::GetKeyPair($IssuerPrivateKey)
  }
  else 
  {
    $IssuerKeyPair = $subjectKeyPair
  }
  $certificateGenerator.SetPublicKey($subjectKeyPair.Public)

  # Create the Certificate
  $IssuerKeyPair = $subjectKeyPair
  $certificate = $certificateGenerator.Generate($IssuerKeyPair.Private, $random)
  # At this point you have the certificate and need to convert it and export, I return the private key for signing the next cert
  $pfxCertificate = ConvertFrom-BouncyCastleCertificate -certificate $certificate -subjectKeyPair $subjectKeyPair -friendlyName $FriendlyName
  return $pfxCertificate
}

Einige Verwendungsbeispiele für diese Powershell wären:

Generiere eine Root CA

$TestRootCA = New-SelfSignedCertificate -subjectName "CN=TestRootCA" -IsCA $true
Export-Certificate -Certificate $test -OutputFile "TestRootCA.pfx" -X509ContentType Pfx

Standard selbst signiert generieren

$TestSS = New-SelfSignedCertificate -subjectName "CN=TestLocal"
Export-Certificate -Certificate $TestSS -OutputFile "TestLocal.pfx" -X509ContentType Pfx

Generiere ein Zertifikat, signiere mit einem Root-Zertifikat

$TestRootCA = New-SelfSignedCertificate -subjectName "CN=TestRootCA" -IsCA $true
$TestSigned = New-SelfSignedCertificate -subjectName "CN=TestSignedByRoot" -issuer $TestRootCA

Export-Certificate -Certificate $test -OutputFile "TestRootCA.pfx" -X509ContentType Pfx
Export-Certificate -Certificate $test -OutputFile "TestRootCA.pfx" -X509ContentType Pfx

Generiere ein selbstsigniertes mit spezieller Verwendung

$TestServerCert = New-SelfSignedCertificate -subjectName "CN=TestServerCert" -EKU @{ "ServerAuthentication" = $true }

Beachten Sie, dass der -EKU-Parameter über Splatting akzeptiert. Dadurch wird sichergestellt, dass alle zu Add-ExtendedKeyUsage hinzugefügten Elemente gültig übergeben werden. Es akzeptiert die folgenden Zertifikatverwendungen:

  • Digitale Unterschrift
  • NonRepudiation
  • KeyEncipherment
  • Datenverschlüsselung
  • Schlüsselvereinbarung
  • KeyCertSign
  • CrlSign
  • Nur verschlüsseln
  • DecipherOnly

Dies entspricht meinen Anforderungen und scheint auf allen Windows-Plattformen zu funktionieren, die wir für dynamische Umgebungen verwenden.

8
LimpingNinja

"Itiverba Self-Signed Certificate Generator" ( http://www.itiverba.com/en/software/itisscg.php ) ist ein kostenloses GUI-Tool für Windows, mit dem Sie eigene CA-Zertifikate erstellen und signieren können -Zertifikate damit. Sie können die Zertifikate in den Dateiformaten PEM, CER, DER und PFX exportieren.

Es sind nur 3 Zeilen zu codieren:
Betreff: CN = "Testcorp - Private CA"
Grundbedingungen: V (angehakt)
Grundlegende Einschränkungen/Betreff: CA

Geben Sie einen Dateinamen ein und wählen Sie ein Dateiformat aus. Klicken Sie dann auf die Schaltfläche "Zertifikat erstellen". Ihr benutzerdefiniertes CA-Zertifikat ist fertig.

3
Steph

Wie wäre es einfach so:

$cert = New-SelfSignedCertificate -FriendlyName "MyCA"
      -KeyExportPolicy ExportableEncrypted 
      -Provider "Microsoft Strong Cryptographic Provider" 
      -Subject "SN=TestRootCA" -NotAfter (Get-Date).AddYears($ExpiryInYears) 
      -CertStoreLocation Cert:\LocalMachine\My -KeyUsageProperty All 
      -KeyUsage CertSign, CRLSign, DigitalSignature

Wichtige Parameter sind -KeyUsageProperty und -KeyUsage.

0
Adriaan de Beer