mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-25 22:54:57 +02:00
Powershell example to validate the certificate
I updated the powershell example to compare the server certificate with a local stored certificate.
This commit is contained in:
parent
b6e0abc64c
commit
902b330141
@ -2658,50 +2658,118 @@ go build icinga.go
|
|||||||
|
|
||||||
#### Example API Client in Powershell <a id="icinga2-api-clients-programmatic-examples-powershell"></a>
|
#### Example API Client in Powershell <a id="icinga2-api-clients-programmatic-examples-powershell"></a>
|
||||||
|
|
||||||
Requires Windows 10+ with Powershell 5+.
|
This example compares the given certificate with the certificate from icinga2 for a trusted connection.
|
||||||
|
More info: https://stackoverflow.com/a/58494718/9397788
|
||||||
|
|
||||||
|
Invoke-RestMethod with PUT is buggy with Powershell 3.0. So we need at least Powershell 4.0.
|
||||||
|
https://stackoverflow.com/questions/18278977/powershell-v3-invoke-restmethod-headers
|
||||||
|
|
||||||
Note: The workaround for self signed certificates is not considered
|
|
||||||
best practice.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# Workaround for self signed certificates
|
$icingaApiHost = "icinga.master.local"
|
||||||
# https://stackoverflow.com/questions/36456104/invoke-restmethod-ignore-self-signed-certs
|
$IcingaApiPort = 5665
|
||||||
if (-not("dummy" -as [type])) {
|
$icingaApiUser = "root"
|
||||||
add-type -TypeDefinition @"
|
|
||||||
using System;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Security;
|
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
|
|
||||||
public static class Dummy {
|
|
||||||
public static bool ReturnTrue(object sender,
|
|
||||||
X509Certificate certificate,
|
|
||||||
X509Chain chain,
|
|
||||||
SslPolicyErrors sslPolicyErrors) { return true; }
|
|
||||||
|
|
||||||
public static RemoteCertificateValidationCallback GetDelegate() {
|
|
||||||
return new RemoteCertificateValidationCallback(Dummy.ReturnTrue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"@
|
|
||||||
}
|
|
||||||
|
|
||||||
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = [dummy]::GetDelegate()
|
|
||||||
|
|
||||||
$icingaApiHost = "localhost"
|
|
||||||
$icingaApiUser = "root"
|
|
||||||
$icingaApiPassword = "icinga"
|
$icingaApiPassword = "icinga"
|
||||||
|
|
||||||
$requestUrl = "https://{0}:5665/v1/objects/services" -f $icingaApiHost
|
$requestUrl = "https://{0}:{1}/v1/objects/services" -f $icingaApiHost,$IcingaApiPort
|
||||||
|
|
||||||
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $icingaApiUser, $icingaApiPassword)))
|
|
||||||
$httpAuthInfo = "Basic $base64AuthInfo"
|
# Put the certificate from your master (/etc/icinga2/pki/*.crt) here.
|
||||||
$httpAcceptInfo = "application/json"
|
# You will get it with "openssl s_client -connect <master>:5665" too.
|
||||||
|
|
||||||
|
$cert64=@"
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIE5TCCAs2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAlJY2lu
|
||||||
|
Z2EgQ0EwHhcNMTYwNzA3MDYxOTM4WhcNMzEwNzA0MDYxOTM4WjAiMSAwHgYDVQQD
|
||||||
|
DBdpY2luZ2EuZXh0ZXJuMS56bXQuaW5mbzCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
||||||
|
ADCCAgoCggIBAJ2/ufxCb1m8PbUCxLkZqZNLxZ/vpulOcKmOGYm6VBWbOXQA50on
|
||||||
|
IewnMRUDGF9DHajLk1nyUu1TyKxGzBbja+06/kVd/8Muv0MUNF6iC1U3F3h0W9da
|
||||||
|
kk5rK1L+A534csHCFcG3dZkbdOMrh5hy4kMf9c2FEpviL54Fo4e+b3ZJFA6rv5D9
|
||||||
|
7LzaxfLcsMwXIZ/WRnxjjfnA+RenHeYLlNM8Uk3vqI6tBc1qpFzFeRWMbclFzSLN
|
||||||
|
5x+J6cuyFjVi+Vv8c6SU6W3ykw8Vvq1QQUixl9lwxqNJNsWWfGR8ycmFiv1ZYxiu
|
||||||
|
HpmuLslExZ2qxdGe/raMBEOGgVsUTDZNyTm/9TxgOa3m9cv3R0YIFUmfoBQ3d51S
|
||||||
|
wburJG2eC0ETpnt0TptwMdTfL+HYVWB71djg2Pb8R3vldnhFVpy9vyx3FyHoN7ZQ
|
||||||
|
h7+r6HK2jpwWo7/jK9ExpglVoV8vUbNYqXiA/lZGEkT3YLwTyUhqXKei3Xu2CGGR
|
||||||
|
UId6fAj6OWk9TLW+OaR9BcS74mpiTWNDlbEP+/LQnUhte8scX5cSqBzy4vpuG1G+
|
||||||
|
NGDbYcG4xn6Pc6qt/QddKU/pB/GbJv9SlHU8SjSt09oG9GtuXVjPoZX5msi3NmMy
|
||||||
|
DpAcab5Lx4MgOS/GwRLRI3IjZ3ZK+UkLvRgesSH5/JPUIgfTdr/Eg5dVAgMBAAGj
|
||||||
|
NDAyMAwGA1UdEwEB/wQCMAAwIgYDVR0RBBswGYIXaWNpbmdhLmV4dGVybjEuem10
|
||||||
|
LmluZm8wDQYJKoZIhvcNAQELBQADggIBAEpEJt35KZuvDzU/xrVaVC3ct6CHmXOh
|
||||||
|
DDj5PdwkYtO0vw9WE7aVc88Fs6uhW2BxFkLvm7TpJ6g05egtBozHYrhTEir/fPna
|
||||||
|
rVAD9wEQU6KuSayeToXlgWhKDRAAv1lrQwU4xAAdJP8faxQGc7nAwN/h0g14UTmU
|
||||||
|
LSkyJU4a+1SkEUOs2YCq9vChS3MowO+6I35e98dIA1swHLeQ/QJowspODQvi6pGX
|
||||||
|
VH8FaaqfGwhv+gMwDoAW9hB74VZXO8I3mueZUccPiJXlaojx5hpaHRNRvpdBPclA
|
||||||
|
HHLRQniEOkai2Wg2cft/wq6/fYLE/yv5ej15MNyt3Wjj41DEK5B/bvmN/chOrZlv
|
||||||
|
8rh3ek12ngVtXF+Jcmfsij8+hj/IOM6SeELtW+c0KRaPoVR7oR9o6ce/dyfiw6Hv
|
||||||
|
iQsAV6x//kytpRnUY3VAH4QTJzQ5bgz1Cwr6H+cWE2ca4MHCtPYaZnDiOv4b/Yz7
|
||||||
|
97Nrc7QPGewMl0hYeykpLP2hBJldw01NXhztuq1j38vYY38lKCN6v1INUujEUZg7
|
||||||
|
NwgfHUvJmGIE/fwLAvP7do8gf+1MGPEimsgvias5YtDtrEOz7K/oF3Qgk3sepwAz
|
||||||
|
XXlNLnJAY4p0d/sgCCFQnstQMM95X0Y6cfITzkz3HIUcNF2sbvVnn8xHi0TSH/8J
|
||||||
|
tPLHO1xOLz7N
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
"@
|
||||||
|
|
||||||
|
# register callback for comparing the certificate
|
||||||
|
function set-SSLCertificate {
|
||||||
|
param(
|
||||||
|
$Cert
|
||||||
|
)
|
||||||
|
|
||||||
|
if (-not("validateCert" -as [type])) {
|
||||||
|
add-type -TypeDefinition @"
|
||||||
|
using System.Net.Security;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
|
||||||
|
public static class ValidateCert {
|
||||||
|
static X509Certificate2 MyCert;
|
||||||
|
|
||||||
|
public static bool Validate(object sender,
|
||||||
|
X509Certificate cert,
|
||||||
|
X509Chain chain,
|
||||||
|
SslPolicyErrors sslPolicyErrors) {
|
||||||
|
if (MyCert.Equals(cert)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RemoteCertificateValidationCallback GetDelegate(X509Certificate2 Cert) {
|
||||||
|
MyCert = Cert;
|
||||||
|
return new RemoteCertificateValidationCallback(ValidateCert.Validate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"@
|
||||||
|
}
|
||||||
|
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = [validateCert]::GetDelegate($Cert)
|
||||||
|
}
|
||||||
|
|
||||||
|
# convert base64 based certificate to X509 certificate
|
||||||
|
function get-x509 {
|
||||||
|
param(
|
||||||
|
[string]
|
||||||
|
$Cert64
|
||||||
|
)
|
||||||
|
|
||||||
|
$CertBin=[System.Convert]::FromBase64String(($Cert64.Trim(" ") -replace "-.*-",""))
|
||||||
|
|
||||||
|
Write-Host ($Cert64.Trim(" ") -replace "-.*-","")
|
||||||
|
|
||||||
|
[System.Security.Cryptography.X509Certificates.X509Certificate2]$CertBin
|
||||||
|
}
|
||||||
|
|
||||||
|
# Allow TLS 1.2. Old powershell (.net) uses TLS 1.0 only. Icinga2 >2.10 needs TLS 1.2
|
||||||
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
|
||||||
|
|
||||||
|
$SecPass = ConvertTo-SecureString $icingaApiPassword -AsPlainText -Force
|
||||||
|
$Cred = New-Object System.Management.Automation.PSCredential($icingaApiUser, $SecPass)
|
||||||
|
|
||||||
|
$Cert = get-x509 $Cert64
|
||||||
|
set-SSLCertificate $Cert
|
||||||
|
|
||||||
$httpHeaders = @{
|
$httpHeaders = @{
|
||||||
"Authorization" = $httpAuthInfo
|
|
||||||
"Accept" = $httpAcceptInfo
|
|
||||||
"X-HTTP-Method-Override" = "GET"
|
"X-HTTP-Method-Override" = "GET"
|
||||||
|
"accept" = "application/json"
|
||||||
}
|
}
|
||||||
|
|
||||||
$attrs = @( "name", "state", "last_check_result" )
|
$attrs = @( "name", "state", "last_check_result" )
|
||||||
@ -2714,7 +2782,7 @@ $data = @{
|
|||||||
"filter" = $filter
|
"filter" = $filter
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = Invoke-RestMethod -Headers $httpHeaders -Uri $requestUrl -Method "POST" -Body ($data|ConvertTo-Json)
|
$result = Invoke-RestMethod -Uri $requestUrl -Method "POST" -Body (ConvertTo-Json -InputObject $data) -Credential $Cred -ContentType "application/json" -Headers $httpHeaders
|
||||||
|
|
||||||
foreach ($s in $result.results) {
|
foreach ($s in $result.results) {
|
||||||
Write-Host "Service " $s.attrs.name " on Host " $s.joins.host.name "State " $s.attrs.state " Output: " $s.attrs.last_check_result.output
|
Write-Host "Service " $s.attrs.name " on Host " $s.joins.host.name "State " $s.attrs.state " Output: " $s.attrs.last_check_result.output
|
||||||
|
Loading…
x
Reference in New Issue
Block a user