This commit is contained in:
Zack Meier
2026-04-15 15:42:41 -05:00
parent 74edcc4d9a
commit 03dba08135
146 changed files with 9119 additions and 1 deletions
+227
View File
@@ -0,0 +1,227 @@
Import-Module HPEiLOCmdlets
$iLOCred = $PrvCred
# Connect to OneView, Get list of servers
Connect-OVMgmt -Hostname itdmdnsyncompt1.nd.gov -Credential $PrvCred -AuthLoginDomain nd.gov -LoginAcknowledge
$AllOVServers = Get-OVServer
$iLOToRenew = @()
ForEach ($OVServer in $AllOVServers) {
Write-Warning -Message ($OVServer.ServerName)
$iLODnsName = $null
$iLODnsName = $OVServer.ServerName.split('.')[0] + "lo.nd.gov"
# is iLO cert about to expire?
$tcp = New-Object Net.Sockets.TcpClient($iLODnsName, 443)
$ssl = New-Object Net.Security.SslStream(
$tcp.GetStream(),
$false,
({ $true }) # accept any cert
)
$ssl.AuthenticateAsClient($iLODnsName)
$cert = New-Object Security.Cryptography.X509Certificates.X509Certificate2 $ssl.RemoteCertificate
$ssl.Dispose()
$tcp.Dispose()
If ( $cert.NotAfter.AddDays(-30) -le (Get-Date) ) {
Write-Warning -Message "Certificate for $iLODnsName expires on $($cert.NotAfter), add to renewal list."
$iLOToRenew += $iLODnsName
}
If ( $cert.subject -notlike "*.nd.gov*") {
Write-Warning -Message "Certificate for $iLODnsName is not a ND.gov cert, add to renewal list."
$iLOToRenew += $iLODnsName
}
}
$iloToRenew = $iLOToRenew | Select-Object -Unique
Write-Verbose -Message "Loop through iLOs to generate CSRs and request certs"
$iLOConnections = ForEach ($iLOFqdn in $iLOToRenew) {
Connect-HPEiLO -Address $iLOFqdn -Credential $iLOCred -DisableCertificateAuthentication
}
# Get-HPEiLOSSLCertificateInfo -Connection $iLOConnections -ov x
Write-Verbose -Message ([string]$iLOConnections.count + " iLO Connections established.") -Verbose
ForEach ($iLOConnection in $iLOConnections) {
Start-HPEiLOCertificateSigningRequest -Connection $iLOConnection `
-CommonName $iloConnection.Hostname `
-Organization "State of North Dakota" `
-Country US `
-City Bismarck `
-State "North Dakota" `
-OrganizationalUnit NDIT
}
Start-Sleep -Seconds 30 ## for some reason iLO needs time to generate a CSR
# set static values while we wait
$RequesterEmail = 'vmware@nd.gov'
$ServerType = "Linux"
$Format = "x509CO"
$OrgId = 8133
$OrderIds = @()
ForEach ($iloConnection in $iLOConnections) {
Write-Verbose -Message "Getting CSR for $($iLOConnection.Hostname)"
$CsrData = $null
While ($CsrData.CertificateSigningRequest -eq $null) {
try {
$CsrData = Get-HPEiLOCertificateSigningRequest -Connection $iLOConnection
}
catch {
Write-Warning -Message "CSR not ready yet for $($iLOConnection.Hostname), waiting 10 seconds."
Start-Sleep -Seconds 10
}
}
$AuthBody = @{
grant_type = 'client_credentials'
client_id = $SectigoAPIKey.UserName
client_secret = $SectigoAPIKey.GetNetworkCredential().Password
}
$AuthBaseAPIUrl = 'https://auth.sso.sectigo.com'
$BaseAPIUrl = 'https://admin.hard.sectigo.com'
$tokenEndpoint = $AuthBaseAPIUrl + '/auth/realms/apiclients/protocol/openid-connect/token'
$tokenResponse = Invoke-RestMethod -Method Post -Uri $tokenEndpoint -ContentType 'application/x-www-form-urlencoded' -Body $AuthBody
$env:SectigoToken = $tokenResponse.access_token
$headers = @{
"Authorization" = "Bearer $env:SectigoToken"
"Content-Type" = "application/json"
}
If ($env:SectigoToken) { Write-Warning -Message ("Sectigo Token Set " + $env:SectigoToken) }
[string]$RequestUrl = $BaseAPIUrl + "/api/ssl/v1/enroll"
$CertType = 2375
$ServerTypeCode = 'Linux'
$EnrollBody = @{
orgId = $OrgId;
certType = $CertType
term = 365;
comments = "iLO Certificate Renewal for $($iloConnection.Hostname)"
serverType = $ServerTypeCode
csr = $CsrData.CertificateSigningRequest
externalRequester = "vmware@nd.gov"
customFields = @(
@{
name = 'ApplicationName'
value = 'Infra-VMware'
}
)
}
$InvokeRestMethodParams = @{
Uri = $RequestUrl
Method = 'Post'
Headers = $headers
Body = ($EnrollBody | ConvertTo-Json -Depth 10)
ContentType = 'application/json'
}
$Response = Invoke-RestMethod @InvokeRestMethodParams #actual enrollment/request
$OrderIds += $Response.sslId
}
<## approval step -- can't approve own requests, need alternate method... auto-approval of some kind?
$ApproveUrl = $BaseAPIUrl + "/api/ssl/v1/approve/${OrderId}"
$ApproveBody = @{
message = 'Approved VMware Auto'
}
$ApproveSplat = @{
Uri = $ApproveUrl
Method = 'Post'
Headers = $headers
Body = ($ApproveBody) | ConvertTo-Json
ContentType = 'application/json'
}
Invoke-RestMethod @ApproveSplat
#>
## download the certificate - the first link email / "Certificate only, PEM encoded"
### re-establish token with Sectigo
$tokenResponse = Invoke-RestMethod -Method Post -Uri $tokenEndpoint -ContentType 'application/x-www-form-urlencoded' -Body $AuthBody
$env:SectigoToken = $tokenResponse.access_token
$headers = @{
"Authorization" = "Bearer $env:SectigoToken"
"Content-Type" = "application/json"
}
$Format = 'x509CO'
ForEach ($OrderId in $OrderIds) {
$Certificate = $null
While ($Certificate.status -ne "Issued") {
$ValidateUrl = "${BaseAPIUrl}/api/ssl/v1/${OrderId}"
$ValidateSplat = @{
Uri = $ValidateUrl
Method = 'Get'
Headers = $headers
}
$Certificate = Invoke-RestMethod @ValidateSplat
}
$CollectUrl = $BaseAPIUrl + "/api/ssl/v1/collect/${OrderId}?format=${Format}"
$CommonName = $Certificate.commonName
$DownloadSplat = @{
Uri = $CollectUrl
Method = 'Get'
Headers = $headers
UseBasicParsing = $true
}
Invoke-WebRequest @DownloadSplat -OutFile "C:\certs\$CommonName-$OrderId.pem"
}
## set new certs on iLOs
$Certs = Get-ChildItem -Path "C:\certs\" -Filter "*.pem"
ForEach ($iLOConnection in $iLOConnections) {
Write-Verbose -Message "Uploading certificate to $($iLOConnection.Hostname)" -Verbose
$CertFileToUse = $Certs | Where-Object { $_.Name -like "$($iLOConnection.Hostname)*" }
$Cert = Get-Content -Path $CertFileToUse.FullName
Import-HPEiLOCertificate -Certificate ($Cert | Out-String) -Connection $iLOConnection -Force
}
ForEach ($iLODnsName in $iLOToRenew) {
# is iLO cert about to expire?
$tcp = New-Object Net.Sockets.TcpClient($iLODnsName, 443)
$ssl = New-Object Net.Security.SslStream(
$tcp.GetStream(),
$false,
({ $true }) # accept any cert
)
$ssl.AuthenticateAsClient($iLODnsName)
$newcert = New-Object Security.Cryptography.X509Certificates.X509Certificate2 $ssl.RemoteCertificate
$ssl.Dispose()
$tcp.Dispose()
$NewCert | select @{n='zSubject'; e={$NewCert.Subject.split(',')[0]}}, NotBefore, NotAfter
}