НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

НСотдавна Ρƒ нас сС постави Π·Π°Π΄Π°Ρ‡Π° Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ срока Π½Π° валидност Π½Π° сСртификатитС Π½Π° Windows ΡΡŠΡ€Π²ΡŠΡ€ΠΈ. ΠšΠ°ΠΊΡ‚ΠΎ сС ΠΈ случи, слСд ΠΊΠ°Ρ‚ΠΎ сСртификатитС няколко ΠΏΡŠΡ‚ΠΈ станаха Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ, ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ отговорният Π·Π° тяхното подновяванС ΠΊΠΎΠ»Π΅Π³Π° бСшС Π² отпуск. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π½Π΅Ρ‰ΠΎ Π½ΠΈ Π½Π°ΠΊΠ°Ρ€Π° Π΄Π° сС замислим ΠΈ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° дСйствамС. Въй ΠΊΠ°Ρ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°ΠΌΠ΅ систСма Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ NetXMS, тя стана основният ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ½ΠΎ СдинствСн ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ Π·Π° Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π°.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ слСдната информация:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

А самият процСс ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ.

Π”Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ. Π’ NetXMS няма Π²Π³Ρ€Π°Π΄Π΅Π½ брояч Π½Π° ΠΈΠ·Ρ‚ΠΈΡ‡Π°Ρ‰ΠΈ сСртификати, Π·Π°Ρ‚ΠΎΠ²Π° трябва Π΄Π° създадСм свой ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ скриптовС Π΄Π° осигурим Π΄Π°Π½Π½ΠΈ Π·Π° Π½Π΅Π³ΠΎ. Π Π°Π·Π±ΠΈΡ€Π° сС, Π½Π° Powershell, всС ΠΏΠ°ΠΊ Ρ‚ΠΎΠ²Π° Π΅ Windows. Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ трябва Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ всички сСртификати Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма, Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ срока ΠΈΠΌ Π½Π° валидност Π² Π΄Π½ΠΈ ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ Ρ‚ΠΎΠ²Π° число Π½Π° NetXMS. Π§Ρ€Π΅Π· нСговия Π°Π³Π΅Π½Ρ‚. ΠžΡ‚ Π½Π΅Π³ΠΎ ΠΈ Ρ‰Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡŠΡ€Π²ΠΈ, Π½Π°ΠΉ-простият. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ броя Π΄Π½ΠΈ Π΄ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ Π½Π° срока Π½Π° валидност Π½Π° сСртификата с Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠ° Π΄Π°Ρ‚Π°.

Π—Π° Π΄Π° Π·Π½Π°Π΅ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ NetXMS Π·Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° нашия потрСбитСлски ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€, Ρ‚ΠΎΠΉ трябва Π΄Π° Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΎΡ‚ Π°Π³Π΅Π½Ρ‚Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Ρ‚ΠΎΠ·ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π³ΠΎ няма. Π—Π°Ρ‚ΠΎΠ²Π° Π² конфигурационния Ρ„Π°ΠΉΠ» Π½Π° Π°Π³Π΅Π½Ρ‚Π° nxagentd.conf добавямС Ρ€Π΅Π΄ с ΠΈΠΌΠ΅ Π½Π° външСн ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ HTTPS.CertificateExpireDateSimple, Π² ΠΊΠΎΠΉΡ‚ΠΎ записвамС стартиранСто Π½Π° скрипта:

ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"

ΠšΠ°Ρ‚ΠΎ сС ΠΈΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ сС стартира ΠΏΠΎ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°, Π½Π΅ трябва Π΄Π° забравямС Π·Π° Execution Policy, Π° ΡΡŠΡ‰ΠΎ ΠΈ Π΄Π° Π½Π΅ Π·Π°Π±Ρ€Π°Π²ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ β€ž-NoLogo -NoProfile -NonInteractiveβ€œ, ΠΊΠΎΠΈΡ‚ΠΎ пропуснах Π·Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π° чСтимост Π½Π° ΠΊΠΎΠ΄Π°.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ конфигурацията Π½Π° Π°Π³Π΅Π½Ρ‚Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚Π°ΠΊΠ°:

#
# NetXMS agent configuration file
# Created by agent installer at Thu Jun 13 11:24:43 2019
#
 
MasterServers = netxms.corp.testcompany.ru
ConfigIncludeDir = C:NetXMSetcnxagentd.conf.d
LogFile = {syslog}
FileStore = C:NetXMSvar
SubAgent = ecs.nsm
SubAgent = filemgr.nsm
SubAgent = ping.nsm
SubAgent = logwatch.nsm
SubAgent = portcheck.nsm
SubAgent = winperf.nsm
SubAgent = wmi.nsm
 
ExternalParameter = HTTPS.CertificateExpireDateSimple: powershell.exe -File "servershareNetXMS_CertExpireDateSimple.ps1"

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ конфигурацията ΠΈ Π΄Π° рСстартиратС Π°Π³Π΅Π½Ρ‚Π°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π° ΠΎΡ‚ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π½Π° NetXMS: ΠΎΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ конфигурацията (Edit agent’s configuration file), Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅, ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ Save & Apply, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ сС случи ΡΡŠΡ‰ΠΎΡ‚ΠΎ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ конфигурацията ΠΎΡ‚Π½ΠΎΠ²ΠΎ (Poll > Configuration), Π°ΠΊΠΎ няматС сили Π΄Π° Ρ‡Π°ΠΊΠ°Ρ‚Π΅. Π‘Π»Π΅Π΄ Ρ‚Π΅Π·ΠΈ дСйствия трябва Π΄Π° сС появи Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ нашия потрСбитСлски ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€.

Π’ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π½Π° NetXMS ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π² Data Collection Configuration На тСстовия ΡΡŠΡ€Π²ΡŠΡ€, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ наблюдавамС сСртификатитС, създавамС Π½ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ (ΠΏΠΎ-късно, слСд настройка, ΠΈΠΌΠ° смисъл Π΄Π° Π³ΠΎ прСмСстим Π² ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅). Π˜Π·Π±ΠΈΡ€Π°ΠΌΠ΅ HTTPS.CertificateExpireDateSimple ΠΎΡ‚ списъка, Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ описаниС с Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΎ ΠΈΠΌΠ΅, Ρ‚ΠΈΠΏΠ° Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ Π½Π° Integer ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° Π·Π° запитвания. Π—Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΠΎ-ΠΊΡ€Π°Ρ‚ΡŠΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 30 сСкунди. Всичко, Π³ΠΎΡ‚ΠΎΠ²ΠΎ Π΅, засСга Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ.

МоТСм Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ... Π½Π΅, ΠΎΡ‰Π΅ Π΅ Ρ€Π°Π½ΠΎ. Π‘Π΅Π³Π°, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, няма Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½ΠΈΡ‰ΠΎ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ написан. ΠšΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠ²Π° пропусканС. Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Ρ‰Π΅ ΠΈΠ·Π²Π°ΠΆΠ΄Π° просто число, броя Π½Π° Π΄Π½ΠΈΡ‚Π΅, останали Π΄ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° сСртификата. ΠœΠΈΠ½ΠΈΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΎΡ‚ всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° скрипт:

try {
    # ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ всички сСртификати ΠΎΡ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° сСртификатитС
    $lmCertificates = @( Get-ChildItem -Recurse -path 'Cert:LocalMachineMy' -ErrorAction Stop )
     
    # Ако сСртификати няма, Π²ΡŠΡ€Π½ΠΈ "10 Π³ΠΎΠ΄ΠΈΠ½ΠΈ"
    if ($lmCertificates.Count -eq 0) { return 3650 }
 
    # ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π΄Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ Π½Π° всички сСртификати
    $expirationDates = @( $lmCertificates | ForEach-Object { return $_.NotAfter } )
 
    # ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠ°Ρ‚Π° Π΄Π°Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ ΠΎΡ‚ всичкитС
    $minExpirationDate = ($expirationDates | Measure-Object -Minimum -ErrorAction Stop ).Minimum
 
    # ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠ°Ρ‚Π° Π΄Π°Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ Π² Π±Ρ€ΠΎΠΉ оставащи Π΄Π½ΠΈ, Π·Π°ΠΊΡ€ΡŠΠ³Π»ΡΠ²Π°ΠΉΠΊΠΈ Π½Π°Π΄ΠΎΠ»Ρƒ
    $daysLeft = [Math]::Floor( ($minExpirationDate - [DateTime]::Now).TotalDays )
 
    # Π’Ρ€ΡŠΡ‰Π°ΠΌΠ΅ стойността
    return $daysLeft
}
catch {
    return -1
}

ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π° сС Ρ‚Π°ΠΊΠ°:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

723 Π΄Π½ΠΈ, Π΄ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° сСртификата остават ΠΏΠΎΡ‡Ρ‚ΠΈ Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ сСртификатитС Π½Π° тСстовата вСрсия Π½Π° Exchange Π³ΠΈ ΠΏΠΎΠ΄Π½ΠΎΠ²ΠΈΡ… съвсСм наскоро.

Π’ΠΎΠ²Π° бСшС прост Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. МоТС Π±ΠΈ някой Ρ‰Π΅ сС Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΠΈ ΠΈ с Ρ‚Π°ΠΊΡŠΠ², Π½ΠΎ Π½ΠΈΠ΅ искахмС Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅. ΠŸΠΎΡΡ‚Π°Π²ΠΈΡ…ΠΌΠ΅ си Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ списък Π½Π° всички сСртификати Π½Π° ΡΡŠΡ€Π²Π΅Ρ€Π°, ΠΏΠΎΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΈ Π·Π° всСки Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠ»ΠΊΠΎ Π΄Π½ΠΈ остават Π΄ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° сСртификата.

Вторият Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слоТно.

ΠžΡ‚Π½ΠΎΠ²ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΌΠ΅ конфигурацията Π½Π° Π°Π³Π΅Π½Ρ‚Π° ΠΈ Ρ‚Π°ΠΌ вмСсто Ρ€Π΅Π΄Π° с ExternalParameter пишСм Π΄Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈ:

ExternalList = HTTPS.CertificateNames: powershell.exe -File "serversharenetxms_CertExternalNames.ps1"
ExternalParameter = HTTPS.CertificateExpireDate(*): powershell.exe -File "serversharenetxms_CertExternalParameter.ps1" -CertificateId "$1"

Π’ ExternalList ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ просто списък с Π½ΠΈΠ·ΠΎΠ²Π΅. Π’ нашия случай, списък с ΠΈΠΌΠ΅Π½Π° Π½Π° сСртификати. Π’ΠΎΠ·ΠΈ списък ΠΎΡ‚ Π½ΠΈΠ·ΠΎΠ²Π΅ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ със скрипта. Π˜ΠΌΠ΅Ρ‚ΠΎ Π½Π° списъка β€” HTTPS.CertificateNames.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ NetXMS_CertNames.ps1:

#Бписок Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ сСртификатов
$nameTypeList = @(
        [System.Security.Cryptography.X509Certificates.X509NameType]::SimpleName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::DnsName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::DnsFromAlternativeName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::UrlName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::EmailName,
        [System.Security.Cryptography.X509Certificates.X509NameType]::UpnName
)
 
#Π˜Ρ‰Π΅ΠΌ всС сСртификаты, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡
$certList = @( Get-ChildItem -Path 'Cert:LocalMachineMy' | Where-Object { $_.HasPrivateKey -eq $true } )
 
#ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ списку сСртификатов, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ строку "Имя сСртификата - Π”Π°Ρ‚Π° - Thumbprint" ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Ρ‘
foreach ($cert in $certList) {
    $name = '(unknown name)'
    try {
        $thumbprint = $cert.Thumbprint
        $dateExpire = $cert.NotAfter
        foreach ($nameType in $nameTypeList) {
            $name_temp = $cert.GetNameInfo( $nameType, $false)
            if ($name_temp -ne $null -and $name_temp -ne '') {
                $name = $name_temp;
                break;
            }
        }
        Write-Output "$($name) - $($dateExpire.ToString('dd.MM.yyyy')) - [T:$($thumbprint)]"
    }
    catch {
        Write-Error -Message "Error processing certificate list: $($_.Exception.Message)"
    }
}

А Π²Π΅Ρ‡Π΅ Π² ExternalParameter На Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ΄Π°Π΅ΠΌ строки ΠΈΠ· списка ExternalList, Π° Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΡΡŠΡ‰ΠΎΡ‚ΠΎ количСство Π΄Π½ΠΈ Π·Π° всяка. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΅ Thumbprint Π½Π° сСртификата. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ HTTPS.CertificateExpireDate Π² Ρ‚ΠΎΠ·ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π·Π²Π΅Π·Π΄Π° (*). Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ външни ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΈΠΌΠ΅Π½Π½ΠΎ нашия CertificateId.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ NetXMS_CertExpireDate.ps1:

#ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ входящий ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ $CertificateId
param (
    [Parameter(Mandatory=$false)]
    [String]$CertificateId
)
 
#ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° сущСствованиС
if ($CertificateId -eq $null) {
    Write-Error -Message "CertificateID parameter is required!"
    return
}
 
#По Thumbprint ΠΈΠ· строки Π² $CertificateId ΠΈΡ‰Π΅ΠΌ сСртификат ΠΈ опрСдСляСм Π΅Π³ΠΎ Expiration Date 
$certId = $CertificateId;
try {
    if ($certId -match '^.*[T:(?<Thumbprint>[A-Z0-9]+)]$') {
        $thumbprint = $Matches['Thumbprint']
        $certificatePath = "Cert:LocalMachineMy$($thumbprint)"
         
        if (Test-Path -PathType Leaf -Path $certificatePath ) {
            $certificate = Get-Item -Path $certificatePath;
            $certificateExpirationDate = $certificate.NotAfter
            $certificateDayToLive = [Math]::Floor( ($certificateExpirationDate - [DateTime]::Now).TotalDays )
            Write-Output "$($certificateDayToLive)";
        }
        else {
            Write-Error -Message "No certificate matching this thumbprint found on this server $($certId)"
        }
    }
    else {
        Write-Error -Message "CertificateID provided in wrong format. Must be FriendlyName [T:<thumbprint>]"
    }
}
catch {
    Write-Error -Message "Error while executing script: $($_.Exception.Message)"
}

Π’ конфигурацията Π·Π° ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° създавамС Π½ΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€. Π’ Parameter ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ нашия HTTPS.CertificateExpireDate(*) ΠΎΡ‚ списъка ΠΈ, (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!) промСнямС Π·Π²Π΅Π·Π΄ΠΈΡ‡ΠΊΠ°Ρ‚Π° Π½Π° {instance}. Π’Π°Π·ΠΈ Π²Π°ΠΆΠ½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° сС създадС ΠΎΡ‚Π΄Π΅Π»Π΅Π½ брояч Π·Π° всСки инстанс (сСртификат). ΠžΡΡ‚Π°Π½Π°Π»ΠΎΡ‚ΠΎ сС попълва ΠΊΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

Π—Π° Π΄Π° ΠΈΠΌΠ° ΠΎΡ‚ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ броячи, Π½Π° Ρ‚Π°Π±Π° Instance Discovery трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ Agent List ΠΎΡ‚ списъка ΠΈ Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ List Name Π΄Π° напишСм ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° нашия ExternalList ΠΎΡ‚ скрипта β€” HTTPS.CertificateNames.

ΠŸΠΎΡ‡Ρ‚ΠΈ Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ, ΠΌΠ°Π»ΠΊΠΎ Π΄Π° ΠΏΠΎΠΈΠ·Ρ‡Π°ΠΊΠ°ΠΌΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Poll > Configuration ΠΈ Poll > Instance Discovery, Π°ΠΊΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ‡Π°ΠΊΠ°ΠΌΠ΅. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ всички наши сСртификати със сроковС Π½Π° дСйствиС:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

Π’ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва? Π”Π°, само Ρ‡Π΅ Ρ‡Π΅Ρ€Π²Π΅ΠΉΡ‡Π΅Ρ‚ΠΎ Π½Π° ΠΏΠ΅Ρ€Ρ„Π΅ΠΊΡ†ΠΈΠΎΠ½ΠΈΠ·ΠΌΠ° Π³Π»Π΅Π΄Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ Π½Π΅Π½ΡƒΠΆΠ΅Π½ Thumbprint Π² ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° брояча с Ρ‚ΡŠΠΆΠ½ΠΈ ΠΎΡ‡ΠΈ ΠΈ Π½Π΅ позволява Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠ° статията. Π—Π° Π΄Π° Π³ΠΎ нахраня, ΠΎΡ‚Π½ΠΎΠ²ΠΎ отварямС свойствата Π½Π° брояча ΠΈ Π½Π° Ρ‚Π°Π±Π° Instance Discovery Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ β€žInstance discovery filter scriptβ€œ добавямС написания Π½Π° NXSL (Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡ Π΅Π·ΠΈΠΊ Π½Π° NetXMS) скрипт:

instance = $1;
 if (instance ~= "^(.*)s-s[T:[a-zA-Z0-9]+]$")
 {
 return %(true, instance, $1);
 }
 return true;

ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π° Thumbprint:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

А Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΡ‚Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½, Π½Π° Ρ‚Π°Π±Π° General Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Description промСнямС CertificateExpireDate: {instance} Π½Π° CertificateExpireDate: {instance-name}:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

Всичко, накрая Ρ„ΠΈΠ½ΠΈΡˆ ΠΎΡ‚ ΠšΠ”ΠŸΠ’:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

ΠšΡ€Π°ΡΠΎΡ‚Π° Π»ΠΈ?

ΠžΡΡ‚Π°Π½Π° Π΄Π° настроим извСстията, Π·Π° Π΄Π° ΠΈΠ΄Π²Π°Ρ‚ Π½Π° ΠΈΠΌΠ΅ΠΉΠ», ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡΡ€ΠΎΠΊΡŠΡ‚ Π½Π° сСртификата Π΄ΠΎΠ±Π»ΠΈΠΆΠ°Π²Π° логичния си ΠΊΡ€Π°ΠΉ.

1. ΠŸΡŠΡ€Π²ΠΎ трябва Π΄Π° създадСм шаблон Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅ (Event Template) Π·Π° активация ΠΏΡ€ΠΈ намаляванС Π½Π° стойността Π½Π° брояча ΠΏΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΡ‚ нас ΠΏΡ€Π°Π³. Π’ Event Configuration създавамС Π΄Π²Π° Π½ΠΎΠ²ΠΈ шаблона с ΠΈΠΌΠ΅Π½Π°, Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ CertificateExpireDate_Threshold_Activate със статус Warning:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ CertificateExpireDate_Threshold_Deactivate със статус Normal.

2. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π² свойствата Π½Π° брояча ΠΈ Π½Π° Ρ‚Π°Π±Π° Tresholds настройвамС ΠΏΡ€Π°Π³Π°:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

КъдС ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ създадСни ΡΡŠΠ±ΠΈΡ‚ΠΈΡ CertificateExpireDate_Threshold_Activate ΠΈ CertificateExpireDate_Threshold_Deactivate, Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ Π±Ρ€ΠΎΠΉ Π½Π° измСрванията (Samples) 1 (ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π·Π° Ρ‚ΠΎΠ·ΠΈ брояч няма смисъл Π΄Π° Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅), стойност ΠΎΡ‚ 30 (Π΄Π½ΠΈ), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ, настройвамС Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ. Π—Π° сСртификатитС Π² продукция Π·Π°Π΄Π°Π²Π°ΠΌ вСднъТ Π½Π° Π΄Π΅Π½ (86400 сСкунди), Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° сС Π·Π°Ρ‚Ρ€ΡƒΠΏΠ°ΠΌΠ΅ с извСстия (ΠΊΠΎΠ΅Ρ‚ΠΎ, ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, сС случи вСднъТ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ пощСнската кутия сС ΠΏΡ€Π΅ΠΏΡŠΠ»Π½ΠΈ Π·Π° ΠΏΠΎΡ‡ΠΈΠ²Π½ΠΈΡ‚Π΅ Π΄Π½ΠΈ). По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° отстраняванС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈΠΌΠ° смисъл Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 60 сСкунди.

3. Π’ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π½Π° ДСйствиС създавамС шаблон Π·Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚Π΅Π»Π½ΠΎ писмо, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° слСдния:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

Всички Ρ‚Π΅Π·ΠΈ %m, %S ΠΈ Ρ‚.Π½. β€” макроси, Π² ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ поставСни стойности ΠΎΡ‚ нашия ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€. ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация Π·Π° тях Π΅ описана Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ NetXMS.

4. И накрая, обСдинявайки ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π² ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π° Π·Π° ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π‘ΡŠΠ±ΠΈΡ‚ΠΈΡ създавамС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎ ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ сС създава Π°Π»Π°Ρ€ΠΌΠ° ΠΈ Ρ‰Π΅ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° писмо:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

Π—Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π°, всичко, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° тСствамС. Π©Π΅ поставим ΠΏΠΎ-висок ΠΏΡ€Π°Π³ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°. ΠœΠΎΡΡ‚ Π½Π°ΠΉ-близък сСртификат ΠΈΠ·Ρ‚ΠΈΡ‡Π° слСд 723 Π΄Π½ΠΈ, Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π°Π΄Π°Π΄ΠΎΡ… 724. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Ρ‚Π°ΠΊΠ°Π²Π° Π°Π»Π°Ρ€ΠΌΠ°:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

ΠΈ Ρ‚Π°ΠΊΠΎΠ²Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠΌΠ΅ΠΉΠ»:

НаблюдСниС Π½Π° срока Π½Π° сСртификатитС Π² Windows Π½Π° NetXMS

Π‘Π΅Π³Π° Π²Π΅Ρ‡Π΅ наистина Π΅ всичко. МоТСшС, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π΄Π° настроим Ρ‚Π°Π±Π»ΠΎΡ‚ΠΎ, Π΄Π° построим Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Π½ΠΎ Π·Π° сСртификатитС Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ няколко бСзсмислСни ΠΈ скучни ΠΏΡ€Π°Π²ΠΈ Π»ΠΈΠ½ΠΈΠΈ, Π·Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ Π³Ρ€Π°Ρ„ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° процСсора ΠΈΠ»ΠΈ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Но Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎ-късно.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster