Met Certify the web (lets encrypt) is het mogelijk om certificaten automatisch te vernieuwen. Werkt prima voor IIS, maar de certificaten op de Business Central services moeten ook vernieuwd worden. Dat kun je natuurlijk handmatig doen, maar het is ook te scripten. 

Wat onderstaand script doet is de thumbprint van het certificaat wat op IIS wordt gebruikt uitlezen. Daarna wordt de thumbprint van de Business Central service bekeken, en alleen als dat anders is, wordt de thumbprint vervangen.Tegelijkertijd wordt het oude certificaat verwijderd van de webservicepoort, en de nieuwe toegevoegd.

Alleen de services genoemd in $Serverinstances worden aangepast, maar hou er rekening mee dat die ook worden herstart.

Je kunt het script laten uitvoeren vanuit certifytheweb, maar je kunt 'm ook handmatig draaien, of via de windows task scheduler.

 (2023-11-30: script aangepast zodat het ook werkt met oudere versies van BusinessCentral/NAV)

 

 

Start-Transcript -path $env:temp\Nav-checkandchangecertificate.log -append

$ServerInstances="DynamicsNAV100_NUP","Dynamics_NAV2017_NUP"
$IISPort=443
$WebServicesPorts=7147,7148

Function Get-NavServerConfigurationAlt {
param ($ServerInstance, $Keyname)
$AllSettings = Get-NavServerConfiguration $ServerInstance

foreach ($Setting in $allsettings) {
if ($Setting.key -eq $Keyname) {
$Value = $Setting.value
break
}
}
return $Value
}

 

if (($serverInstances).count -eq 1) {
$ServerInstance=$ServerInstances
} else {
$ServerInstance=$ServerInstances[0]
}

$ServiceLocation = (get-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Services\MicrosoftDynamicsNAVServer`$$serverinstance).ImagePath
if ($Servicelocation.indexof('"') -ge 0) {
$ServiceLocation = $ServiceLocation.split('"')[1]
}
$ServiceLocation = Split-path -path $ServiceLocation
if ([string]::IsNullOrWhitespace($ServiceLocation)) {
write-host "Could not locate $ServerInstance"
$ServerInstance = ""
return
}
Import-Module -name "$ServiceLocation\navadmintool.ps1"
Import-Module WebAdministration

$siteThumbprint = (Get-ChildItem IIS:SSLBindings | ? port -eq $IISPort).thumbprint
Write-host "Thumbprint found in IIS on port ${IISPort}:${SiteThumbPrint}"
if ([string]::IsNullOrWhitespace($SiteThumbprint)) {
"No certificate found on port $IISPort"
return
}

foreach ($ServerInstance in $ServerInstances) {
$ServerThumbprint = ""
$ServerThumbprint = (Get-NavServerconfigurationAlt -ServerInstance $ServerInstance -keyname ServicesCertificateThumbPrint)
write-host "Thumbprint found on ${ServerInstance}:${ServerThumbprint}"
if ($ServerThumbprint -ne $siteThumbprint -and (!([string]::IsNullOrWhitespace($ServerThumbPrint))) ) {
write-host "Changing certificate on BC service $ServerInstance"
set-navserverconfiguration -ServerInstance $ServerInstance -KeyName ServicesCertificateThumbPrint -KeyValue $siteThumbprint
foreach ($WebServicePort in $WebServicesPorts) {
netsh.exe http delete sslcert ipport=0.0.0.0:$WebServicePort
netsh.exe http add sslcert ipport=0.0.0.0:$WebServicePort certhash=$siteThumbPrint appid="{00112233-4455-6677-8899-AABBCCDDEEFF}"
}
Write-host "Restarting service"
Restart-NAVServerInstance -ServerInstance $ServerInstance
} else {
write-host "No change necessary"
}
}
Stop-Transcript