Validasi PowerShell dan Pemberitahuan Kedaluwarsa Sertifikat SSL

Kedaluwarsa sertifikat server yang tidak terduga dapat menyebabkan sejumlah konsekuensi yang tidak menyenangkan bagi klien Anda: ketidakmampuan untuk membuat koneksi yang aman, kesalahan otentikasi, peringatan yang mengganggu di browser, dll. Dalam artikel ini, kami akan menunjukkan cara menggunakan PowerShell untuk memverifikasi validitas sertifikat SSL / TLS di situs jarak jauh, serta berakhirnya sertifikat di toko sertifikat di server dan komputer domain.

Konten:

  • Validasi Nilai Sertifikat SSL di Situs Web Menggunakan PowerShell
  • Cari sertifikat yang kedaluwarsa di toko sertifikat Windows

Validasi Nilai Sertifikat SSL di Situs Web Menggunakan PowerShell

Baru-baru ini, situs https://winitpro.ru/ ditransfer ke protokol HTTPS menggunakan sertifikat SSL gratis dari Mari mengenkripsi. Keunikan sertifikat ini adalah bahwa sertifikat itu dikeluarkan untuk suatu periode 90 hari, setelah itu mereka perlu diperbarui (diperpanjang). Biasanya, pembaruan sertifikat Let's Encrypt dilakukan oleh skrip atau bot khusus di sisi hosting atau server (pada Windows dapat berupa WACS, di Linux Certbot). Tetapi terkadang otomatisasi bisa gagal. Saya ingin memiliki sistem verifikasi dan pemberitahuan saya sendiri tentang berakhirnya sertifikat SSL di situs. Saya menerapkannya di PowerShell. Karena kami memverifikasi sertifikat situs melalui permintaan HttpWeb, Anda tidak memerlukan hak administrator di situs web / server jarak jauh.

Dalam skrip PowerShell berikutnya, Anda perlu menentukan daftar situs tempat Anda ingin memeriksa periode validitas sertifikat, dan juga berapa hari sebelum sertifikat berakhir untuk mulai menampilkan pemberitahuan ($ minCertAge). Sebagai contoh, saya menunjukkan 80 hari.

$ minCertAge = 80
$ timeoutMs = 10000
$ sites = @ (
"https://winitpro.ru",
"https://site1.com/",
"https://site2.ru/"
)
# Nonaktifkan validasi sertifikat
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ situs dalam $ situs)

Host-Tulis Periksa $ situs -f Hijau
$ req = [Net.HttpWebRequest] :: Buat ($ situs)
$ req.Timeout = $ timeoutMs
coba $ req.GetResponse () | Out-Null catch error validasi URL Host-$ $ site ': $ _ -f Red
[datetime] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[int] $ certExpiresIn = ($ certExpDate - $ (get-date)). Hari
$ certName = $ req.ServicePoint.Certificate.GetName ()
$ certThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ certEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ certIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
if ($ certExpiresIn -gt $ minCertAge)
Tulis-Host Sertifikat untuk $ situs akan kedaluwarsa dalam $ certExpiresIn hari [$ certExpDate] -f Green
lain

$ message = "Sertifikat untuk situs $ situs akan kedaluwarsa dalam $ certExpiresIn days"
$ messagetitle = "Perpanjang Sertifikat"
Write-Host $ message [$ certExpDate]. Detail: 'n'nNama sertifikat: $ certName'Cert cap jempol: $ certThumbprint'nTanggal efektif sertifikat: $ certEfectiveDate'nCert penerbit: $ certIssuer -f Red
# tampilkan pemberitahuan pop-up dan kirim surat ke administrator
#ShowNotification $ messagetitle $ message
# Send-MailMessage -Dari [email protected] -Untuk [email protected] -Subyek $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Encoding UTF8

host-host "________________" 'n

Skrip PowerShell ini akan memeriksa sertifikat SSL untuk semua situs dari daftar. Jika sertifikat ditemukan yang kedaluwarsa segera, itu akan disorot dalam peringatan.

Untuk memberi tahu administrator tentang kedaluwarsa sertifikat SSL yang akan datang, Anda dapat menambahkan pemberitahuan sembulan. Untuk melakukan ini, batalkan komentar pada baris ShowNotification $ messagetitle $ message dan tambahkan fungsi:

Function ShowNotification ($ MsgTitle, $ MsgText)
Add-Type -AssemblyName System.Windows.Forms
$ global: balmsg = New-Object System.Windows.Forms.NotifyIcon
$ path = (Dapatkan-Proses -id $ pid) .Path
$ balmsg.Icon = [System.Drawing.Icon] :: ExtractAssociatedIcon ($ path)
$ balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon] :: Peringatan
$ balmsg.BalloonTipText = $ MsgText
$ balmsg.BalloonTipTitle = $ MsgTitle
$ balmsg.Visible = $ true
$ balmsg.ShowBalloonTip (10000)

Anda juga dapat menambahkan peringatan email menggunakan Send-MailMessage..

Akibatnya, jika sertifikat kedaluwarsa atau kedaluwarsa terdeteksi, Anda akan diberi tahu melalui surat dan pesan sembulan.

Tetap membuat tugas penjadwal otomatis yang harus dijalankan 1-2 kali seminggu dan menjalankan skrip PowerShell untuk memeriksa periode validitas sertifikat situs HTTPS (Anda dapat membuat tugas penjadwal untuk meluncurkan file PS1 menggunakan Register-ScheduledTask).

Cari sertifikat yang kedaluwarsa di toko sertifikat Windows

Anda juga mungkin memerlukan skrip yang akan memantau masa berlaku sertifikat yang digunakan untuk layanan kriptografi di server (misalnya, sertifikat pada RDS, Exchange, SharePoint, LDAPS, dll.) Atau komputer pengguna.

Di komputer lokal, Anda bisa mendapatkan daftar sertifikat yang akan segera kedaluwarsa menggunakan perintah Dapatkan-ChildItem -Path cert. Powershell 3.0 memiliki argumen khusus -Kedaluwarsa:

Dapatkan-ChildItem -Path cert: -Recurse -ExpiringInDays 30

Di PowerShell 2.0, perintah serupa terlihat seperti ini:

Dapatkan-ChildItem -Path cert: -Recurse | di mana $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | pilih sidik jari, subjek

Untuk memeriksa hanya sertifikat Anda sendiri, gunakan wadah Cert: \ LocalMachine \ My bukannya root Cert:. Dengan cara ini Anda tidak akan memeriksa sertifikat root Windows dan sertifikat komersial.

Untuk menemukan sertifikat yang kedaluwarsa dalam 30 hari ke depan di semua server dalam domain, Anda dapat menggunakan skrip PowerShell berikut:

$ server = (get-adcomputer -LDAPFilter "(& (objectCategory = computer) (operatingSystem = Windows Server *) (! serviceprincipalname = * MSClusterVirtualServer *) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2)))) "). Nama
$ result = @ ()
foreach ($ server dalam $ server)

$ ErrorActionPreference = "SilentlyContinue"
$ getcert = Invoke-Command -ComputerName $ server Get-ChildItem -Path Cert: \ LocalMachine \ My -Recurse -ExpiringInDays 30
foreach ($ cert dalam $ getcert)
$ result + = New-Object -TypeName PSObject -Property ([dipesan] @
'Server' = $ server;
'Sertifikat' = $ cert.Issuer;
'Kedaluwarsa' = $ cert.NotAfter
)


Write-Output $ hasil

Jadi, Anda akan menerima daftar sertifikat yang kedaluwarsa di server dan Anda akan memiliki cukup waktu untuk memperbaruinya.