Erledigt Installation eines SelfSignedZertifikates mit PowerShell

Dr.Windos

Themenstarter
Chef
1646663912996.png


Hallo Boardies,

wie kann ich mit meinem Skript diesen Dialog automatisch mit "Ja" bestätigen lassen ohne weitere Eingabemöglichkeit, da kein GUI vorhanden ist.
Ich bin für jeden Tipp dankbar und Grüsse

Code:
if ($CERT_TYPE -eq 0)
{
    Import-Module WebAdministration

    #-----
    $Cert = @{
        DnsName = $IIS_ServerHostName
        CertStoreLocation = $Cert_Store
        FriendlyName = $Cert_SelfSignedName
        Provider = "Microsoft RSA SChannel Cryptographic Provider"
        HashAlgorithm = "SHA256"
        NotAfter = (Get-Date).AddYears(5)
    }
    #-----
    $SSLCert = New-SelfSignedCertificate @Cert
    Write-Host $SSLCert
    #-----
    $X509Store = 'System.Security.Cryptography.X509Certificates.X509Store'
    $RootStoreLocalMachine = 'Root', 'LocalMachine'
    $RootStoreCurrentUser = 'Root', 'CurrentUser'
    $Store = New-Object -TypeName $X509Store -ArgumentList $RootStoreLocalMachine
    $Store = New-Object -TypeName $X509Store -ArgumentList $RootStoreCurrentUser
    $Store.Open('ReadWrite')
    $Store.Add($SSLCert)
    $Store.Close()
    #-----
    $IIShttps="IIS:\SslBindings\0.0.0.0!443"
    $IIShttp="IIS:\SslBindings\0.0.0.0!80"
    #-----
    If((test-path $IIShttp))
    {
        Remove-Item $IIShttp
    }     
    If((test-path $IIShttps))
    {
        Remove-Item $IIShttps
    }     
    #-----
    Get-Website -Name "$('Default Web Site')"  | Get-WebBinding -Protocol "https" -Port 443 | Remove-WebBinding
    Get-Website -Name "$('Default Web Site')"  | Get-WebBinding -Protocol "http" -Port 80 | Remove-WebBinding
    #-----
    $newhttps = @{
        Name = 'Default Web Site'
        Protocol = 'https'
        Port = 443
    }
    New-WebBinding @newhttps
    #-----
    $SSLCertPath=$Cert_Store + "\$($SSLCert.Thumbprint)"
    Get-Item $SSLCertPath | New-Item $IIShttps

    invoke-command -scriptblock {iisreset} 
}
 
Zuletzt bearbeitet:

Belvedere Jehosaphat

Bekanntes Mitglied
Ich mach das so:
Code:
$hostname = hostname
$sslcert = @{
    type = "custom"
    Subject = "CN=Windows Admin Center custom cert"
    KeyExportPolicy = "Exportable"
    DnsName = "localhost",$hostname
    HashAlgorithm ="sha256"
    KeyLength = "2048"
    KeyUsage = "KeyEncipherment", "DigitalSignature"
    NotAfter = (Get-Date).AddYears(20)
    CertStoreLocation = "Cert:\LocalMachine\My"
}
$ssl = New-SelfSignedCertificate @sslcert


# export ssl certificate
$sslpath = "cert:\localMachine\my\" + $ssl.thumbprint
$certAbsFilename = $PSScriptRoot + "\" + $hostname + ".crt"
Export-Certificate -cert $sslpath -FilePath $certAbsFilename


#import ssl certificate to trusted root certificate store
Import-Certificate -CertStoreLocation 'Cert:\LocalMachine\Root' -FilePath $certAbsFilename
 

Dr.Windos

Themenstarter
Chef
@Belvedere Jehosaphat
Vielen Dank für den Code. Ich habe es in meiner VM mal getestet und es funktioniert.

FAQ:
1) Im Verzeichnis c:\Certificate\ liegt das zu importierende Zertfikat als .crt oder .pfx (also kein SelfSigned)
2) Import-Zertficate/Import-PfxZertficate in den Store funktionieren.
Aber keine Bindung an https auf die Website mit dem Zertfikat aus 1) und ich komme einfach nicht weiter.
Wäre klasse, wenn du mir da einen Tipp geben kannst.
 

DrSnuggles

Bekanntes Mitglied
@Dr.Windows:

Wenn du ein Selfsigned Cert nutzen willst und es auf dem Rechner selbst als Trusted erscheinen soll:
-https://github.com/microsoft/nav-docker/blob/master/generic/Run/New-SelfSignedCertificateEx.ps1
-EKU = Server Authentication und SAN passend setzen, IsCA = $false aus Sicherheitsgründen
-vollänständigen Schlüssel pub und private part in LocalMachine\my
-public part in LocalMachine\Root & CA
-bind auf Webseite
 
Zuletzt bearbeitet:

Dr.Windos

Themenstarter
Chef
@DrSnuggles
Vielen Dank. Hilft sicher weiter. SelfSigned funktioniert mit meinem Code und dem von @Belvedere Jehosaphat geposteten einwandfrei. Alles soweit in Ordnung.

Was ich bisher nicht geschafft habe:
1) Ich bekomme ein normales Zertifikat (.cer/.pem/.pfx) und möchte dies an meine Website anbinden. Anstelle des SelfSigned. Und es funktioniert nie über PowerShell, egal was ich alles gecheckt/gelesen und getestet habe. Und ich behaupte mal, dass ich in den letzen 4 Wochen so ziemlich jede Info zum Thema inkl. Youtube gecheckt habe.
2) Der Import des Zertifkates (.cer/.pem/.pfx) war nie das Problem, aber die verdammte Bindung an meine Website.
3) Ich bekomme immer beim Aufruf von Web-Bindung eine für mich völlig nichtssagende Fehlermeldung in PowerShell. Poste ich morgen. Jetzt ist erst einmal Feierabend.

Wenn du oder jemand aus dem Board einen Tipp hat wäre es klasse.
Ich sage euch an dieser Stelle einfach mal Danke und bis die Tage wieder.
 

DrSnuggles

Bekanntes Mitglied
Code:
Import-Module ServerManager
Install-WindowsFeature Web-Server -IncludeManagementTools

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

install-module packagemanagement -force

install-module pspki -force
import-module pspki

# self signed cert erstellen, volles Cert als PFX exportieren, pubkey als .cer exportieren, Cert aus Store löschen

$cert=New-SelfSignedCertificateEx -Subject "CN=localhost" -EKU "Server Authentication", "Client authentication" -KeyUsage "KeyEncipherment, DigitalSignature" -SAN "DNS:localhost","ip:127.0.0.1" -StoreLocation "LocalMachine" -isca $false -Exportable 
Export-PfxCertificate -Password (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force) -FilePath "$env:TEMP\localhost.pfx"  -Cert $cert -Force
Export-Certificate -FilePath "$env:TEMP\localhost.cer" -Cert $cert -force
gci $cert.Thumbprint | remove-item
gci Cert:\LocalMachine\my
$cert=$null

#----------------

Import-PfxCertificate -CertStoreLocation Cert:\LocalMachine\My -FilePath "$env:TEMP\localhost.pfx" -Password (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force)
Import-Certificate -CertStoreLocation Cert:\LocalMachine\root -FilePath "$env:TEMP\localhost.cer" 
Import-Certificate -CertStoreLocation Cert:\LocalMachine\ca -FilePath "$env:TEMP\localhost.cer" 

$cert= gci Cert:\LocalMachine\My | where {$_.Subject -eq "CN=localhost"}

import-module webadministration

$siteName='Default Web Site'
New-WebBinding -name $siteName -Protocol https  -HostHeader "localhost" -Port 443 -SslFlags 1
$binding = Get-WebBinding -Name $siteName -Protocol "https"
$binding.AddSslCertificate($cert.Thumbprint, "my")
 

DrSnuggles

Bekanntes Mitglied
Ich hab dir mal ein volles Beispiel gebaut.
Vor #-------- ist nur das Setup danach ein sauberer import eines Certs und das Binding
 

Dr.Windos

Themenstarter
Chef
@DrSnuggles
Vielen Dank. Ich werde es einbauen und testen. Ich melde mich mit dem Resulatat über das Ticket zurück.
Ich wünsche dir einen sonnigen Tag und nochmals Danke an dieser Stelle für deine Unterstützung.
 

Dr.Windos

Themenstarter
Chef
1646909586491.png

@DrSnuggles
Das bekomme ich als Fehler zurück. Hier muss ein Fehler im Aufruf sein. -EKU "Server Authentication", "Client authentication"
$cert=New-SelfSignedCertificateEx -Subject "CN=localhost" -EKU "Server Authentication", "Client authentication" -KeyUsage "KeyEncipherment, DigitalSignature" -SAN "DNS:localhost","ip:127.0.0.1" -StoreLocation "LocalMachine" -isca $false -Exportable
 

Dr.Windos

Themenstarter
Chef
Hallo Zusammen,

ich habe es geschafft ein gültiges Zertifikat zu erstellen, ohne das PSPKI-Module, da es damit Fehler gab, wie oben beschrieben.

Code:
#-----
$ParameterListe=$PSScriptRoot + "\ParameterListe.ps1"
. $ParameterListe
#-----
Function Import_Cert
{
    Import-Module WebAdministration

    if ($certTYPE -eq 0)
    {
        $sslcert = @{
            type = "custom"
            Subject = "CN=Demo custom cert"
            KeyExportPolicy = "Exportable"
            DnsName = "localhost",$IIS_ServerHostName
            CertStoreLocation = $certMyStore
            FriendlyName = $certFriendlyName
            HashAlgorithm ="sha256"
            KeyLength = "2048"
            KeyUsage = "KeyEncipherment", "DigitalSignature"
            NotAfter = (Get-Date).AddYears(10)
        }
        $cert = New-SelfSignedCertificate @sslcert
        $sslpath = $certMyStore + "\" + $cert.thumbprint
        $cerFileName = $certDir + "\" + $IIS_ServerHostName + ".cer"
        $PfxFileName = $certDir + "\" + $IIS_ServerHostName + ".pfx"

        Export-PfxCertificate -Password (ConvertTo-SecureString $certPfxPwd -AsPlainText -Force) -FilePath $PfxFileName  -Cert $cert -Force
        Export-Certificate -cert $sslpath -FilePath $cerFileName -force

        Import-PfxCertificate -CertStoreLocation Cert:\LocalMachine\My -FilePath $PfxFileName -Password (ConvertTo-SecureString $certPfxPwd -AsPlainText -Force)
        Import-Certificate -CertStoreLocation $certRootStore -FilePath $cerFileName
        Import-Certificate -CertStoreLocation $certCAStore -FilePath $cerFileName
      
        $IIShttps="IIS:\SslBindings\0.0.0.0!443"
        $IIShttp="IIS:\SslBindings\0.0.0.0!80"
        If((test-path $IIShttp))
        {
            Remove-Item $IIShttp
        }     
        If((test-path $IIShttps))
        {
            Remove-Item $IIShttps
        }     
        Get-Website -Name "Default Web Site"  | Get-WebBinding -Protocol "https" -Port 443 | Remove-WebBinding
        Get-Website -Name "Default Web Site"  | Get-WebBinding -Protocol "http" -Port 80 | Remove-WebBinding
        $newhttps = @{
            Name = "Default Web Site"
            Protocol = 'https'
            Port = 443
        }
        New-WebBinding @newhttps
        Get-Item $sslpath | New-Item $IIShttps
        invoke-command -scriptblock {iisreset} 
    }
}
 

DrSnuggles

Bekanntes Mitglied
Die eku ist sprachabhängig. Bei einem deutschen Windows müssen die deutschen Begriffe rein.
Sprachneutral ist die Variante mit OID

Das invoke-command ist überflüssig, du willst ja nicht auf einem remote Rechner etwas ausführen.
& Iisreset
 

Dr.Windos

Themenstarter
Chef
@DrSnuggles
Ich danke dir und ich lerne jeden Tag was dazu, trotz meines gereiften Alters.:D
Wünsche uns allen einen entspannten Freitag sowie ein erholsames Wochenende.
 
Zuletzt bearbeitet:

Dr.Windos

Themenstarter
Chef
1647332144838.png

Das Zertifikat in meiner VM
1647332168594.png

Das Zertifikat in meinem Container.
OS: Windows Server Core 2019 LTSC
Beide Zertifikate wurde mit dem Code unten erstellt und ich finde den Fehler nicht. $env:COMPUTERNAME wurde auf die Variable $IIS_ServerHostName gesetzt.
Ich sage an dieser Stelle wie immer Danke und Grüsse an alle.

Code:
#-----
$ParameterListe=$PSScriptRoot + "\ParameterListe.ps1"
. $ParameterListe
#-----
Function Import_Cert
{
    #----- tls12
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Import-Module ServerManager
    Import-Module WebAdministration
    #----- check for $certDir
    If(!(test-path $certDir)) {New-Item -Path $certDir -ItemType Directory -Force -ErrorAction SilentlyContinue}
    #-----
    if ($certTYPE -eq 0)
    {
        $selfsigned = @{
            type = "custom"
            Subject = "CN=Firma custom cert"
            KeyExportPolicy = "Exportable"
            DnsName = "localhost",$IIS_ServerHostName
            CertStoreLocation = $certMyStore
            FriendlyName = $certFriendlyName
            HashAlgorithm ="sha256"
            KeyLength = "2048"
            KeyUsage = "KeyEncipherment", "DigitalSignature"
            NotAfter = (Get-Date).AddYears(10)
        }
        $cert = New-SelfSignedCertificate @selfsigned
        $sslpath = $certMyStore + "\" + $cert.thumbprint
        $cerFileName = $certDir + "\" + $IIS_ServerHostName + ".cer"
        $PfxFileName = $certDir + "\" + $IIS_ServerHostName + ".pfx"

        Export-PfxCertificate -Password (ConvertTo-SecureString $certPfxPwd -AsPlainText -Force) -FilePath $PfxFileName  -Cert $cert -Force
        Export-Certificate -cert $sslpath -FilePath $cerFileName -force

        Import-PfxCertificate -CertStoreLocation $certMyStore -FilePath $PfxFileName -Password (ConvertTo-SecureString $certPfxPwd -AsPlainText -Force)
        Import-Certificate -CertStoreLocation $certRootStore -FilePath $cerFileName
        Import-Certificate -CertStoreLocation $certCAStore -FilePath $cerFileName
      
        $IIShttps="IIS:\SslBindings\0.0.0.0!443"
        $IIShttp="IIS:\SslBindings\0.0.0.0!80"
        If((test-path $IIShttp)) {Remove-Item $IIShttp}     
        If((test-path $IIShttps)) {Remove-Item $IIShttps}     

        Get-Website -Name "Default Web Site"  | Get-WebBinding -Protocol "https" -Port 443 | Remove-WebBinding
        Get-Website -Name "Default Web Site"  | Get-WebBinding -Protocol "http" -Port 80 | Remove-WebBinding

        $newhttps = @{
            Name = "Default Web Site"
            Protocol = 'https'
            Port = 443
        }
        New-WebBinding @newhttps
        Get-Item $sslpath | New-Item $IIShttps
    }
}
Import_Cert
#----- EOF
 
Zuletzt bearbeitet:

DrSnuggles

Bekanntes Mitglied
Die Funktion ist nicht vollständig.
Bitte baue das Beispiel so, dass es keine globalen Variablen gibt oder, dass die globalen Variablen ebenfalls im Posting stehen.

Was ist deine VM?
Was ist dein Container?

Wenn du ein self signed Cert hast musst du es natürlich überall via importieren:
Import-Certificate -CertStoreLocation $certRootStore -FilePath $cerFileName
Import-Certificate -CertStoreLocation $certCAStore -FilePath $cerFileName

PS: Globale Variablen in Funktionen zu nutzen ist pfui ...
 
Zuletzt bearbeitet:

Dr.Windos

Themenstarter
Chef
Hallo Zusammen,
wie von euch gewünscht die Angaben.
VM
1647426376646.png


Container
1647426296311.png

Die globale Variablen gibt es nur in 1 Datei im gesamten Projekt, da nur hier Anpassungen erforderlich sind.
Und diese wird in jeder Datei des Projektes verwendet.
Der Code oben wird für VM und Container 1:1 verwendet.

Code:
#-----
#    ParameterListe.ps1
#-----
$rootSetupFiles=$rootFolderSetup + "\SetupFiles"
$rootPSFiles=$rootFolderSetup + "\SetupPowershell"
$rootServerCoreInstallDir=$rootFolderSetup + "\ServerCoreInstall"
$vmSetupFileDir="C:\SetupFiles"
$vmSetupFileDirDocker="C:/SetupFiles/"
$vmPSSkriptDir=$vmSetupFileDir + "\PowershellSkripte"
$vmPSModuleDir=$vmSetupFileDir + "\PowershellModules"
$vmPSModuleNuGet=$vmPSModuleDir + "\nuget"
$vmPSModuleSQLServer=$vmPSModuleDir + "\SqlServer"
$vmPSModulePSPKI=$vmPSModuleDir + "\pspki"
$vmNugetPath="C:\Program Files\PackageManagement\ProviderAssemblies\nuget\2.8.5.208"
$vmPSPKIModulesPath="c:\Program Files\WindowsPowerShell\Modules\pspki\3.7.2"
$vmSQLServerModulesPath="C:\Program Files\WindowsPowerShell\Modules\SqlServer"
$CommSetupDir=$vmSetupFileDir + "\CommAppSetup\*"
$certSetupDir=$vmSetupFileDir + "\Certificate\*"
$NET352016SetupDir=$vmSetupFileDir + "\NET35Offline\2016\*"
$NET352019SetupDir=$vmSetupFileDir + "\NET35Offline\2019\*"
$NET352022SetupDir=$vmSetupFileDir + "\NET35Offline\2022\*"
$NET3520H2SetupDir=$vmSetupFileDir + "\NET35Offline\20H2\*"
$NET35Dir="c:\sources\sxs"
$vmPSSkriptSQLServerSetup=$vmPSSkriptDir + "\SQLServer_Setup.ps1"
$vmPSSkriptIISSetup=$vmPSSkriptDir + "\IISServer_Setup.ps1"
$vmPSSkriptIISImportCert=$vmPSSkriptDir + "\IISServer_ImportCert.ps1"
$vmPSSkriptACLsetup=$vmPSSkriptDir + "\Set_ACL.ps1"
$vmPSSkriptCommsetup=$vmPSSkriptDir + "\Comm_Setup.ps1"
$SqlSetupExePath=$vmSetupFileDir + "\SQLExpressSetup\SQLEXPRADV_x64_ENU\Setup.exe"
$SQLSkript01_Platzhalter="C:\ProjektName\"
$SQLDBSetup_Dir=$vmSetupFileDir + "\ProjektNameDBSetup"
$SQLDBSetup_Skript01=$SQLDBSetup_Dir + "\01_ProjektNameCreateDatabase.sql"
$SQLDBSetup_Skript02=$SQLDBSetup_Dir + "\02_ProjektNameCreateSQLUserAndSchema.sql"
$SQLDBSetup_Skript03=$SQLDBSetup_Dir + "\03_ProjektNameCreateTables.sql"
$SQLDBSetup_Skript04=$SQLDBSetup_Dir + "\04_ProjektNameInsertDefaultData.sql"
$SQLDBSetup_Skript05=$SQLDBSetup_Dir + "\05_ProjektNameCreateSQLUser.sql"
$PHPDir="C:\Program Files\php8"
$EDITOR=0
$Notepad=$vmSetupFileDir + "\ToolsSetup\notepad64.msi"
$BROWSERTYPE=0
$certTYPE=0
$Chrome=$vmSetupFileDir + "\ToolsSetup\googlechromestandaloneenterprise64.msi"
$Edge=$vmSetupFileDir + "\ToolsSetup\MicrosoftEdgeEnterpriseX64.msi"
$Firefox=$vmSetupFileDir + "\ToolsSetup\Firefox64.msi"
$IMAGETYPE=2019
$InetPubRoot="C:\Inetpub"
$InetPubLog=$InetPubRoot + "\log"
$InetPubWWWRoot=$InetPubRoot + "\wwwroot"
$InetPubData=$InetPubRoot + "\daten"
$InetPubSessions=$InetPubRoot + "\php_sessions"
$InetPubUploads=$InetPubRoot + "\uploads"
$NewInetPubRoot="D:\Inetpub"
$NewInetPubLog=$NewInetPubRoot + "\log"
$NewInetPubWWWRoot=$NewInetPubRoot + "\wwwroot"
$NewInetPubData=$NewInetPubRoot + "\daten"
$NewInetPubSessions=$NewInetPubRoot + "\php_sessions"
$NewInetPubUploads=$NewInetPubRoot + "\uploads"
$PHPConfigTemplate=$vmSetupFileDir + "\PHPConfigVorlagen\config.php"
$PHPiniTemplate=$vmSetupFileDir + "\PHPConfigVorlagen\php.ini"
$PHPConfigDir=$InetPubWWWRoot + "\config\config.php"
$NewPHPConfigDir=$NewInetPubWWWRoot + "\config\config.php"
$PHPCGI=$PHPDir + "\php-cgi.exe"
$PHPSetupPath=$vmSetupFileDir + "\PHPSetup\php\*"
$PHPExtPath=$PHPDir + "\ext"
$PHPiniTarget=$PHPDir + "\php.ini"
$ProjektNameSetupFiles=$vmSetupFileDir + "\ProjektNameAppSetup"
$VCppRuntimes=$vmSetupFileDir + "\VCppRuntimeSetup\VisualCppRedist_AIO_x86_x64.exe"
$URLRewrite=$vmSetupFileDir + "\URLRewriteSetup\rewrite_amd64_en-US.msi"
$OPENJDK=$vmSetupFileDir + "\OpenJDK\amazon-corretto-11.0.14.10.1-windows-x64.msi"
$ODBC=$vmSetupFileDir + "\SQLODBCSetup\msodbcsql.msi"
$DockerFileDir=$rootFolderSetup + "\dockerfile"
$DockerFiles=$DockerFileDir + "\dockerfile"
$DockerSetupFiles=$DockerFileDir + "\SetupFiles"
$certDir="c:\Cert"
$certMyStore= "Cert:\LocalMachine\My"
$certCAStore= "Cert:\LocalMachine\CA"
$certRootStore= "Cert:\LocalMachine\Root"
$certFriendlyName = "ProjektName SelfSignedCert (c) 2022"
$certPfxPwd= "!ProjektName@PassW0rd_2022"
$CommDir="C:\instComm"
$dockerLabelMaintainer="ProjektName@mail.com"
$DockerImageName_SQL="ProjektName_sql_image"
$DockerHostName_SQL="srv_sql"
$DockerImageName_IIS="ProjektName_iis_image"
$DockerHostName_IIS="srv_iis"
$DockerImageName="ProjektName_complete_image"
$DockerHostName="srv_ProjektName"
$DockerNetwork="winl2bridge"
$tempDir = "c:\temp\"
$Destination = "C:\Container"
$DockerDir = $Destination + "\docker"
$SQLDBPathDir="C:\ProjektNameDB\"
$SQLDBPathDir_Backup=$SQLDBPathDir + "\Databases\Backup"
$SQLDBPathDir_Data=$SQLDBPathDir + "\Databases\Data"
$SQLDBPathDir_Log=$SQLDBPathDir + "\Databases\Log"
$SQLDBName="ProjektNameDB"
$SqlSetup_SaUser="sa"
$SqlSetup_SaPass="!ProjektName@PassW0rd_2022"
$SqlSetup_InstanceName="SQLEXPRESS"
$SqlSetup_Server="localhost\SQLEXPRESS"
$SQLServerIP="127.0.0.1"
$SQLServerHostName=$DockerHostName
$IISServerIP="127.0.0.1"
$IIS_ServerHostName=$DockerHostName
$global:started = $FALSE
$global:startingStep = $Step
$global:restartKey = "Restart-And-Resume"
$global:RegRunKey ="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
$global:powershell = (Join-Path $env:windir "system32\WindowsPowerShell\v1.0\powershell.exe")
#-----
# Collection of Utility Functions for Automatically Restart Script after Restart Computer
#-----
Function Should-Run-Step([string] $prospectStep)
{
    if ($global:startingStep -eq $prospectStep -or $global:started) {$global:started = $TRUE}
    return $global:started
}
Function Wait-For-Keypress([string] $message, [bool] $shouldExit=$FALSE)
{
    Write-Host "$message" -foregroundcolor yellow
    $key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    if ($shouldExit) {exit}
}
Function Test-Key([string] $path, [string] $key)
{
    return ((Test-Path $path) -and ((Get-Key $path $key) -ne $null))  
}
Function Remove-Key([string] $path, [string] $key)
{
    Remove-ItemProperty -path $path -name $key
}
Function Set-Key([string] $path, [string] $key, [string] $value)
{
    Set-ItemProperty -path $path -name $key -value $value
}
Function Get-Key([string] $path, [string] $key)
{
    return (Get-ItemProperty $path).$key
}
Function Restart-And-Run([string] $key, [string] $run)
{
    Set-Key $global:RegRunKey $key $run
    Restart-Computer
    exit
}
Function Clear-Any-Restart([string] $key=$global:restartKey)
{
    if (Test-Key $global:RegRunKey $key) {Remove-Key $global:RegRunKey $key}
}
Function Restart-And-Resume([string] $script, [string] $step)
{
    Restart-And-Run $global:restartKey "$global:powershell $script -Step $step"
}
Function Write-Log
{
    [CmdletBinding()]
    param(
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]$Message,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Information','Warning','Error')]
        [string]$Severity = 'Information'
    )
 
    [pscustomobject]@{
        Time = (Get-Date -f g)
        Message = $Message
        Severity = $Severity
    } | Export-Csv -Path "$env:Temp\install.csv" -Append -NoTypeInformation
}
#----- EOF
 
Zuletzt bearbeitet:

Dr.Windos

Themenstarter
Chef
Rückmeldung:
Ich konnte das Problem lösen indem ich das Zertifikat auf der VM erstellt habe und es im Container importiert habe. Ich danke euch für eure Hilfe und bis zum nächstenmal.
 

Dr.Windos

Themenstarter
Chef
Hallo Zusammen,

ich möchte euch nicht den Fortschritt vorenthalten, den ich beim Erstellen gemacht habe.
Das Zertifikat ist damit immer gültig. (physischen Maschine/VM)
Nur in einer Windows Server Core ist das Zertifikat nie gültig. Da bin ich aber dran und denke, dass dies auch bald erledigt sein wird.

Hilfe war hier zur finden: How to create a valid self-signed SSL certificate for your internal services using PowerShell

1650960431866.png

1650960523624.png

1650960594385.png


Code:
Function IIS_MakeRootAndSelfSignCert
{
    if ($http -eq 0)
    {
        #----- tls12
        [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
        Import-Module ServerManager
        Import-Module WebAdministration
        #----- Self Signed Cert Data
        $certDomains = @("DEVSERVER", "DEVSERVER.local")
        $certIPAddresses = @("10.2.103.197")
        $subjectAltName = "2.5.29.17={text}"
        $subjectAltName = $subjectAltName + (&{if($certDomains) { "DNS=" + ($certDomains -Join "&DNS=") + (&{if($certIPAddresses) { "&" }}) }}) + (&{if($certIPAddresses) { "IPAddress=" + ($certIPAddresses -Join "&IPAddress=") }})
        #----- vars
        $certDir="c:\Cert"
        $certMyStore= "Cert:\LocalMachine\My"
        $certRootStore= "Cert:\LocalMachine\Root"
        $certUserRootStore = "Cert:\CurrentUser\Root"
        $certRootFriendlyName = "RootCA"
        $certFriendlyName = "Test-SelfSignedCert"
        $certRootFileName = $certDir + "\" + $certRootFriendlyName + ".cer"
        $certPfxRootFileName = $certDir + "\" + $certRootFriendlyName + ".pfx"
        $certFileName = $certDir + "\" + $certFriendlyName + ".cer"
        $certPfxFileName = $certDir + "\" + $certFriendlyName + ".pfx"
        $certPfxPwd= "!Password@2022"
        #----- check for $certDir
        If(!(test-path $certDir)) {New-Item -Path $certDir -ItemType Directory -Force -ErrorAction SilentlyContinue}
        #-----
        $certRoot = @{
            FriendlyName = $certRootFriendlyName
            DnsName = $certRootFriendlyName
            Subject = "CN=RootCA,O=RootCA,OU=RootCA"
            KeyLength = 4096
            KeyAlgorithm = "RSA"
            HashAlgorithm = "SHA256"
            KeyExportPolicy = "Exportable"
            KeyUsage = "CertSign","CRLSign","DigitalSignature"
            KeyUsageProperty = "All"
            NotAfter = (Get-Date).AddYears(15)
            Provider = "Microsoft Enhanced RSA and AES Cryptographic Provider"
            CertStoreLocation = $certMyStore
        }
        $rootCACert = New-SelfSignedCertificate @certRoot
        $rootCAThumbprint = $rootCACert.Thumbprint
        $rootCACertPassword = (ConvertTo-SecureString -String $certPfxPwd -Force -AsPlainText)

        Export-PfxCertificate -Cert $certMyStore\$rootCAThumbprint -FilePath $certPfxRootFileName -Password $rootCACertPassword
        Export-Certificate -Cert $rootCACert -FilePath $certRootFileName -Type CERT

        $rootCACert = Get-ChildItem $certMyStore | Where-Object{$_.FriendlyName -eq $certRootFriendlyName}

        $certSelfSigned = @{
            Subject = $certFriendlyName
            TextExtension = @("$subjectAltName")
            FriendlyName = $certFriendlyName
            Signer = $rootCACert
            KeyLength = 4096
            HashAlgorithm ="SHA256"
            KeyExportPolicy = "Exportable"
            NotAfter = (Get-Date).AddYears(15)
            CertStoreLocation = $certMyStore
        }
        $cert = New-SelfSignedCertificate @certSelfSigned
        $certThumbprint = $cert.Thumbprint
        $certPfxPassword = (ConvertTo-SecureString -String $certPfxPwd -Force -AsPlainText)
  
        Export-Certificate -Cert $cert -FilePath $certFileName -Type CERT
        Export-PfxCertificate -Cert $cert -FilePath $certPfxFileName -Password $certPfxPassword
        # Local Machine's Trusted Root Certification Authorities store
        Import-Certificate -FilePath $certRootFileName -CertStoreLocation $certRootStore
        # Current user's Trusted Root Certification Authorities store
        Import-Certificate -FilePath $certRootFileName -CertStoreLocation $certUserRootStore

        $cert = Get-ChildItem $certMyStore | Where-Object{$_.FriendlyName -eq $certFriendlyName}

        $siteName="Default Web Site"
        New-WebBinding -name $siteName -Protocol https  -Port 443
        $binding = Get-WebBinding -Name $siteName -Protocol "https"
        $binding.AddSslCertificate($certThumbprint, "my")
    }
}
 
Zuletzt bearbeitet:
Oben Unten