Meine ersten Deployments · 6.10
Custom Deployment
Auf dieser Seite
Ab der Enterprise-Edition können Sie Zertifikate mit eigenen PowerShell-Skripten auf Ziele verteilen, die TLSPilot nicht nativ unterstützt; die Skripte können auch andere Tools aufrufen, zum Beispiel um sich per SSH mit einem Linux-Server zu verbinden. Beispielskripte für Deployments und Health-Checks finden Sie unter %ProgramData%\iTrain\TLSPilot\Examples\Custom Deployment Script Examples, für FortiGate, Cisco ASA, Cisco FDM und Caddy, jeweils mit einem Deployment-Skript und einem Health-Check-Skript, dazu ein Health-Check-Skript, das den Thumbprint vergleicht. Die Beispiele werden ohne Support bereitgestellt. Für ein Custom Deployment lässt sich jeder Credential-Typ verwenden, für Appliances typischerweise Custom / other. Dieses Beispiel verteilt ein Zertifikat auf Caddy auf einem Linux-Server.
Das Skript läuft auf dem Management-Host unter dem TLSPilot-Dienstkonto, nicht über WinRM; jedes Modul oder Tool, das es verwendet, zum Beispiel ein SSH-Modul, muss deshalb für dieses Konto verfügbar sein. Die Zertifikatsdateien für das Skript werden in einen temporären Ordner geschrieben, der nur existiert, solange das Skript läuft.

- Klicken Sie auf dem Dashboard auf die Kachel Credentials, um den Credentials Manager zu öffnen, und erstellen Sie wie in Kapitel Nginx beschrieben ein SSH-Credential für das Ziel, vorzugsweise mit einem privaten Schlüssel.
- Stellen Sie wie in Kapitel Meine ersten Zertifikate beschrieben ein Zertifikat von einem beliebigen Aussteller aus, zum Beispiel «caddy.tlspilotlab.com». Schalten Sie im Schritt Deployments den Schalter Automatic deployment ein und klicken Sie auf Add…
- Linked service: Wählen Sie Custom Deployment am Ende der Liste.
- Display name, Target host und Credential: Geben Sie einen Namen für das Deployment und den Namen oder die IP-Adresse des Servers ein und wählen Sie das Credential aus Schritt 1. Braucht Ihr Skript den privaten Schlüssel als Encrypted PEM, geben Sie dafür unter Key password ein Passwort ein.
- Shell: Wählen Sie Windows PowerShell oder PowerShell 7 (pwsh). Wird pwsh.exe nicht gefunden, verwendet TLSPilot Windows PowerShell.

- Deployment Script: Geben Sie das Skript ein, das das Zertifikat verteilt. TLSPilot stellt die Variablen $Cert, $Target und $Cred bereit, siehe Kapitel Variablen in eigenen Skripten. Das Deployment schlägt fehl, wenn das Skript mit einem Code ungleich null endet, einen Fehler auslöst oder seine letzte Ausgabe
$falseist. Text, der vor diesem$falseausgegeben wird, erscheint im Ergebnis und in der Historie und ändert die Entscheidung nicht. Das Skript darf bis zu 300 Sekunden laufen; danach stoppt TLSPilot es, und das Deployment schlägt mit Custom script timed out after 300s fehl.- Bisheriges Zertifikat (optional): TLSPilot kann das Ziel eines Custom Deployments nicht selbst lesen. Um das Zertifikat zu melden, das Ihr Skript ersetzt hat, geben Sie mit
Write-Outputdie ZeilePREVIOUS|<thumbprint>aus, zum BeispielWrite-Output "PREVIOUS|$oldThumbprint". TLSPilot zeigt es als Previous thumbprint im Ergebnis, in der Historie und in der Alert-Mail. Ohne diese Zeile entfällt die Zeile Previous thumbprint. Es zählt die erste Zeile, die mitPREVIOUS|beginnt; die Zeile wird nur beim Deployment-Skript ausgewertet.
- Bisheriges Zertifikat (optional): TLSPilot kann das Ziel eines Custom Deployments nicht selbst lesen. Um das Zertifikat zu melden, das Ihr Skript ersetzt hat, geben Sie mit

- Health Check Script: Optional geben Sie ein Skript ein, das prüft, ob das Zertifikat verwendet wird. Es kann dieselben Variablen wie das Deployment-Skript verwenden. TLSPilot wertet die letzte Ausgabe des Skripts aus:
$truebedeutet Healthy,$falsebedeutet Unknown. Eine mitWrite-Outputausgegebene ZeileHEALTH|Status|Message, zum BeispielHEALTH|Drift|Old certificate bound, setzt diesen Status und diese Meldung; bei Drift verteilt der tägliche Zyklus das Zertifikat erneut. Status ist Healthy, Drift, Unknown, Unreachable oder Skipped. Optional ergänzen Sie als viertes Feld den auf dem Ziel gelesenen Thumbprint, zum BeispielHEALTH|Healthy|Bound|<thumbprint>. Die ersteHEALTH|-Zeile hat Vorrang vor$trueoder$false. Das Skript darf bis zu 75 Sekunden laufen. Läuft es in einen Timeout, endet es mit einem Code ungleich null, löst es einen Fehler aus oder endet es ohne$true,$falseoder eineHEALTH|-Zeile, wird das Ziel als nicht erreichbar gemeldet. Ist das Feld leer, kann TLSPilot auf diesem Ziel keinen Drift erkennen: Der tägliche Zyklus verteilt das Zertifikat, wenn das Ziel nicht das aktuelle Zertifikat hat, und überspringt es sonst. Der Tab des Deployments weist darauf hin.

- Klicken Sie auf OK, schliessen Sie die übrigen Schritte wie in Kapitel Meine ersten Zertifikate beschrieben ab und stellen Sie das Zertifikat mit Issue now aus.
TLSPilot stellt das Zertifikat aus, führt Ihr Deployment-Skript aus und prüft die Health mit Ihrem Health Check Script. Schlägt das Deployment fehl, zeigt das Ergebnis die Zeile des Skripts, die den Fehler verursacht hat. Um das Skript zu korrigieren, doppelklicken Sie im Tab Deployments des Zertifikats auf das Deployment, nehmen Ihre Änderungen vor und klicken auf OK und Save. Klicken Sie danach mit der rechten Maustaste auf das Zertifikat, wählen Sie Deploy… und bestätigen Sie mit Deploy. Dieses Deployment läuft sofort, unabhängig davon, ob das Zertifikat erneuert wurde. Da das Deployment von Ihrem Skript abhängt und Test (dry run)… für Custom Deployments nicht verfügbar ist, prüfen Sie auf dem Zielsystem, ob das Zertifikat verwendet wird.

Variablen in eigenen Skripten
Im Deployment-Skript und im Health Check Script stehen die folgenden Variablen zur Verfügung:
| Variable | Inhalt |
|---|---|
| $Cert.PfxPath | Pfad des Zertifikats als PFX-Datei |
| $Cert.PfxPassword | Passwort der PFX-Datei, als SecureString |
| $Cert.PfxBase64, $Cert.PfxBytes | Die PFX-Datei als Base64-String oder als Byte-Array |
| $Cert.PemCertificate | Zertifikat mit vollständiger Kette im PEM-Format, identisch mit $Cert.PemFullchain; für nur das Leaf-Zertifikat verwenden Sie $Cert.PemLeaf |
| $Cert.PemPrivateKey | Privater Schlüssel im PEM-Format |
| $Cert.PemBundle | Vollständige Kette und privater Schlüssel, wie ausgestellt |
| $Cert.PemLeaf | Nur das Leaf-Zertifikat |
| $Cert.PemFullchain | Vollständige Kette |
| $Cert.PemKeyPkcs1, $Cert.PemKeyPkcs8 | Privater Schlüssel im Format PKCS #1 oder PKCS #8. Die PKCS-#1-Eigenschaften sind bei ECC-Schlüsseln $null. |
| $Cert.PemKeyEncrypted | Privater Schlüssel, verschlüsselt mit dem Key password ($null, wenn kein Key password gesetzt ist) |
| $Cert.PemBundlePkcs1, $Cert.PemBundlePkcs8, $Cert.PemBundleEncrypted | Vollständige Kette und privater Schlüssel im Format PKCS #1, PKCS #8 oder verschlüsselt |
| $Cert.PemLeafBundle, $Cert.PemLeafBundlePkcs1, $Cert.PemLeafBundlePkcs8, $Cert.PemLeafBundleEncrypted | Leaf-Zertifikat und privater Schlüssel, wie ausgestellt oder im Format PKCS #1, PKCS #8 oder verschlüsselt |
| $Cert.PemCertPath, $Cert.PemKeyPath, $Cert.PemKeyPkcs1Path, $Cert.PemBundlePath | Pfade temporärer Dateien mit dem PEM-Inhalt (fullchain.pem, privkey.pem, privkey-pkcs1.pem, bundle.pem). Zu jeder PEM-Eigenschaft gibt es eine passende *Path-Eigenschaft, zum Beispiel $Cert.PemLeafPath, $Cert.PemKeyPkcs8Path oder $Cert.PemLeafBundleEncryptedPath. Für eine nicht vorhandene Variante ist die *Path-Eigenschaft ein leerer String. |
| $Cert.Thumbprint, $Cert.CommonName | Thumbprint und Common Name des Zertifikats |
| $Cert.CertificateId, $Cert.TargetName, $Cert.CredentialTarget | TLSPilot-ID des Zertifikats, Anzeigename des Deployment-Ziels und Name des gewählten Credentials |
| $Cert.Settings | Einstellungen dieses Deployments als Hashtable, zum Beispiel host, shell und commonName, ohne die Skriptinhalte |
| $Cert.Settings.keyPassword | Key password dieses Deployments als String, sofern eines gesetzt ist. Es schützt $Cert.PemKeyEncrypted und ist unabhängig von $Cert.PfxPassword, dem Passwort der PFX-Datei. |
| $Target.Host | Zielhost, ohne Port. Definieren Sie bei Bedarf im Skript einen Port. |
| $Cred | Gewähltes Credential. $null, wenn kein Credential gewählt ist. |
| $Cred.Name | Name des Credentials |
| $Cred.Kind | Art des Credentials, zum Beispiel ssh, winrm oder custom |
| $Cred.Username | Benutzername des Credentials |
| $Cred.Secret | Secret des Credentials, als SecureString. Das Secret ist nur verfügbar, solange das Skript läuft, und wird nicht in den Einstellungen gespeichert. |
| $Cred.PSCredential | PSCredential mit Benutzername und Secret, für Cmdlets mit einem Parameter -Credential. $null, wenn das Credential keinen Benutzernamen hat. |
Zusätzlich stehen Aliasse zur Verfügung: $Certificate, $TargetHost, $Credential, $PfxPath, $Thumbprint, $PemCertPath, $PemKeyPath, $PemBundlePath und $CredentialTarget.
Rückgabewerte des Health Check Script: TLSPilot setzt die Health des Ziels anhand der Ausgabe des Skripts.
| Ausgabe des Skripts | Health |
|---|---|
| $true | Healthy |
| $false | Unknown. Der Zyklus verteilt nicht und löst eine Deploy-Warnung aus. |
| HEALTH|<Status>|<Message>[|<Thumbprint>] | Setzt die Health auf Status, mit der Message. Jeder andere Status gilt als Unreachable. Das optionale vierte Feld ist der Thumbprint, den die Prüfung auf dem Ziel gelesen hat. Die erste Zeile HEALTH| hat Vorrang vor $true und $false. |
| HEALTH|Healthy|<Message> | Das Ziel hat das aktuelle Zertifikat. |
| HEALTH|Drift|<Message> | Das Ziel hat nicht das aktuelle Zertifikat. Der Zyklus verteilt das Zertifikat erneut. |
| HEALTH|Unknown|<Message> | Der Zustand liess sich nicht bestimmen. Der Zyklus verteilt nicht und löst eine Deploy-Warnung aus. |
| HEALTH|Unreachable|<Message> | Das Ziel oder die Prüfung war nicht erreichbar. |
| HEALTH|Skipped|<Message> | Die Prüfung wurde nicht durchgeführt. |
| throw, Exit-Code ungleich null, Timeout (75 Sekunden), kein Boolean und keine Zeile HEALTH| | Unreachable |
| Leeres Health Check Script | Skipped. TLSPilot kann keinen Drift erkennen. Der tägliche Zyklus verteilt auf das Ziel, wenn es nicht das aktuelle Zertifikat hat, und überspringt es, wenn es dieses hat. |