adminst
Goto Top

Powershell add certificate binding IIS Vhost tcp 83

Hallo zusammen

Ich benötige eure Hilfe, da ich nicht versiert bin mit Powershell.

Gegeben:
-IIS Webserver
- VHost: "Default Web Site" "Type https" "Hostname fqdn Server" Port 443
- VHost: "Seite1" "Type https" "DNS-Alias" Port 83

Via WinACME wird intern ein Zertifikat für alle Hosts in diesem IIS beantragt und automatisch gebindet überall wo es auf https ist und TCP 443. Leider ist dies bei TCP 83 nicht möglich.

Der Applikationshersteller weigert sich den Port 83 auf 443 zu wechseln.

Hat jemand ein Skript welcher folgendes abdecken würde oder kann mir kurz aushelfen?

1. prüfen im Webhosting Certificatestore ein Zertifikat ist welches auf den Hostnamen Issued ist. Falls mehre sind sich den Hashwert des neusten merkt.
2. Das Binding beim VHost1 das Binding auf dieses Zertifikat macht.
3. Falls kein Binding auf TCP 83 Typ https drin ist dies noch erstellt.

Ich wäre um jede Hilfe dankbar
adminst

Content-ID: 668021

Url: https://administrator.de/contentid/668021

Ausgedruckt am: 21.11.2024 um 12:11 Uhr

14260433693
Lösung 14260433693 10.09.2024 aktualisiert um 14:32:53 Uhr
Goto Top
# IIS site name
$sitename = "Seite1"  
# domain name
$domainname = 'mydomain.tld'  
# location of cert
$certlocation = "Cert:\LocalMachine\WebHosting"  
# binding
$bindinginfo = '*:83:'  
# --------------------------------------------------------
# get certificate
$cert = Get-ChildItem $certlocation  | ? DnsNameList -contains $domainname | sort NotAfter -Descending | select -First 1
# if certificate found
if ($cert){
    # get certificate binding
    $binding = Get-IISSiteBinding -Name $sitename -BindingInformation $bindinginfo -Protocol https -WarningAction SilentlyContinue
    # if binding not found
    if (!$binding){
        # create new binding
        write-host "Creating new IIS binding" -F Green  
        New-IISSiteBinding -Name $sitename -BindingInformation $bindinginfo -Protocol https -CertificateThumbPrint $cert.Thumbprint  -CertStorelocation $certlocation
    }else{
        # binding found compare certificate hash, if not equals to cert thumbprint update re-add binding
        if (!$binding.CertificateHash -or [Bitconverter]::ToString($binding.CertificateHash).replace("-","") -ne $cert.Thumbprint){  
            write-host "Updating IIS binding to new certificate." -f Green  
            Remove-IISSiteBinding -Name $sitename -BindingInformation $binding.bindingInformation -Protocol https -Confirm:$false
            New-IISSiteBinding -Name $sitename -BindingInformation $bindinginfo -Protocol https -CertificateThumbPrint $cert.Thumbprint  -CertStorelocation $certlocation
        }
    }
}

gruß
adminst
adminst 10.09.2024 um 13:30:56 Uhr
Goto Top
Hallo @14260433693
Die IIS Zertifikate sind im Webhosting drin. Ich habe dies nun angepasst:
Get-ChildItem Cert:\LocalMachine\WebHosting | ? DnsNameList -container 'my.domain.tld' | sort NotAfter -Descending | select -First 1  

Ich bekomme jedoch folgende Fehlermeldung:
Where-Object : A parameter cannot be found that matches parameter name 'container'.  

Wie kann ich das fixen?

Danke und Gruss
adminst
14260433693
14260433693 10.09.2024 aktualisiert um 13:36:13 Uhr
Goto Top
Das heißt -contains nicht "-container"

RTFM
https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell ...

Die IIS Zertifikate sind im Webhosting drin
Weiter unten dann aber auch anpassen ...
adminst
adminst 10.09.2024 um 13:54:21 Uhr
Goto Top
Hallo @14260433693
Da hat der Korrekturteufel zugeschlagen. Ich habs jetzt korrigiert. Es läuft durch.
Im Moment hat der kein Zertifikatsbinding. In diesem Fall wirds auch nicht durch das Skript gebindet.

PS C:\Users\itbueste\Desktop> Get-IISSiteBinding -Name "Seite1" -BindingInformation "*:83:" -Protocol https  

protocol bindingInformation sslFlags
-------- ------------------ --------
https    *:83:                  None

Können wir diesen Fall auch noch abfangen?

Danke und Gruss
adminst
14260433693
14260433693 10.09.2024 aktualisiert um 14:00:34 Uhr
Goto Top
Im Moment hat der kein Zertifikatsbinding. In diesem Fall wirds auch nicht durch das Skript gebindet.
Doch da hat er, das "SSLFlags" hat nicht mit Certificate Ja/nein zu tun, lass dir alle Eigenschaften anzeigen (format-list *) dann siehst du das das Zertifikat da eingebunden ist ...
adminst
adminst 10.09.2024 um 14:09:49 Uhr
Goto Top
Das Zertifikat wurde nicht gebunden
BindingInformation   : *:83:
CertificateHash      : 
CertificateStoreName : 
EndPoint             : 0.0.0.0:83
Host                 : 
IsIPPortHostBinding  : True
SslFlags             : None
UseDsMapper          : False
Protocol             : https
Attributes           : {protocol, bindingInformation, sslFlags, isDsMapperEnabled...}
ChildElements        : {}
ElementTagName       : binding
IsLocallyStored      : True
Methods              : {EnableDsMapper, DisableDsMapper, AddSslCertificate, RemoveSslCertificate...}
RawAttributes        : {[protocol, https], [bindingInformation, *:83:], [sslFlags, 0], [isDsMapperEnabled, False]...}
Schema               : Microsoft.Web.Administration.ConfigurationElementSchema
iis
14260433693
14260433693 10.09.2024 aktualisiert um 14:13:59 Uhr
Goto Top
Besteht der Eintrag denn schon vorher? Wenn ja von einem "Update" eines bereits bestehenden Eintrags hattest du in deinem Post nichts erwähnt nur was von "Hinzufügen". Habe den Update-Fall aber oben jetzt noch hinzugefügt.
adminst
adminst 10.09.2024 um 14:21:34 Uhr
Goto Top
Du bist eine super Hilfe.
Jetzt bekomme ich noch eine Exception
Exception calling "ToString" with "1" argument(s): "Value cannot be null

Ich vermute, dass es im Moment ist, dass da beim Binding kein Hash drin ist. Kann man das so modifizieren, dass wenn er keinen bestehenden Certificate Hash zurückbekommt den aktuellen Hash setzt und keine Exception wirft?
14260433693
14260433693 10.09.2024 aktualisiert um 14:30:01 Uhr
Goto Top
Nur bisschen Kosmetik, setzen tut er es schon, ist aber oben noch ergänzt wenns stört.
adminst
adminst 10.09.2024 um 14:31:34 Uhr
Goto Top
Updating IIS binding to new certificate.
WARNING: Web site binding 'http *:83:' does not exist.  
New-IISSiteBinding : Web site binding '*:83:' already exists.  
At C:\Users\xx\Desktop\iis.ps1:26 char:13
+             New-IISSiteBinding -Name $sitename -BindingInformation $b ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-IISSiteBinding], ArgumentException
    + FullyQualifiedErrorId : InvalidArgument,Microsoft.IIS.Powershell.Commands.NewIISSiteBindingCommand
14260433693
14260433693 10.09.2024 aktualisiert um 14:39:03 Uhr
Goto Top
"Protocol" beim Entfernen vergessen ist ergänzt, sorry sitze im Zug und der wackelt gewaltig face-big-smile.

p..s. Du Darfst gerne ab und zu auch mal selbst in die Doku schauen damit du auch was von dem ganzen mit nimmst und nicht nur copy n pastest ...
adminst
adminst 10.09.2024 um 14:51:03 Uhr
Goto Top
face-smile Kein Problem.
Jetzt läuft das Skript durch. Das Binding wird leider immer noch nicht gemacht.

Write-Host "Vergleiche Hash" -F Green  
        if (!$binding.CertificateHash -or [Bitconverter]::ToString($binding.CertificateHash).replace("-","") -ne $cert.Thumbprint){    
            write-host "Updating IIS binding to new certificate." -f Green    
            Remove-IISSiteBinding -Name $sitename -BindingInformation $binding.bindingInformation -Protocol https -Confirm:$false
            New-IISSiteBinding -Name $sitename -BindingInformation $bindinginfo -Protocol https -CertificateThumbPrint $cert.Thumbprint  -CertStorelocation $certlocation

Zum testen habe ich noch den write-host reingenommen "Vergleiche Hash". Dies wird angezeigt.
Aber der Output Updating IIS binding to new certificate. kommt nicht. Dort scheint noch irgendwo der Hund begraben
14260433693
14260433693 10.09.2024 aktualisiert um 14:57:50 Uhr
Goto Top
Klappt hier im Test einwandfrei.
Prüfe mal ob $binding.CertificateHash wirklich $null ist oder nur ein leeres Array.
14260433693
14260433693 10.09.2024 aktualisiert um 15:02:24 Uhr
Goto Top
screenshot

screenshot

p.s. du solltest immer in einer frischen Shell testen nicht in der ISE!
adminst
adminst 10.09.2024 um 15:01:20 Uhr
Goto Top
Hallo Naughty
Das hat nur jemand das Zertifikat gelöscht gehabt. Er bindet es auch nicht, wenn ich ein anderes Zertifikat kurz generiere.

 }else{
        # binding found compare certificate hash, if not equals to cert thumbprint update re-add binding
        Write-Host "Vergleiche Hash" -F Green  
        Write-Host "$binding.CertificateHash"  
        if (!$binding.CertificateHash -or [Bitconverter]::ToString($binding.CertificateHash).replace("-","") -ne $cert.Thumbprint){    
            write-host "Updating IIS binding to new certificate." -f Green    
            Remove-IISSiteBinding -Name $sitename -BindingInformation $binding.bindingInformation -Protocol https -Confirm:$false
            New-IISSiteBinding -Name $sitename -BindingInformation $bindinginfo -Protocol https -CertificateThumbPrint $cert.Thumbprint  -CertStorelocation $certlocation
        }
    }

Das Write.Host von $binding.CertificateHash ergibt *:83:.CertificateHash
14260433693
14260433693 10.09.2024 aktualisiert um 15:08:39 Uhr
Goto Top
Write-Host "$binding.CertificateHash"
Sowas geht ja auch nicht wenn dann so
write-host "$($binding.CertficateHash)"  
Besser so falls es irgendeinen Inhalt hat
$binding.CertficateHash.gettype()

Es wird ja auch nur gebunden wenn der Hash zum Cert aus dem Store anders ist oder leer! Klappt hier wie oben ersichtlich einwandfrei. Fehler liegt nun auf deiner Seite.

Bitte immer leere Konsolen benutzen, keine ISE!
adminst
adminst 10.09.2024 um 15:12:38 Uhr
Goto Top
Scheint leer zu sein.
Die Frage warum
14260433693
14260433693 10.09.2024 aktualisiert um 15:25:12 Uhr
Goto Top
Works as designed, hier mein Test.

Erst extra mal testweise ein https Binding ohne Zertifikat erstellt, dann das Skript angewendet und hinterher wieder abgefragt, ergo Cert wurde erfolgreich eingebunden und mit neuer Bindung hinzugefügt face-smile.

screenshot

Die Frage warum
Keine cleanen Konsolen verwendet. Der IIS ist da zickig.

Me out, muss jetzt aussteigen sonst fährt mir der Anschluss weg ...🖖
adminst
adminst 10.09.2024 um 16:39:18 Uhr
Goto Top
Hallo @14260433693
Ich schaue es mir an, ich denke wie du, dass das Zünglein an der Wage noch bei uns liegt.

Vielen herzlichen Dank für deine Arbeit
adminst