Привет, Хабр! Меня зовут Андрей Благов, я архитектор центра профессиональных сервисов и R&D в облачном провайдере T1 Cloud, и сегодня речь пойдет о сертификатах SSL. Добавляйте статью в закладки, она вам точно пригодится. В ней я поделюсь PowerShell-скриптами для проверки действительности SSL-сертификатов.
А если ваш отдел мониторинга не находит на вас время, но перед вами стоит задача автоматизировать рутинные процессы — подписывайтесь на наш блог. В дальнейшем я планирую делиться личным опытом и рассказывать о том, как с помощью PowerShell можно наладить выгрузки отчетов, создавать проверки и оповещения по различным условиям.
SSL-сертификаты нужно проверять регулярно и тщательно. В 2020 году удостоверяющие центры отказались от выпуска двухлетних сертификатов. К сожалению, тогда многие администраторы узнавали об этом не очень своевременно — например, когда при повторном выпуске срок действия вдруг сокращался до года.
Сейчас ситуация еще сложнее. В марте этого года крупные поставщики SSL-сертификатов стали отказывать в выпуске сертификатов для организаций в РФ и РБ. По крайней мере, на данный момент речь идет о GeoTrust, Sectigo, DigiCert, Thawte, Rapid, но к этому списку могут добавиться и другие. Продажа новых и продление уже имеющихся сертификатов для доменов Рунета ограничена.
Проверить, «жив» ли сертификат, владельцу одного-двух ресурсов труда не составит. Но что делать, если вы управляете сразу множеством сервисов? Ниже я приведу четыре PowerShell-скрипта, которые помогут быстро проверить, актуален ли SSL-сертификат (включая проверку по кастомным портам), через сколько дней он истечет, получить информацию об издателе сертификата по цепочке сертификации (Certificate Chain) и возможных проблемах при выпуске/продлении сертификата.
Поскольку теперь все SSL-сертификаты действуют только год, эти скрипты подойдут не только для разовой проверки, но и в качестве инструмента регулярного мониторинга. Стандартные инструменты наподобие Zabbix далеко не всегда умеют делать это «из коробки» и требуют установки отдельных менеджмент-паков / шаблонов и прочих танцев с бубном, на которые не всегда находится время.
Зачем проверять сертификаты
Сначала я хотел бы пояснить, что сейчас вообще происходит с SSL-сертификатами и зачем вам могут понадобиться скрипты ниже. Вот вам несколько фактов о том, как обстоит ситуация сегодня.
1 сентября 2020-го глобальные сертификационные центры прекратили выдачу двухлетних SSL-сертификатов.
С этого момента максимальный срок действия SSL-сертификатов сократился до 398 дней. Подробно углубляться в тему не буду — все уже объяснили здесь. Отмечу, что при повторном выпуске (например, для добавления или замены домена, изменения информации об организации) уже открытого двухлетнего сертификата срок действия нового сокращался до 397 дней, и многие пользователи узнавали об этом не совсем своевременно.
Wildcard-сертификаты подходят не во всех ситуациях.
Сервисы, как правило, запускаются не одновременно (например, в январе вы запустили один, а в феврале — второй), а некоторым из них для полноценной работы требуется, чтобы в расширении, где прописаны DNS-имена, было явно указано имя конкретного узла. Поэтому в ряде случаев требуются сертификаты, у которых в расширении «DNS-имя» перечислены имена узлов.
Обратите внимание на сертификат habr.com — это wildcard, но при этом в DNS явно указано имя:
Этот сертификат подойдет для классических веб-узлов с именами *.habr.com и habr.com, но для сервисов с проверкой имени по расширению DNS — только для узла habr.com.
Последствия санкций.
В связи с текущей геополитической ситуацией зарубежные издающие и корневые сертификационные центры отказываются продлевать сертификаты пользователям из РФ и Белоруссии. Если мы продолжим жить в текущих реалиях, продлить [пока еще актуальные] SSL-сертификаты станет попросту невозможно — удостоверяющий центр откажется это делать.
Что имеем в итоге. У администратора куча сертификатов, которыми нужно управлять:
Отслеживать срок действия сертификата (проверять, сколько дней осталось до его окончания).
Какие имена «закрывает» тот или иной сертификат.
Мониторить, могут ли с сертификатом возникнуть какие-либо проблемы.
При продлении сертификата в том же центре сертификации можно пройти упрощенную процедуру валидации. Если необходимо выпустить сертификат в другом центре сертификации или изменить параметры выпускаемого сертификата, то процедуру валидации нужно будет пройти в полном объеме, а это тоже отнимает время.
Небольшой дисклеймер. Сегодня я покажу, как можно решить эту проблему с помощью четырех PowerShell-скриптов. Конечно, существуют и другие способы проверки SSL-сертификатов, в этой статье я лишь хочу поделиться инструментами, которые удобны именно мне, и показать, как их использовать.
Эти скрипты я написал на базе функции, которую можно свободно найти на просторах интернета. Если упрощенно, работает она следующим образом:
Создаём TCP-соединение с удаленным узлом по заданному порту.
Используя эти параметры, создаем SSL-соединение между нами и удаленным узлом.
Устанавливаем соединение.
После установления соединения получаем данные об удаленном сертификате.
Разбираем данные.
Важно: перед использованием скриптов не забудьте заменить lorem ipsum на реальные данные — подставить нужные доменные имена и порты.
При желании с помощью этих скриптов можно автоматизировать проверку SSL-сертификатов — например, оставив только нужные вам параметры и настроив отправку email’ов с результатами их работы. Под каждым из них я размещу ссылку на скачивание — welcome.
Скрипт #1. Проверяем, кто выдал SSL-сертификат и какие имена закрываются
Какие данные получаем с помощью этого скрипта:
Subject — субъект, которому выдан сертификат;
Issuer — издатель сертификата;
NotBefore — дата выпуска;
NotAfter — дата окончания действия;
DaysLeft — количество оставшихся дней;
DNSNames — DNS-имена, которые закрывает сертификат
В скрипт добавлена возможность проверки оставшегося количества дней валидности сертификата. Также добавлен параметр triggerdays, который задается в количествах дней. После фильтрации вывода по этому параметру получим сертификаты, требующие внимания.
Скрипт №1
#Та самая функция, которую я нашел на просторах интернета
#и немного модифицировал
function get-remotesslcertificate {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]
$ComputerName,
#Порт по умолчанию
[int]
$Port = 443
)
$Certificate = $null
$TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient
try {
$TcpClient.Connect($ComputerName, $Port)
$TcpStream = $TcpClient.GetStream()
$Callback = { param($sender, $cert, $chain, $errors) return $true }
[System.Security.Authentication.SslProtocols]$protocol = "tls12"
$SslStream = New-Object -TypeName System.Net.Security.SslStream -ArgumentList @($TcpStream, $true, $Callback)
try {
$SslStream.AuthenticateAsClient($computername,$null,$protocol,$false)
$Certificate = $SslStream.RemoteCertificate
} finally {
$SslStream.Dispose()
}
} finally {
$TcpClient.Dispose()
}
if ($Certificate) {
if ($Certificate -isnot [System.Security.Cryptography.X509Certificates.X509Certificate2]) {
$Certificate = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $Certificate
}
Write-Output $Certificate
}
}
#Функция на выходе предоставляет нам объект класса #System.Security.Cryptography.X509Certificates.X509Certificate2
#Наша задача — разобрать его на нужные нам данные
#Для примера берем список узлов
#Сделано для удобства вставки текста напрямую из Excel или блокнота
#get list of web sites.
[array]$list = @'
tproger.ru
veeam.com
rambler.ru
qna.habr.com
spb.hh.ru
'@ -split("`r`n")
#Указываем произвольное количество дней, чтобы отслеживать валидность
#trigger days to expire
$triggerdays = 140
#Для удобства формирования вывода задаем подходящий разделитель #списка
#Если вывод вы планируете парсить, в качестве разделителя лучше использовать ;
#set delimiter
$delimiter = "`n"
$report = @()
foreach ($line in $list){
$certificate = get-remotesslcertificate $line
$daysleft = New-TimeSpan -Start (Get-Date) -End $certificate.NotAfter
$report += $certificate | Select-Object Subject,
Issuer,
NotBefore,
NotAfter,
@{label = "DaysLeft";expression={$daysleft.Days}},
@{label = "DNSNames";expression={$_.DnsNameList -join($delimiter)}}
}
#Получаем полный отчет
#full report
Write-Host "Full report" -ForegroundColor Green
Write-Output $report
#Отчет по сертификатам с валидностью меньше $triggerdays дней
#reports with expired certificates
Write-Host "Warning" -ForegroundColor Yellow
$report | Where-Object {$_.DaysLeft -lt $triggerdays}
Если в списке оставить только qna.habr.com, то вывод будет следующим:
Скрипт №2. Проверяем SSL-сертификаты для кастомных портов
Пригодится, если нужно проверить сертификат для сервисов, работающих по кастомным портам (не 443), например, почтовых серверов, работающих по протоколам POP и IMAP, Veeam Cloud Connect и так далее.
Скрипт №2
function get-remotesslcertificate {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]
$ComputerName,
#Порт по умолчанию
[int]
$Port = 443
)
$Certificate = $null
$TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient
try {
$TcpClient.Connect($ComputerName, $Port)
$TcpStream = $TcpClient.GetStream()
$Callback = { param($sender, $cert, $chain, $errors) return $true }
[System.Security.Authentication.SslProtocols]$protocol = "tls12"
$SslStream = New-Object -TypeName System.Net.Security.SslStream -ArgumentList @($TcpStream, $true, $Callback)
try {
$SslStream.AuthenticateAsClient($computername,$null,$protocol,$false)
$Certificate = $SslStream.RemoteCertificate
} finally {
$SslStream.Dispose()
}
} finally {
$TcpClient.Dispose()
}
if ($Certificate) {
if ($Certificate -isnot [System.Security.Cryptography.X509Certificates.X509Certificate2]) {
$Certificate = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $Certificate
}
Write-Output $Certificate
}
}
#формируем коллекцию объектов
#Создаем пустой объект с определенными свойствами
#Далее их заполняем
#Обратите внимание: здесь указываются эндпоинты и кастомные порты #к ним
#get list of endpoints and ports
$list = @()
$site1 = ''| Select-Object endpoint, port
$site1.endpoint = "pop.rambler.ru"
$site1.port = "995"
$list += $site1
$site2 = ''| Select-Object endpoint, port
$site2.endpoint = "imap.rambler.ru"
$site2.port = "993"
$list += $site2
$site3 = ''| Select-Object endpoint, port
$site3.endpoint = "habr.com"
$site3.port = "443"
$list += $site3
#Указываем произвольное количество дней, чтобы отслеживать валидность
#trigger days to expire
$triggerdays = 160
#Для удобства формирования вывода задаем подходящий разделитель #списка
#set delimiter
$delimiter = "`n"
$report = @()
foreach ($line in $list){
$certificate = get-remotesslcertificate $line.endpoint $line.port
$daysleft = New-TimeSpan -Start (Get-Date) -End $certificate.NotAfter
$report += $certificate | Select-Object @{label = "Endpoint"; expression = {"$($line.endpoint):$($line.port)"}},
Subject,
Issuer,
NotBefore,
NotAfter,
@{label = "DaysLeft";expression={$daysleft.Days}},
@{label = "DNSNames";expression={$_.DnsNameList -join($delimiter)}}
}
#Получаем полный отчет
#full report
Write-Host "Full report" -ForegroundColor Green
Write-Output $report
#Отчет по сертификатам с валидностью меньше $triggerdays дней
#reports with expired certificates
Write-Host "Warning" -ForegroundColor Yellow
$report | Where-Object {$_.DaysLeft -lt $triggerdays}
Если в списке оставить только pop.rambler.ru с портом 995, то вывод будет следующим:
Скрипт #3. Получаем цепочку сертификатов
Поможет проверить, есть ли риск отзыва SSL-сертификата.
Как это работает.
С помощью скрипта мы получаем все промежуточные и корневой сертификаты (то есть всю цепочку сертификатов) и имена всех субъектов сертификации. Затем проверяем, есть ли в этой цепочке CA, которые потенциально могут отозвать сертификат или отказать в его продлении. Для этого я собрал список отпечатков SHA1 (они доступны на сайтах удостоверяющих центров) — с ним и будем сравнивать.
Скрипт №3
function get-remotesslcertificate {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]
$ComputerName,
[int]
$Port = 443
)
$Certificate = $null
$TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient
try {
$TcpClient.Connect($ComputerName, $Port)
$TcpStream = $TcpClient.GetStream()
$Callback = { param($sender, $cert, $chain, $errors) return $true }
[System.Security.Authentication.SslProtocols]$protocol = "tls12"
$SslStream = New-Object -TypeName System.Net.Security.SslStream -ArgumentList @($TcpStream, $true, $Callback)
try {
$SslStream.AuthenticateAsClient($computername,$null,$protocol,$false)
$Certificate = $SslStream.RemoteCertificate
} finally {
$SslStream.Dispose()
}
} finally {
$TcpClient.Dispose()
}
if ($Certificate) {
if ($Certificate -isnot [System.Security.Cryptography.X509Certificates.X509Certificate2]) {
$Certificate = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $Certificate
}
Write-Output $Certificate
}
}
#Для примера берем список узлов
#Сделано для удобства вставки текста напрямую из Excel или блокнота
[array]$list = @'
tproger.ru
veeam.com
rambler.ru
qna.habr.com
spb.hh.ru
'@ -split("`r`n")
#Указываем произвольное количество дней, чтобы отслеживать валидность
#trigger days to expire
$triggerdays = 140
#Для удобства формирования вывода задаем подходящий разделитель #списка
#Если вывод вы планируете парсить, в качестве разделителя лучше использовать ;
#set delimiter
$delimiter = "`n"
#Построчно указываем уникальные отпечатки SHA1 тех центров #сертификации, которые могут нас «забанить», чтобы сравнить их с #отпечатками сертификатов всей цепочки
[array]$blockedcas = @'
D4DE20D05E66FC53FE1A50882C78DB2852CAE474
5F43E5B1BFF8788CAC1CC7CA4A9AC6222BCC34C6
0563B8630D62D75ABBC8AB1E4BDFB5A899B24D43
A14B48D943EE0A0E40904F3CE0A4C09193515D3F
F517A24F9A48C6C9F8A200269FDC0F482CAB3089
8E934F88A5A4553336E29B5FB8666048EFAA8240
A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436
DF3C24F9BFD666761B268073FE06D1CC8D4F82A4
7E04DE896A3E666D00E687D33FFAD93BE83D349E
5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25
3CA0E59C4D40ADCCC0B9C48CC6335F544E0A0116
DDFB16CD4931C973A2037D3FC83A4D7D775D05E4
17F3DE5E9F0F19E98EF61F32266E20C407AE30EE
A78849DC5D7C758C8CDE399856B3AAD0B2A57135
97817950D81C9670CC34D809CF794431367EF474
912198EEF23DCAC40939312FEE97DD560BAE49B1
843573112A3B319344E5E4ECABC9F26C7CD54D07
5EEED86FA37C675230642F55C84DDBF67CD33C80
323C118E1BF7B8B65254E2E2100DD6029037F096
8D1784D537F3037DEC70FE578B519A99E610D7B0
039EEDB80BE7A03C6953893B20D2D9323A4C2AFD
91C6D6EE3E8AC86384E548C299295C756C817B81
AADBBC22238FC401A127BB38DDF41DDB089EF012
F18B538D1BE903B6A6F056435B171589CAF36BF2
58D52DB93301A4FD291A8C9645A08FEE7F529282
26A16C235A2472229B23628025BC8097C88524A1
132D0D45534B6997CDB2D5C339E25576609B5CC6
22D5D8DF8F0231D18DF79DB7CF8A2D64C93F6C3A
4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5
3679CA35668772304D30A5FB873B0FA77BB70D54
B218FE6D07952A2207A35AFD5ED8E4991029E336
B60D92FC064D32AF1FEA30FCD85FB0243463A41C
1CB8A708C90D207901A0B2367FF09565E45324FE
5BC5ADE29AA754DA848953A5FED75B4686D05708
D1EEB1E8C09020BAB85D3DE27F78EE33A06CAEDB
87B8E6D38F1A39CD97F04A9E174B3C9EE7EE1115
19A09B5A36F4DD99727DF783C17A51231A56C117
28E96CDB1DBA273FD1A6151BE15F088F26046273
C619BE4F415453F46D020ED79F5D5CA5C37E14AD
59B244F3FF278C039D71CE7334B9D4D0241EC62B
409AA4A74A0CDA7C0FEE6BD0BB8823D16B5F1875
759540EAE3C302BC3E0E2443C1C2E435B52B8E8D
A9D53002E97E00E043244F3D170D6F4C414104FD
FB3A7F7C9DE73060094FB265E376F2CA86DA2340
FC20B60CADAC38D1FF40CF1B6EEF290F10B57ABD
56EE7C270683162D83BAEACC790E22471ADAABE8
60EE3FC53D4BDFD1697AE5BEAE1CAB1C0F3AD4E3
846896AB1BCF45734855C61B63634DFD8719625B
9D1FA05D51AD05BA9E5384C8022D908E8F54CBFC
54F84CF4B56C1A7944E60BDEBB6D4559E14C773C
F3D5B67A7E35A5332BFEB47F4B20CAA2292B4CDB
D6AEE31631F7ABC56B9DE8ABECCC4108A626B104
0753C9D48FE522C8134760A5149D4ED430130317
42857855FB0EA43F54C9911E30E7791D8CE82705
E308F829DC77E80AF15EDD4151EA47C59399AB46
DBC7E90B0DA5D88A5535430EEB665D077859E8E8
771FF8A19D15526B9DBD8934755A73FB23C7278B
E12D2E8D47B64F469F518802DFBD99C0D86D3C6A
92C1588E85AF2201CE7915E8538B492F605B80C6
7E2F3A4F8FE8FA8A5730AECA029696637E986F3F
F7E0F449F1A2594F88856C0758F8E6F627E5F5A2
A031C46782E6E6C662C2C87C76DA9AA62CCABD8E
02EF785428EC5BFBF1C1814FB42F229A0D2A3BAF
1FB86B1168EC743154062E8C9CC5B171A4B7CCB4
2EA5966C9A5B12E1AE7C9674AEFFDDA2222FB22F
F9AE40CCBBDA4795E58AC5D203BFB7BD331B81E8
C242C6785324854E346486DBF286C72FD035F0DD
876217035658B958F359FBA589D630C4042D961B
594F2DD10352C2360138EE35AA906F973AA30BD3
ED6302684A3259AA04F10FE9A97A8FD30B965D26
A399046417B67E320D3EFA69D7DCE6B8BFE8A9F2
7CCC2A87E3949F20572B18482980505FA90CAC3B
8B3C5B9B867D4BE46D1CB5A01D45D67DC8E94082
63B76FFF3B3864EEB549B1E37851D46B603FEDDC
98C6A8DC887963BA3CF9C2731CBDD3F7DE05AC2D
CBFE9EB43B3B37FE0DFBC4C2EB2D4E07D08BD8E8
9E848F52575C6B1A69D6AB62E0288BFAD4A5564E
4DEEA7060D80BABF1643B4E0F0104C82995075B7
C9FEFC763D9548B487696F047ACBA0ABE45C7BC1
090A16F9BA16001B2EC130F80523ESBSEB259158
687D4A4D47014F91217E4A062BBF9D238358943E
B0E6383FBDBFCE5E5F9D7934FAD0FC3C5E030F13
94D8797C449A29A8C7D45D35682E42DE0CD8638C
2471446048AF356F463C9F07D33C148BAEA5C68F
815CD8FF64BEACE07EF8F2F9D533011FA4793658
A3ADF237B25336EB479020491930BA8811A7899F
C43CCBD00E10A1D54E10AABF125D3AAC616560E5
2F7AA2D86056A8775796F798C481A079E538E004
9546387C13B2B9DAC48CBFC35439FE04D04922EE
9BD08A58876F6C849DB6BB99A8B194892647860E
75EAB86219B7A3F79225CCCAD7232C2603E8E9B5
626D44E704D1CEABE3BF0D53397464AC8080142C
1C58A3A8518E8759BF075B76B750D4F2DF264FCD
1D7322B41ED99FDD68511BAB786C8E26E0831B3B
AEC13CDD5EA6A3998AEC14AC331AD96BEDBB770F
9F90F8C8664B09959C2909AC9A78AEA8E26D88E8
C3BD4F375F3F41A5689A79B9C4A9A0ADCC4B30D4
8EA108B3DCF40C7A66050C9202E018CDA8413F9D
96B24A4064B35DC9A8B02BE12515F7CFA65F8885
7B0F360B775F76C94A12CA48445AA2D2A875701C
8F5C0C8E414AF89DBFF272125E28D417EE5FF559
0669D9AE862E9CFE2BA5B488EE72DBDCD4FAD041
231ACD6787B541F5590D943DF258569D7C6A02CE
8FB28DD3CFFA5D286E7C718AA907CB4F9B1767C2
83706D32A3DF8F02C485F8B3112DD2A412BC5799
7C770357099659B40DA4C4BA67785D5423A013C8
D1EB23A46D17D68FD92564C2F1F1601764D8E349
CCAB0EA04C2301D6697BDD379FCD12EB24E3949D
02FAF3E291435468607857694DF5E45B68851868
2AB628485E78FBF3AD9E7910DD6BDF99722C96E5
4D2378EC919539B5007F758F033B211EC54D8BCF
EE869387FFFD8349AB5AD14322588789A457B012
4A65D5F41DEF39B8B8904A4AD3648133CFC7A1D1
E19FE30E8B84609E809B170D72A8C5BA6E1409BD
EDC8ABFC394AB9ACEBAF6A15FFE841F47D7B921A
156EDC13920B58F3AA51EDE9D0B7317C8B4E9948
35D1CFDC14E8952E96C67C4EDE0B8C224943879D
1ACC5F54663D5572385C2F48E275FD25D3DA2120
C8760481F0DD1AD963FE851728ECCA3FB80E0929
3483F728A7B39221CF6781A119AE0C555986378D
F4B492F92F3A80B61C453D60A25DEC19468B37B2
8607CBB3A7F95410ADDDEE2803AD4528D83FEDCE
49100FACE81BC898D14EBC4C6C6149CF437DAA76
0DAD72CC220689F5CA9964AED6828A5F4C5AE159
CF040BAAE6F7C4CAF6B0BA88D7D5D001F4FA0CFD
714FC0240B1C3D6276C52D854F563F848C5995E7
0040A5E5DA9C1808F8F18CDAF1FC20BA1564F6AA
E79280B96086D6098EAEDDCC18C092491EAF0E4E
C23960E01EC0C229BC8A956EB11467E85B0AA4BC
0375861AFB6FCF30971DF32EF9F0DDE2C9BFF9E6
6549DC8CE02648061C67173E21D8B40DE3FDF127
C1671382F156A7BD6AC59FB93641868030A6992A
AB5B666E10F8813F456AE4749F7B57621F01A393
03AC82036F84C5F7305F5047156742CF531FAEA8
8A7EA1413B3BFE6A9E42D21958489BCE6FF5BD1D
61A8256C27F1C0558CA2EF472614910B80EE1A81
2C6F995A6F7B4E968CB1CD66056854FE533F12B5
03E859579E5B0DB2FBA394125B95B31A1A0A1D83
60109CDEB9815C559B55A966179949AEC212B4F8
638D6E6F4F9895FCF6029E560987F366983DB883
1633A19ADAB0931AE6225F7918437A89BE89BE07
3A0D686259DFBF59E530CD83F0D384E1057DAAF6
2AC10596DE0DCC745181A950B2FB23034856198C
03C8B739CAD8F1F737D2CDFB967F039C47D8C7F7
9E3DD94D3A67D2746324D0DDFA3666F42B53DE2B
BABAD141E11CC845DA516E6951FC107A562CA359
736DCC67D3F79F17E1EDCD3A8C9BCFA2F2007E7C
8B8C15B12C0974CE5ECB5B769C36DEA9EB7A7B40
FA41C36C97C8C1B46B0E570DD039733992067070
11955DCF836EA3246A8BD6E9C0D8DE2207B1BAE2
FF2A1B599875EA3C7D2ADAF7F5305272D4419E35
3D76F2A7052EB6341C225B82F8B949DBAEB36D20
EB140CF6C1F0D91CEC3EA625592C16323C17B098
A76EDD88C4D6894594B05391F3C366C9FA251A53
DE43B12A021046C6FE025937AED1F1E7670E2B70
E9D1F79A31277F6490440860F9C8B52C3021B37B
7ED8340BB202EC1D9710739667C7339E4850BFC1
A9122215F3E61BDF92D7B141D424A8DB7EF2818E
7BD4577413CFF214E1162E92E607A05486FECB9B
A006E5747EF1A80D3F58E7A74E03F96D06B8EE66
04027330A596C37D11056ADE58663DD383C3FCE5
743A6ABB22C6229FFFA58B258CB78F627E34D1AE
FA64F9B850FB2B9EF06BA0A50FF00A7CF97E4DC2
D06929EED88A5490F6C0C399149641530541483A
4C310D5DF23019417A7BB7912096295DDC97203C
D7D2737D35787C17A74CDCD03A3BC8943FA360E8
D8CEA9A69B2BE4AC1CD4FE5C9826D07A0EF68DE4
18F68CDBAAF552F2CF24C9479D91315E3914274D
3F4F96931CAB6270FD0FB579A5A2E0E8B94FA19A
9FB8E1DA315B5AFA048C98054F7E610894A2B882
9AE1E01243F70A6248A533D339695ABDBFBC434A
5563708F14E66212E78918EF91BA65FC307D2D44
5BAB80AFBABBCA4F80682F09F5858F9DECA987D2
4D39991934F4C04B4F4A48E3BECA02685F813236
6613D8A7737E3B80368940F7ED5EDA9C98AD110C
BD7321AE088F62EC3E39A539410A2FAFBC9E2637
A02ECF23FD9E2FF3880667B150B3DD030B126751
D2696925D72D40C5BCDB1DB4EA58530FFCD66251
05AF1C5FEA12CB1464BA7A11C4C80B8CDF7A1FC1
96E41C40348B5A0D77BF94DE072B71884A2339CE
EE869387FFFD8349AB5AD14322588789A457B012
314D3912A83D1D9613CAFB4DBBDC23F0CEE7B409
56C9BCD63169B37F188156168E7898403AC642E4
48E539175C9D3F4547133A653BE2FF6BCC735C2D
B1811371FC6966BCCA4E10729454FFEF4C14BDC3
16EE54E48C76EAA1052E09010D8FAEFEE95E5EBB
75CFD9BC5CEFA104ECC1082D77E63392CCBA5291
69EEF609CDCA01385D6D9CD14FA1FB8BE482F1A2
7ECE21DD57B3F5177B59BFACCA3435C66FF72EC9
CB24E1035B0054970670A4C789D6BDDA9C181418
D96F156371FEED5F5ABB29D2918592D99A110BE4
90D5105DF31E4C51254619DFB84447F353E81E33
5B4F376F01427F9A7DF3EDCFE86A1796986EB06C
E45DF0C4214EBC8B873242B8F887BD7898D189A5
6F7F18799D1B8F2D77309F3EE7900E173F5B4D02
1FD3162B47663DC1BEE0A6B1BF710585971E3AF8
FDF75758DA3185E6C6BA9FE15A4173EDBDA6EABE
8D4C4A23BA9EE84EA7348FA98CC6E65FBB69DE7B
705E800A291746C05A7AC6E7088BA966BC99CEBB
B69E752BBE88B4458200A7C0F4F5B3CCE6F35B47
339CDD57CFD5B141169B615FF31428782D1DA639
0BC249478F120F146D5714970A088A3A30C9ED07
D19F53211B0162532607EC1B863581305FFA490E
351A78EBC1B4BB6DC366728D334231ABA9AE3EA7
1F365C20E52AD2A6B09020A0E5539759C98DF8D0
3F84E5CA95CBD184FEB9DBBBFBB5F1A35DF8CBB4
104C63D2546B8021DD105E9FBA5A8D78169F6B32
EC2382F7DC9F06330406277E4F1BDB826DEE885E
A52B9369FF1FF60F7C06179654F2D5D886ACA75E
5DBAFB06715C7E327C9831AB354A88747E41344A
DCBBD14F544AC731C2231FD3F9B0BBC474D2600A
010B75726DB3C58F4682774269F9135B9D393198
2CA4C989FBB97EE866D56C089702AD1CA87B6400
93AD9C9CD02152C64040F8212614CD4727D056A1
43DF7B055F78ECC001599232613A3BEFBD3E076A
764D2FA59ED123F9C95570C403C92FEF338EA745
BBB8ADE70CE679C668463BC8CE7BD8399DD163BB
4E56E53A34D5951858B03569195C72949BCDA188
C55FCBC62CA7163744F2F845533A8FCD3077A30A
2E13487234F237A80671FD0DC0E60AE828C60555
BF198756BBBD4606086B1E6177F23FB56DF55B07
4BBEA4C2D56F1B5ED1A3755AA1DAA40A0B79CDB8
AF648AE953FBE423D72E227BC78ACADD5B226F6F
94FA31B79E38B20A90BE841DF5DE8BC5541AABF4
CE0C0BF4B97ACB5478EC582B25E7AA66DBA7E0FE
E3308C06B3776D8A893A5C8F8188DBD23F36C7CA
70608B40D0B776174A4ED85416582770B307B905
9D54E9A0DE59804F1A4101E877A2080EC2BB887D
7BAEFF8C68E6CC77EFF989728C8B5243DAF3F8B5
75268ED02F9BB20692AE1EA8D7A78BC01911585C
157FAA4B575C25FFB2D6B641D2E43067A90F7FF9
4010DB8FC48007B966FBBBAF89314D3B3A2D8DA4
7611CD06FCD459D58650A9055D4ADFC42D5944CB
0AF61AA1400809D1F612B53CE61961098B787767
8C9CC61AE33BD12859BF0AA883F86A360A6A2163
BCD8E131ABD98CC8C01F781E55B61F50B5FBB641
A051749F3E9D2804D771B2F1E0C8027544C996BB
E33D27CC1D41155AB9CF0450D27C5F17F8AC2F2E
ABFFB26DD6E0D1E4CA5E532C854B6A76E163F2EC
7BD7DEFCF34883C7B3B1B9A394F2AE94F14D8A85
F11276379476B0DC3A0651328E5F48B1E0DB13C3
82D9B3283887A78EDF087E0CF6DA6CBA1A6745B0
CE912E2EE8E147506D183694037929FCF1C0728E
24AA0DBCE6D92B5F9DCFC670C6EE7CA811A2BF4E
144B932B8016251B88C5D9B3BD0E51620144EE27
A4E3AAE02523B3E83EFBA9F5A194457A15EC094C
9AAA02BEAE6338F591BD15838E33C0B4447B4FA3
CE1710A80BD0DFB6ED688C37C8FC066268BD814B
BE128A987CC4C6A0CB3A4EA6A36DC60CC83F7FED
47312B8A43540189960F542AA42DD6B6B587D3DB
AA1E28DC508424DA2567D094A53E9C39AF7E1BD8
0A532CDBF8E0DE98C3AADD075329DFA472846A0B
40302FCEB1CA7795B9871ECAA1B7D334E0F9E41F
62073FF225C856318C84F2B1395E5871D44B4962
5B6AC0DA611E084329B87A46AB8121F602787359
44A22F552225F5EE5D7F832898334EB1200207A4
BB7F0FD5083112D9BCB6E2A35C5B8B204A52E7D6
EF6C68DDE05896655EF293CF05331F86FB17D8E6
EAF49077834D82235DD38E2F521AD63F7E569C73
121F08BFA981D3746ECB550657F6A0322A7AA172
ABECABA430770DFA73854DE8555B60E972BBB212
17BD9506AAAE7801CB27374EEEA6F7E64F20B9A8
7EC546F3BA8FD8D16F24A5A17BE93AC518E63A24
B6E227F098FC08C6164AC29CFA996012DDAFEEA2
C62DC9AE90E99B96A988F7044C91A9D0B3BF35B5
7252A1C518EF94AA0EC89D199378528C1C60CCB3
586D607480E6401CD6F778C40C82F624625F4947
49CC17D56AC2F952ECAC9FEBD8417FF195B88341
F9431E2E44E106A5BF1B767827165353934E8C4A
ECADDBD0D0D412D8815E1B9171ED7E4A183E3D1D
5554671BCE761E8E4CDD17DDF20CD51D077E0790
9EEF746217D6BF71020CA3D1FD268B234717469E
8C75E5781F0125C89DAEAB588EE27EA8692E0E69
663F329AD73DFE46EE30B1AD306E1C65CE23D343
7B6C5576739CEB8142DC81F1AF8C7EE2CC10121B
FA4FB2484E83FC109D168EFE3BE0E21E270C7EDB
A044CAB17C1491BD7E924CF6A9BBBFE25B4BE8F3
10C77D3F130400614CA9C4AE068D0C06063DF581
FC32477DA140D4E2D849A9E00824374A48662947
72276FA92754590CB824E8FAD4715975FA316B33
247106A405B288A46E70A0262717162D0903E734
534CD27BF6CACC7C72F9E0F40F06D748F2ED67BD
AD5F20A413B8315F1C5F0C9AED79C98315763306
9A933E0E07659752DAAD19B01C72CA89E4D2F9DA
E93B5FC1892B69316184F1DD1EA0C5F7716F8596
816A8A8C3DEDB3E85C4061B5A3856139109DFE0A
67BE49EDD179FC49177DB05C1FE847DE50868A36
0FA8188F72A156AD14530F76BFF0C73571D53155
8A63C019620165B85120C8DEB3362D0795020486
C2826E266D7405D34EF89762636AE4B36E86CB5E
E4D3066BD561F9CF92D125438BCDF21A50C3B15F
42D9EB484D6DEDF51525CA794466E97D7BA8E927
188B39CEEECB6E612E01B1F70BFD30035F703E28
263C1BA861350F3767F9A0652774BC6D03FEBCAF
01ED4F29ECCEF3110717C21D3E4498F409472C39
A3E0FB7EB38ADE229D5D7C33BD74DD0C62BED9B1
9219BF9ECE3D999A5D1F61BB4C9137DCBC92B3C8
4B9B82B565542082E0771F004DC0DE1E36DF9D8B
4CDB3CA20337E1FFCB6F1774C3F7D01FB4C79C76
D5C499A025552656830D43DC9898FC98B7A4877F
9BFC392E149E2DAE1EE95D4935460FB7577DA820
D6E0A87E68B8507CE86B7A1CB55E3439E83658B0
3D47641F2FBFCCA012DCC5D7ECF417D67AB5ADE4
E10EF1C63E2917432901069CF23B7A477DFCA8CD
D801A6C35B3A99777418009D582A93945EB5CEDA
AAD5B08F9A361C6195F93DE2D05380C5305CF28E
3669B628023E6B2E7053DBC6102E81DE716FCC41
7C04B5FDF11A158E8D895324B71FAB475A503CE2
A78740A1A3BB273EF8609F2348B59C7E3488F9A0
BE71950968995D30B579D8EDF7C2F732C76A33C7
BC09B1122F3C3061F0E9166A3BB22C6436977CF3
C3751F51A2A1F3B5BB8C37B024D82AE83CFA9C8D
63B8502CE5D1D432E9C75F2C737E97CD546B7A9B
63FA9E2C0E96B578FD4C904DEBE0C583294FEF57
62662A376B47FDED50A9CB3D316691B7C3903C3A
86E669C397F181F8B816A62450A73415E7F6B2CC
BFCFAF4662C3493D4CFB05759A0F34D4868A08CF
6C76A1BABA43BCCAEE1E34A9FA46665FDA43BD5A
45B82B775FD5FC5CE9904910676F64CC9EA211C1
423C4D044F069B6435BFFC896F368FD335D0EF36
F5F4B59FF6EB1516F32F47B85F42DAAD82A8AA6F
A00729B991C801A4E970929220300CBA45F0A440
67FC406B755AC198F0DFE4313157AE011222511B
8360BEACD4B4334CAB4208D3355F459F099486F0
070A726C6E4418DCF0213874F0C16D93B041E935
FD05E73DC9C71E02E4461D8E5C71DF7C6BC54C4C
7A6ACC1DA884DD30248488FA69557D3C5D5651EC
97E5CB413CE705A0DB1882F2CBC822D26710F67B
46C7401992CF5E2518F8CC8BF505FFE9F65EBC48
4645F5AB98C6E3EFD59BEE793F371086DDD7C260
F4F26A16D4B913CF3208E664E3DD384E56CE77AF
F5FB01DEA6E59CA6DD057054F4A3FF72DDE1D5C6
75107F3EF32EC5F1D2FC9EBE4F158237AE459B7C
02B2908CC07933817116063A72830012A2E72B22
97FE2A4C776C584565BC38BCB8B95F16CA64A8EE
38DAFCB661E4691200C916BE33859593F28759B2
1A38C37342190E96F33967BA9CA0F13B6BFBC70F
0D0E690EFF634B60AECE5663B6352D0D12589B06
0BDCDE67613F3D5F5BCD5A5E368118484A10022D
FD9725D22843091F8D61D5BD4242DF62DD7F3AE9
AFD335D34EB9C673D867EA441C99F3504A644063
10EE7ED28E5C63FDE1C4CB0F1D7CEC78CBD20D8E
65D97276BD73DFDD098DEB599C9B2A1996DB660D
9924E5214957AC3AC5E3BFE1E20F714CA1963C06
41E312CE9E4D27ABC7C90266B115DC70D4849C19
53969D17008385390859143FF6B5DCA2828079F2
236037C6984A62F3B40068113AF4D4F8BFFB3BAC
873D2BF7E405A66940627BE8BE3D53188C8A904B
6144A1072913A8E7572DC4BEA0E0056CCE2C10D1
E98548AD614069B6AAD3E25E8687546DA16B32CE
602C3FBD1A20D30BF764130B50D28876386F8E66
82AAEE91D12CAD6D30676C5210B00BF2236DCD21
2AD280D97B0719D024FC1FAB5C4A6E6A86F723CB
2ABD9AA74AFD75B5E68579BBC4E289FC95C16B07
1B55AD81148C4324CF428F6A6B84E7D22D60AAB2
D2D3DCBE5654B1DEB3C93FE6452BDC71BE93B9E2
827088A0C3127E89C6F72F373C5B3EF7E8A4125B
17661DFBA03E6AAA09142E012D216864F01D1F5E
9151B539751B891401C745A9DE301CBDBADF3FB6
377516ABDA1E249F3DAD9DCF120A6D2C2A5C89B7
90854CE574D03218DF2E7B4A054AA53F6951C1D2
ACABAFAB17A0B14180114EC0A22D712F994CD9C8
440FF68A35E03995AC55E457A67EB1680F9A7CDD
9332F54E27F32B32BF06D70F35CB4FDF6505597D
872FA06D68DB94F178D4F866C5441844D17C38D5
0488A2BAC10E233C8924338A8D55666E8058A161
1AC310BEF1FCF36E941B55ACD29DDCD2D00EE8ED
8A51339879AA673DC0246BDE374F099AFA6DB2E8
D46CFE2B2F6CBBE62B728A03ACA0239A633DD298
023E8E7D5F1FFB147F6C6AC233E4E2100B4C6900
BC43110E112A64798FDFCD8E1526E5ED57766FF4
A8667EDD559F9F7DA9F5BC1008D4467BF9B889A4
C16FF035657C7C638B02AE1753D7E3136A5F0624
D7F41F5F862E5F467B615152C107E53B43347A1D
3664D5D58C1A115DFC25B4D86DE65EE65269250B
9A6207A5FEE6225A300CA316DE4BFEF56BC9FC81
48C54232DA918B0B82357FED943F8194D6F0405E
B8DB2EC6797B19B9164393DA568ACF45DE07EB0F
3D5829DA0C230A03F1779EAA2FB344BC47A787D1
74D12DC2F6C67965BBC08A4C30FF005F044581E2
658B1B3F412A20F9394E77E93E91619E378AEB6C
B29C148AC5D146CA9CDB0905823AC9B7766F0039
878EE652D70FC6B7C819B3E00FAF4C5AC2DFC53A
4A9698A2E5B174E6FE81B2DFAC1BE9B5C7ECA4C6
4BEFF1E4579063AE72DA6CFA3C346FA122DBC469
F42BF6BE4C944BD0DA928421FE5E325162C08496
13C3862AF3C8A32FF40E1DB5488B368B8322FC7F
5317F0485013EE980537285EBF1347804EADE6C7
AD80F4F62DC55FBC61A63846D6570023567EA757
FBB92E68A6F877C4DD2FD8E74FA00F21F2995EE5
5B4994EBE1BB1371343525B6D4E8207FAEE9AB83
CD357605614F6BF555315B75DCE0E3F73BDAB3A5
B1819F88F65967EAEDFF615708C54F2BF832DEEC
533DA90FCA1A2AAA5BB1939E222DA9D9FE9A5195
0DC412DBC9BF0B4FCAC77A3B73AA07AA4FDEBD45
D8A76A01F14B626BCB388F53909BAF6B7298C0B4
5629E2AE7B02FCA1D84162913075679C8F2FD4FD
E84990CB9BF8E3AB0BCAE8A649CB30FE4DC4D767
F66529DF6177DF6A74911157B48A2668AB5F9962
56675261CC68026A1AB4F3EAE444FDE4C3A092C9
7A164F53AF93B80965FF9FDF446D5849B14B3FDA
C8AF0B661078FA075B5B4E80FF37E0597BC8CE93
9BE40CFC227CB8C81CBA3E3269C09C2F753E0F0D
31DF7C2685F9DB846C8BC8FC49B6C9E997BA8062
3BBB61A07435CD781BEDC637CDC9413FC4A6C674
E6332590A2D49E62E88B8632C74459307E6DA7EE
298DD33E8FC3EEEB5E9DC63D9E7E7B4B62F84383
07E6EF24E163E2F6166BFB10582288C9BC5370B5
329B78A5C9EBC2043242DE90CE1B7C6B1BA6C692
9FC32441F3E04946432D86E81A99F96718B9738D
D534700973D8D44EF041E47891D9A16482C657A4
4CE9E54D353BD97238CF551F10A35AEDDDBE6504
237014489151D07CE77A21061083D00FC5CF93F7
A9215DBCB4186C547DCA291B888FF30D966573C5
94C95DA1E850BD85209A4A2AF3E1FB1604F9BB66
D772DA0874059418FCDAACE3F4FF2AC964A852FF
BA1C718242F1B46611C8425BFF6F7AA04F381FCA
33E4E80807204C2B6182A3A14B591ACD25B5F0DB
64D253D88595176B07079E89775176834214B86F
A3DF966D0CB2D84AF8F16C855B97C49364F5D8C0
40CEF3046C916ED7AE557F60E76842828B51DE53
956A6D75483E2BBF7B68B6A3E7213A0EF4181157
02D65B95E28370C1570095FA88F923DD937FAD8F
4705E9B8F1C9E1ADDCD937976297B082765BA3DC
AA950AAD16265917F7DADA5D662F778FB00F82D9
1F7790399A1DABF825E594D113A16207D025BF15
94F162B98A4EE6EFD189829C8E446B02E3040F58
E5C8EA53E49D5A977DAD56AD14BB0D2A61A66491
4CC0BF9C4B987E22F38A6036B143272BCC136063
19DD644AE504F8A1FE5828AF1ED9AD4981DB6209
B527840A212DD4F9B31E20C8ADB1E6BBF65E5D42
A37A21E728AB28240FC9FE3B7C8EEFC0526BA702
239A6B191FAE13FBCF57DBEB753DD6C3E3D728F3
59A08D6E9521370D87CB940AC851075957429097
799BCA97824C88027A7EE452A852F8605E14EFF1
E41F899E73D75DB8215A8636BD8D71065357A547
60A801B346164B6153D75D33ABB3623A0D7CC4A1
63A5C713AF0234AAAD44C486D72ED28530DB49F0
C10C45EF19C80B4C1E766C85EBFBE08F0C1621DC
6B8D76DA69A25160E5D6710C350153BF260FBF9E
50CF0E88EA5C729582753A5AAED2CC7CD1F7DA3A
B773C7022AC5462FA35F4A174B11039738A926C3
C69BF80251259982D5A5AD376A11F88F315ED4A7
98CBBD74D3F49DFFB7D0F4D7A2AEB6F408B16070
A9D6C26549CD6AFF623268033FEBA9972DD7D52E
621C64AF3FCF629AD39F66E90FCAD52575C72D92
FEDC60489C682D1EA555DBBFDC1407193EF9668F
225DCB787E5ED5C999FFA6E21D1D7951151A4659
8A8B7ADD83356C4CE6752837F626B5059F5B54C4
0B2280EF840ADF325520B70D8785512F5148A21F
F64B6A9972A8431D67334E9AD7B0EF61DC05568E
39F1296A956B7BF8890736E528E079043A6DEC51
E63B70066CAD59472F71A28BD855BBC6FC5953A1
16943A59FB412FB8B162616E2A38B1F799FA2FED
B6A4F662D11FE5FD41551C3A990EF9D19008AD9F
04A79EE453BE3270ABB82AB8D76F375F071A4BBE
B6A3745B580EAA12156797FC7024D41ACCE6913F
E400A8BF048C58EA28EDBC68CCC687C86FB8E94F
034CA46B8B3D30493751A2FD7C5C1F25C590657F
0965F952D2D60172CD843C3DA0587EB01F5608BC
1893205276C4448E00ECBD613E5FC75CB672ACC9
4D9982C9433EAB28F8B13083A8BE539683B99859
046AA16D28967A45B2E510985DB4E97755CB47D1
7CF0F32C72044A017E7C8713689475579237A5BD
8A3455B4DEA65DC4B252D2945240CC070CC7D4E4
1CCDA0E13FAEEBFA311DBC1048FB28540394AAD7
F222201E88F57605166FD013BD6AE0B55B9080C6
6F1DD38152858D067BAB9A76C1519C167619BA77
38525C7140D285040E02DD2A7F3C7DBA21042E01
328925461F4AC00F4F56C04F8C910747736412F4
E859530DA7D703D60C8F7266F6C185064F6A1163
D782515E87BE217CCBA9756F7119D7178908404D
10F0F1E452B8D07183D02AC3DF97D0911E98473F
30689DC2681EBCE0E5BB56C0D3E911977850C5A3
3E8C75C5FD74FF3C3982EBB40CC55061536CDBF8
06035EFCB0B44637E58792AA9542B03B3EFC5E9E
DCB5B1F4AD57503D8848A03B04B8A24CCB88AEBD
FF2EBF2ECE71D2701B31F21FB7DF7724B9FCCB0F
B6BF99083A40E79BB0759FA01EBC6A1EA4BD133C
30EDCDA37AAA6783E150F06BB9210A7AABCBE5F0
F25444F0ED9FA9FC4100EFF73396B8DC1328CAE8
8A8C3F4422580DC6D310BEFC77B78700F221B9C2
86C797712FADFDC412856727C1D4E014162FF37A
6A358A037C23F9D3953522479ADFB673821DFE0E
F34DDECF3EA10BD2E2F6308ED1CE537B093578B3
AC97D4A7CC76EB8B73EF6F231B3EEE144DF128A3
E1400C1EB5DBF7AAD5E8AD740F749A6ED479A8C1
1EB0B157FD04A2D3A53C014F27C117C3A4DCD8F3
E2CC0C66BF6B8BDED6C627B512AA25F778BCBF06
F720E347B8264EDE664EA67F9FDB7903BC80AA72
7714106DD46511A6F1E4E1CF4B66378E5849446B
525C47FB3A5E0655FBD4BE963CA1E94D5FECB43D
9B8B0AF7E12F6C4FC6C2F82DBFD55BBA4700E8FC
F6715A5E1669B18194CD53355E632C26EAFF6D39
4874CCFC108EF73667C5A11B0BAB84746017F2E6
112325A40E1807575D205350C75D5FE4213438C5
246EFBB8B71927A0D2F2B726508E8F3A3D42EA51
A729C1982468C774021614EE8ECA0B7B781B51C7
78274C6D3B56C2C28F8A9240F7543A3C1A27A136
42B2BECED24A95A5D537F796CF50168C5413F8B5
529455C83DB706559EA0A8059734E2C2C5AFA874
E21E9FB57BA6DF8F7484ABCDCFAD9ACE88917FF4
D3E28308711C7E539EBEB56D2EEDE88F7223BA79
BF357F4EC7A882B1CFE95BBAC1F2545E3CB1BFFA
D01F069332C8BC4D6B7C4AEB976E7FD5A30285C9
B9426DD6B85B3DF7F1581664672E5D14C40A3C67
D0B4C941A0C14727391705A22D198AA85637C0C0
8FDA235CFD5128B35540A2544323976979BF895D
6E711E4FBF0ED0BC918B59CB5D5F3ED24B2F4F4A
CD2DC5275D6A395C67E060FFC8B427C002A737B6
3FF48021FA0B01C16241CD6A9BC5923D44A38B70
D18ED865749FA0628112E71C73F011CEB04427C4
FAF76441F498E5DEC5C9338D9777A99247537D51
CD989334843A511A09B96BF3F2697F62C9902F07
6553216A9AF7AB34C4ECD94BC0EFFB4BC532980D
B04D70B04B4CAE0B5F86123E4CC2E3649B3DA5F1
B999BA2A89DE4002ECF0C80F2B5745D99D2574D9
3E2A08AFB111416CCD72BD3219C77A0BCE14178F
5B6B71AA17E1CA58CF7723004C71AB2FE5B32123
C1040087E622BB8E4C68036B705FF30028E2C3E6
ECA4EEDBED3A106C10652A574867E383AB8B5F19
0B4D7553A447AFC83F0ED8225A29AE9759D1C266
47961937B34CE2D12BBD2E8AB5CC96C4C493746F
4A37354A2ABC24171D5AC0D77153E44C1A5875B5
1E3451A465717D2F9A5F86359289C347D10D9F7A
BCC4B7595B73CF0757E7D320549433FE8BA9D142
88BC8673305BB0C0A0EB652751D432F285B939A3
4139CE95C5374A14A04A1C15FAEEB0177088FD2C
CA7788C32DA1E4B7863A4FB57D00B55DDACBC7F9
0FB07E231155FF10449B8AA1C7CB22B354C2E666
8D594750CAF5182039A1B516EDA712F3DCAE6339
5D6A96FF68706273E913557462889487D08F89FB
4B4C0E215FCF5B3B8668F48A2EA8A9D2AB0EA5DF
FA3B3B3C48A28F0A689C56D633554420F70899E3
5169A985192D17D5682C1D3126BBFEB1FFD434B6
1F2DBC87A8F4DDBD40D9669DEC65A9053427469A
D89E3BD43D5D909B47A18977AA9D5CE36CEE184C
BBABF44B42207395684605B5602C9D56A5508BE1
1874EAFEE7E813B46CF9433C16FEEC7FD2BCF5D9
41EEAD7050191684912D2CF03AD63596EF2E4976
30CA5A9B918ACA4F8970973CB9375AFC09079E2D
AF6686749E649FB78A378CF531933353A84D38DE
E59C6DDA590A3CEB0011552460D02E98F41F27BC
8A01E30004366B97983F9CB9031DE54645CBB6A5
E6A67AFD553B5BCBE901AAB10FA94CA82566BC27
497FAC9F8FBC810956B8FA9038B8BE150485A13C
71F8E304C692E7FCF92A17F7B0A58158656A8E94
8C2B91EFABDAC3A416066EFE2A5871AAEFF8B522
65EF1579BFC4C985EA0B2320CBF2112D6697EA3B
0B6D74B3473E21F1FD25B3F6CAFE08E65DDA9973
994BE9C30DC76DD942CE6E8C7451FD524B92DF0B
831A7F9360F7919A763E35C54A1752965BB1CAED
7C6749FDD405FBADC212D4C7B8C392129023EE26
DD46BCF1C81ED6D3D7894433608CAE682B7E20CC
E1303E8487837AAAE34BB55970F453EEB5270405
E036F01AD90C1F30FFC3C11CA337AFF9AEAD6BE7
7A5DFB3682476707C3FF0D9DEF4505DE54F1711E
B15679FD0AC8671DD99ABC2D6CACD9128EDEBAE7
D4E638A4BE992EB0411FA7595E293092EEC72224
7CF0A2CFADA67D1C09D531337D47B5F94D0E3CFA
447DC985D1B7D41A565A717AC9B0C85C8BE5A6E0
D9C8CABA980A4D6B90216097775092E0A6EFEE73
BC8A5EBDE6AE1467B56125FD112B09C14C278EAF
1A354290CFDC6883242183BF3FE7CCA3140AEADA
4334C8323E735ADFCB028B17F72913680C43DD15
A042A852961B90D5867591D0EA2B996CB9ECFEF1
BC0A6EE6C66080FD39EB82DC3325816B620DD15F
0F888036AC14BE902F9A5558A8851DCD21CE934A
D6970548458554A6F70AF2FC542024147ED504CE
7F95276D4951499FD756DF344AA24FB38CEAF678
627AD24E2334E200BE6686D73C2CEE2233E460BA
FB78E8CBEB088FE7CA8EFD72ABB73DA4EDFDBD59
C81A8BD1F9CF6D84C525F378CA1D3F8C30770E34
4C7EF252A701E802E3607881901CB30A6D2BA75E
FF993FA3F9C3DB1BC5579094386085481EBBDF45
46331F63BFA0F3BA30DBFE833F4829A8D1DC9B3A
8A7C8E8A1D8B1DE53E844D0E7C1B798740A811DE
606E301E28ED2ABD56D1746E7851A12FF60BE2FD
E54A8FDB49048DD987C27C6AFE6177569C08D770
0D91909AF3F28DAD8B0342EDACE84EB18F0A7FE9
4F9D205F580FC32FCD82A65A39C3799429EE69FE
EC102C8C7E69FAA38A4467159804EC3F50996104
91C6D6EE3E8AC86384E548C299295C756C817B81
AADBBC22238FC401A127BB38DDF41DDB089EF012
F18B538D1BE903B6A6F056435B171589CAF36BF2
FA7CFBB247427763431B7E6D75812A49CC8D30E4
20CEB1F0F51C0E19A9F38DB1AA8E038CAA7AC701
'@ -split("`r`n")
$report = @()
foreach ($line in $list){
$certificate = get-remotesslcertificate $line
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($certificate) | Out-Null
$daysleft = New-TimeSpan -Start (Get-Date) -End $certificate.NotAfter
$chainarray = @()
for ([int]$i = 1;$i -le $chain.ChainElements.Count;$i++){
#get cert type
if ($i -eq 1){$certtype = 'Personal'}
elseif ($i -gt 1 -and $i -lt $chain.ChainElements.Count){$certtype = 'Intermediate'}
elseif ($i = $chain.ChainElements.Count){$certtype = 'Root'}
#find thumbprints in blocklist
if ($blockedcas -contains $chain.ChainElements[$i-1].Certificate.Thumbprint){$blocked = '!!Blocked by this CA!!'}
else {$blocked = 'Not Blocked by this CA'}
$chainarray += $chain.ChainElements[$i-1].Certificate | Select-Object @{label = 'BlockStatus'; expression = {if ($certtype -eq 'Personal'){'Not Applicable'} else {$blocked}}},
@{label = 'CertType';expression = {$certtype}},
Subject
}
$chainout = $chainarray | ForEach-Object {$_ | Select-Object @{label = 'out'; expression = {"$($_.BlockStatus);$($_.CertType);$($_.Subject)"}}} | select -ExpandProperty out
$report += $certificate | Select-Object Subject,
Issuer,
NotBefore,
NotAfter,
@{label = "DaysLeft";expression={$daysleft.Days}},
@{label = "DNSNames";expression={$_.DnsNameList -join($delimiter)}},
@{label = 'CertChain'; expression = {$chainout -join($delimiter)}}
}
#Получаем полный отчет
#full report
Write-Host "Full report" -ForegroundColor Green
Write-Output $report
#Отчет по сертификатам с валидностью меньше $triggerdays дней и #блокировкам
#reports with expired/blocked certificates
Write-Host "Warning" -ForegroundColor Yellow
$report | Where-Object {$_.DaysLeft -lt $triggerdays -or $_.CertChain -match "!!Blocked by this CA!!"}
Если в списке оставить только qna.habr.com, то вывод будет следующим:
Указан !!Blocked by this CA!!, так как отпечаток SHA1 этого CA присутствует в списке CA, которые могут нам потенциально отказать.
Скрипт #4. Получаем цепочку сертификатов по кастомному порту
Работает так же, как и предыдущий скрипт, но позволяет делать проверку по конкретному порту.
Скрипт №4
function get-remotesslcertificate {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]
$ComputerName,
#Порт по умолчанию
[int]
$Port = 443
)
$Certificate = $null
$TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient
try {
$TcpClient.Connect($ComputerName, $Port)
$TcpStream = $TcpClient.GetStream()
$Callback = { param($sender, $cert, $chain, $errors) return $true }
[System.Security.Authentication.SslProtocols]$protocol = "tls12"
$SslStream = New-Object -TypeName System.Net.Security.SslStream -ArgumentList @($TcpStream, $true, $Callback)
try {
$SslStream.AuthenticateAsClient($computername,$null,$protocol,$false)
$Certificate = $SslStream.RemoteCertificate
} finally {
$SslStream.Dispose()
}
} finally {
$TcpClient.Dispose()
}
if ($Certificate) {
if ($Certificate -isnot [System.Security.Cryptography.X509Certificates.X509Certificate2]) {
$Certificate = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $Certificate
}
Write-Output $Certificate
}
}
#формируем коллекцию объектов
#Создаем пустой объект с определенными свойствами
#Далее их заполняем
#Обратите внимание: здесь указываются эндпоинты и кастомные порты #к ним
#get list of web sites
$list = @()
$site1 = ''| Select-Object endpoint, port
$site1.endpoint = "pop.rambler.ru"
$site1.port = "995"
$list += $site1
$site2 = ''| Select-Object endpoint, port
$site2.endpoint = "imap.rambler.ru"
$site2.port = "993"
$list += $site2
$site3 = ''| Select-Object endpoint, port
$site3.endpoint = "habr.com"
$site3.port = "443"
$list += $site3
#Указываем произвольное количество дней, чтобы отслеживать валидность
#trigger days to expire
$triggerdays = 140
#Для удобства формирования вывода задаем подходящий разделитель #списка
#Если вывод вы планируете парсить, в качестве разделителя лучше использовать ;
#set delimiter
$delimiter = "`n"
#Построчно указываем уникальные отпечатки SHA1 тех центров #сертификации, которые могут нас «забанить», чтобы сравнить их с #отпечатками сертификатов всей цепочки
[array]$blockedcas = @'
D4DE20D05E66FC53FE1A50882C78DB2852CAE474
5F43E5B1BFF8788CAC1CC7CA4A9AC6222BCC34C6
0563B8630D62D75ABBC8AB1E4BDFB5A899B24D43
A14B48D943EE0A0E40904F3CE0A4C09193515D3F
F517A24F9A48C6C9F8A200269FDC0F482CAB3089
8E934F88A5A4553336E29B5FB8666048EFAA8240
A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436
DF3C24F9BFD666761B268073FE06D1CC8D4F82A4
7E04DE896A3E666D00E687D33FFAD93BE83D349E
5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25
3CA0E59C4D40ADCCC0B9C48CC6335F544E0A0116
DDFB16CD4931C973A2037D3FC83A4D7D775D05E4
17F3DE5E9F0F19E98EF61F32266E20C407AE30EE
A78849DC5D7C758C8CDE399856B3AAD0B2A57135
97817950D81C9670CC34D809CF794431367EF474
912198EEF23DCAC40939312FEE97DD560BAE49B1
843573112A3B319344E5E4ECABC9F26C7CD54D07
5EEED86FA37C675230642F55C84DDBF67CD33C80
323C118E1BF7B8B65254E2E2100DD6029037F096
8D1784D537F3037DEC70FE578B519A99E610D7B0
039EEDB80BE7A03C6953893B20D2D9323A4C2AFD
91C6D6EE3E8AC86384E548C299295C756C817B81
AADBBC22238FC401A127BB38DDF41DDB089EF012
F18B538D1BE903B6A6F056435B171589CAF36BF2
58D52DB93301A4FD291A8C9645A08FEE7F529282
26A16C235A2472229B23628025BC8097C88524A1
132D0D45534B6997CDB2D5C339E25576609B5CC6
22D5D8DF8F0231D18DF79DB7CF8A2D64C93F6C3A
4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5
3679CA35668772304D30A5FB873B0FA77BB70D54
B218FE6D07952A2207A35AFD5ED8E4991029E336
B60D92FC064D32AF1FEA30FCD85FB0243463A41C
1CB8A708C90D207901A0B2367FF09565E45324FE
5BC5ADE29AA754DA848953A5FED75B4686D05708
D1EEB1E8C09020BAB85D3DE27F78EE33A06CAEDB
87B8E6D38F1A39CD97F04A9E174B3C9EE7EE1115
19A09B5A36F4DD99727DF783C17A51231A56C117
28E96CDB1DBA273FD1A6151BE15F088F26046273
C619BE4F415453F46D020ED79F5D5CA5C37E14AD
59B244F3FF278C039D71CE7334B9D4D0241EC62B
409AA4A74A0CDA7C0FEE6BD0BB8823D16B5F1875
759540EAE3C302BC3E0E2443C1C2E435B52B8E8D
A9D53002E97E00E043244F3D170D6F4C414104FD
FB3A7F7C9DE73060094FB265E376F2CA86DA2340
FC20B60CADAC38D1FF40CF1B6EEF290F10B57ABD
56EE7C270683162D83BAEACC790E22471ADAABE8
60EE3FC53D4BDFD1697AE5BEAE1CAB1C0F3AD4E3
846896AB1BCF45734855C61B63634DFD8719625B
9D1FA05D51AD05BA9E5384C8022D908E8F54CBFC
54F84CF4B56C1A7944E60BDEBB6D4559E14C773C
F3D5B67A7E35A5332BFEB47F4B20CAA2292B4CDB
D6AEE31631F7ABC56B9DE8ABECCC4108A626B104
0753C9D48FE522C8134760A5149D4ED430130317
42857855FB0EA43F54C9911E30E7791D8CE82705
E308F829DC77E80AF15EDD4151EA47C59399AB46
DBC7E90B0DA5D88A5535430EEB665D077859E8E8
771FF8A19D15526B9DBD8934755A73FB23C7278B
E12D2E8D47B64F469F518802DFBD99C0D86D3C6A
92C1588E85AF2201CE7915E8538B492F605B80C6
7E2F3A4F8FE8FA8A5730AECA029696637E986F3F
F7E0F449F1A2594F88856C0758F8E6F627E5F5A2
A031C46782E6E6C662C2C87C76DA9AA62CCABD8E
02EF785428EC5BFBF1C1814FB42F229A0D2A3BAF
1FB86B1168EC743154062E8C9CC5B171A4B7CCB4
2EA5966C9A5B12E1AE7C9674AEFFDDA2222FB22F
F9AE40CCBBDA4795E58AC5D203BFB7BD331B81E8
C242C6785324854E346486DBF286C72FD035F0DD
876217035658B958F359FBA589D630C4042D961B
594F2DD10352C2360138EE35AA906F973AA30BD3
ED6302684A3259AA04F10FE9A97A8FD30B965D26
A399046417B67E320D3EFA69D7DCE6B8BFE8A9F2
7CCC2A87E3949F20572B18482980505FA90CAC3B
8B3C5B9B867D4BE46D1CB5A01D45D67DC8E94082
63B76FFF3B3864EEB549B1E37851D46B603FEDDC
98C6A8DC887963BA3CF9C2731CBDD3F7DE05AC2D
CBFE9EB43B3B37FE0DFBC4C2EB2D4E07D08BD8E8
9E848F52575C6B1A69D6AB62E0288BFAD4A5564E
4DEEA7060D80BABF1643B4E0F0104C82995075B7
C9FEFC763D9548B487696F047ACBA0ABE45C7BC1
090A16F9BA16001B2EC130F80523ESBSEB259158
687D4A4D47014F91217E4A062BBF9D238358943E
B0E6383FBDBFCE5E5F9D7934FAD0FC3C5E030F13
94D8797C449A29A8C7D45D35682E42DE0CD8638C
2471446048AF356F463C9F07D33C148BAEA5C68F
815CD8FF64BEACE07EF8F2F9D533011FA4793658
A3ADF237B25336EB479020491930BA8811A7899F
C43CCBD00E10A1D54E10AABF125D3AAC616560E5
2F7AA2D86056A8775796F798C481A079E538E004
9546387C13B2B9DAC48CBFC35439FE04D04922EE
9BD08A58876F6C849DB6BB99A8B194892647860E
75EAB86219B7A3F79225CCCAD7232C2603E8E9B5
626D44E704D1CEABE3BF0D53397464AC8080142C
1C58A3A8518E8759BF075B76B750D4F2DF264FCD
1D7322B41ED99FDD68511BAB786C8E26E0831B3B
AEC13CDD5EA6A3998AEC14AC331AD96BEDBB770F
9F90F8C8664B09959C2909AC9A78AEA8E26D88E8
C3BD4F375F3F41A5689A79B9C4A9A0ADCC4B30D4
8EA108B3DCF40C7A66050C9202E018CDA8413F9D
96B24A4064B35DC9A8B02BE12515F7CFA65F8885
7B0F360B775F76C94A12CA48445AA2D2A875701C
8F5C0C8E414AF89DBFF272125E28D417EE5FF559
0669D9AE862E9CFE2BA5B488EE72DBDCD4FAD041
231ACD6787B541F5590D943DF258569D7C6A02CE
8FB28DD3CFFA5D286E7C718AA907CB4F9B1767C2
83706D32A3DF8F02C485F8B3112DD2A412BC5799
7C770357099659B40DA4C4BA67785D5423A013C8
D1EB23A46D17D68FD92564C2F1F1601764D8E349
CCAB0EA04C2301D6697BDD379FCD12EB24E3949D
02FAF3E291435468607857694DF5E45B68851868
2AB628485E78FBF3AD9E7910DD6BDF99722C96E5
4D2378EC919539B5007F758F033B211EC54D8BCF
EE869387FFFD8349AB5AD14322588789A457B012
4A65D5F41DEF39B8B8904A4AD3648133CFC7A1D1
E19FE30E8B84609E809B170D72A8C5BA6E1409BD
EDC8ABFC394AB9ACEBAF6A15FFE841F47D7B921A
156EDC13920B58F3AA51EDE9D0B7317C8B4E9948
35D1CFDC14E8952E96C67C4EDE0B8C224943879D
1ACC5F54663D5572385C2F48E275FD25D3DA2120
C8760481F0DD1AD963FE851728ECCA3FB80E0929
3483F728A7B39221CF6781A119AE0C555986378D
F4B492F92F3A80B61C453D60A25DEC19468B37B2
8607CBB3A7F95410ADDDEE2803AD4528D83FEDCE
49100FACE81BC898D14EBC4C6C6149CF437DAA76
0DAD72CC220689F5CA9964AED6828A5F4C5AE159
CF040BAAE6F7C4CAF6B0BA88D7D5D001F4FA0CFD
714FC0240B1C3D6276C52D854F563F848C5995E7
0040A5E5DA9C1808F8F18CDAF1FC20BA1564F6AA
E79280B96086D6098EAEDDCC18C092491EAF0E4E
C23960E01EC0C229BC8A956EB11467E85B0AA4BC
0375861AFB6FCF30971DF32EF9F0DDE2C9BFF9E6
6549DC8CE02648061C67173E21D8B40DE3FDF127
C1671382F156A7BD6AC59FB93641868030A6992A
AB5B666E10F8813F456AE4749F7B57621F01A393
03AC82036F84C5F7305F5047156742CF531FAEA8
8A7EA1413B3BFE6A9E42D21958489BCE6FF5BD1D
61A8256C27F1C0558CA2EF472614910B80EE1A81
2C6F995A6F7B4E968CB1CD66056854FE533F12B5
03E859579E5B0DB2FBA394125B95B31A1A0A1D83
60109CDEB9815C559B55A966179949AEC212B4F8
638D6E6F4F9895FCF6029E560987F366983DB883
1633A19ADAB0931AE6225F7918437A89BE89BE07
3A0D686259DFBF59E530CD83F0D384E1057DAAF6
2AC10596DE0DCC745181A950B2FB23034856198C
03C8B739CAD8F1F737D2CDFB967F039C47D8C7F7
9E3DD94D3A67D2746324D0DDFA3666F42B53DE2B
BABAD141E11CC845DA516E6951FC107A562CA359
736DCC67D3F79F17E1EDCD3A8C9BCFA2F2007E7C
8B8C15B12C0974CE5ECB5B769C36DEA9EB7A7B40
FA41C36C97C8C1B46B0E570DD039733992067070
11955DCF836EA3246A8BD6E9C0D8DE2207B1BAE2
FF2A1B599875EA3C7D2ADAF7F5305272D4419E35
3D76F2A7052EB6341C225B82F8B949DBAEB36D20
EB140CF6C1F0D91CEC3EA625592C16323C17B098
A76EDD88C4D6894594B05391F3C366C9FA251A53
DE43B12A021046C6FE025937AED1F1E7670E2B70
E9D1F79A31277F6490440860F9C8B52C3021B37B
7ED8340BB202EC1D9710739667C7339E4850BFC1
A9122215F3E61BDF92D7B141D424A8DB7EF2818E
7BD4577413CFF214E1162E92E607A05486FECB9B
A006E5747EF1A80D3F58E7A74E03F96D06B8EE66
04027330A596C37D11056ADE58663DD383C3FCE5
743A6ABB22C6229FFFA58B258CB78F627E34D1AE
FA64F9B850FB2B9EF06BA0A50FF00A7CF97E4DC2
D06929EED88A5490F6C0C399149641530541483A
4C310D5DF23019417A7BB7912096295DDC97203C
D7D2737D35787C17A74CDCD03A3BC8943FA360E8
D8CEA9A69B2BE4AC1CD4FE5C9826D07A0EF68DE4
18F68CDBAAF552F2CF24C9479D91315E3914274D
3F4F96931CAB6270FD0FB579A5A2E0E8B94FA19A
9FB8E1DA315B5AFA048C98054F7E610894A2B882
9AE1E01243F70A6248A533D339695ABDBFBC434A
5563708F14E66212E78918EF91BA65FC307D2D44
5BAB80AFBABBCA4F80682F09F5858F9DECA987D2
4D39991934F4C04B4F4A48E3BECA02685F813236
6613D8A7737E3B80368940F7ED5EDA9C98AD110C
BD7321AE088F62EC3E39A539410A2FAFBC9E2637
A02ECF23FD9E2FF3880667B150B3DD030B126751
D2696925D72D40C5BCDB1DB4EA58530FFCD66251
05AF1C5FEA12CB1464BA7A11C4C80B8CDF7A1FC1
96E41C40348B5A0D77BF94DE072B71884A2339CE
EE869387FFFD8349AB5AD14322588789A457B012
314D3912A83D1D9613CAFB4DBBDC23F0CEE7B409
56C9BCD63169B37F188156168E7898403AC642E4
48E539175C9D3F4547133A653BE2FF6BCC735C2D
B1811371FC6966BCCA4E10729454FFEF4C14BDC3
16EE54E48C76EAA1052E09010D8FAEFEE95E5EBB
75CFD9BC5CEFA104ECC1082D77E63392CCBA5291
69EEF609CDCA01385D6D9CD14FA1FB8BE482F1A2
7ECE21DD57B3F5177B59BFACCA3435C66FF72EC9
CB24E1035B0054970670A4C789D6BDDA9C181418
D96F156371FEED5F5ABB29D2918592D99A110BE4
90D5105DF31E4C51254619DFB84447F353E81E33
5B4F376F01427F9A7DF3EDCFE86A1796986EB06C
E45DF0C4214EBC8B873242B8F887BD7898D189A5
6F7F18799D1B8F2D77309F3EE7900E173F5B4D02
1FD3162B47663DC1BEE0A6B1BF710585971E3AF8
FDF75758DA3185E6C6BA9FE15A4173EDBDA6EABE
8D4C4A23BA9EE84EA7348FA98CC6E65FBB69DE7B
705E800A291746C05A7AC6E7088BA966BC99CEBB
B69E752BBE88B4458200A7C0F4F5B3CCE6F35B47
339CDD57CFD5B141169B615FF31428782D1DA639
0BC249478F120F146D5714970A088A3A30C9ED07
D19F53211B0162532607EC1B863581305FFA490E
351A78EBC1B4BB6DC366728D334231ABA9AE3EA7
1F365C20E52AD2A6B09020A0E5539759C98DF8D0
3F84E5CA95CBD184FEB9DBBBFBB5F1A35DF8CBB4
104C63D2546B8021DD105E9FBA5A8D78169F6B32
EC2382F7DC9F06330406277E4F1BDB826DEE885E
A52B9369FF1FF60F7C06179654F2D5D886ACA75E
5DBAFB06715C7E327C9831AB354A88747E41344A
DCBBD14F544AC731C2231FD3F9B0BBC474D2600A
010B75726DB3C58F4682774269F9135B9D393198
2CA4C989FBB97EE866D56C089702AD1CA87B6400
93AD9C9CD02152C64040F8212614CD4727D056A1
43DF7B055F78ECC001599232613A3BEFBD3E076A
764D2FA59ED123F9C95570C403C92FEF338EA745
BBB8ADE70CE679C668463BC8CE7BD8399DD163BB
4E56E53A34D5951858B03569195C72949BCDA188
C55FCBC62CA7163744F2F845533A8FCD3077A30A
2E13487234F237A80671FD0DC0E60AE828C60555
BF198756BBBD4606086B1E6177F23FB56DF55B07
4BBEA4C2D56F1B5ED1A3755AA1DAA40A0B79CDB8
AF648AE953FBE423D72E227BC78ACADD5B226F6F
94FA31B79E38B20A90BE841DF5DE8BC5541AABF4
CE0C0BF4B97ACB5478EC582B25E7AA66DBA7E0FE
E3308C06B3776D8A893A5C8F8188DBD23F36C7CA
70608B40D0B776174A4ED85416582770B307B905
9D54E9A0DE59804F1A4101E877A2080EC2BB887D
7BAEFF8C68E6CC77EFF989728C8B5243DAF3F8B5
75268ED02F9BB20692AE1EA8D7A78BC01911585C
157FAA4B575C25FFB2D6B641D2E43067A90F7FF9
4010DB8FC48007B966FBBBAF89314D3B3A2D8DA4
7611CD06FCD459D58650A9055D4ADFC42D5944CB
0AF61AA1400809D1F612B53CE61961098B787767
8C9CC61AE33BD12859BF0AA883F86A360A6A2163
BCD8E131ABD98CC8C01F781E55B61F50B5FBB641
A051749F3E9D2804D771B2F1E0C8027544C996BB
E33D27CC1D41155AB9CF0450D27C5F17F8AC2F2E
ABFFB26DD6E0D1E4CA5E532C854B6A76E163F2EC
7BD7DEFCF34883C7B3B1B9A394F2AE94F14D8A85
F11276379476B0DC3A0651328E5F48B1E0DB13C3
82D9B3283887A78EDF087E0CF6DA6CBA1A6745B0
CE912E2EE8E147506D183694037929FCF1C0728E
24AA0DBCE6D92B5F9DCFC670C6EE7CA811A2BF4E
144B932B8016251B88C5D9B3BD0E51620144EE27
A4E3AAE02523B3E83EFBA9F5A194457A15EC094C
9AAA02BEAE6338F591BD15838E33C0B4447B4FA3
CE1710A80BD0DFB6ED688C37C8FC066268BD814B
BE128A987CC4C6A0CB3A4EA6A36DC60CC83F7FED
47312B8A43540189960F542AA42DD6B6B587D3DB
AA1E28DC508424DA2567D094A53E9C39AF7E1BD8
0A532CDBF8E0DE98C3AADD075329DFA472846A0B
40302FCEB1CA7795B9871ECAA1B7D334E0F9E41F
62073FF225C856318C84F2B1395E5871D44B4962
5B6AC0DA611E084329B87A46AB8121F602787359
44A22F552225F5EE5D7F832898334EB1200207A4
BB7F0FD5083112D9BCB6E2A35C5B8B204A52E7D6
EF6C68DDE05896655EF293CF05331F86FB17D8E6
EAF49077834D82235DD38E2F521AD63F7E569C73
121F08BFA981D3746ECB550657F6A0322A7AA172
ABECABA430770DFA73854DE8555B60E972BBB212
17BD9506AAAE7801CB27374EEEA6F7E64F20B9A8
7EC546F3BA8FD8D16F24A5A17BE93AC518E63A24
B6E227F098FC08C6164AC29CFA996012DDAFEEA2
C62DC9AE90E99B96A988F7044C91A9D0B3BF35B5
7252A1C518EF94AA0EC89D199378528C1C60CCB3
586D607480E6401CD6F778C40C82F624625F4947
49CC17D56AC2F952ECAC9FEBD8417FF195B88341
F9431E2E44E106A5BF1B767827165353934E8C4A
ECADDBD0D0D412D8815E1B9171ED7E4A183E3D1D
5554671BCE761E8E4CDD17DDF20CD51D077E0790
9EEF746217D6BF71020CA3D1FD268B234717469E
8C75E5781F0125C89DAEAB588EE27EA8692E0E69
663F329AD73DFE46EE30B1AD306E1C65CE23D343
7B6C5576739CEB8142DC81F1AF8C7EE2CC10121B
FA4FB2484E83FC109D168EFE3BE0E21E270C7EDB
A044CAB17C1491BD7E924CF6A9BBBFE25B4BE8F3
10C77D3F130400614CA9C4AE068D0C06063DF581
FC32477DA140D4E2D849A9E00824374A48662947
72276FA92754590CB824E8FAD4715975FA316B33
247106A405B288A46E70A0262717162D0903E734
534CD27BF6CACC7C72F9E0F40F06D748F2ED67BD
AD5F20A413B8315F1C5F0C9AED79C98315763306
9A933E0E07659752DAAD19B01C72CA89E4D2F9DA
E93B5FC1892B69316184F1DD1EA0C5F7716F8596
816A8A8C3DEDB3E85C4061B5A3856139109DFE0A
67BE49EDD179FC49177DB05C1FE847DE50868A36
0FA8188F72A156AD14530F76BFF0C73571D53155
8A63C019620165B85120C8DEB3362D0795020486
C2826E266D7405D34EF89762636AE4B36E86CB5E
E4D3066BD561F9CF92D125438BCDF21A50C3B15F
42D9EB484D6DEDF51525CA794466E97D7BA8E927
188B39CEEECB6E612E01B1F70BFD30035F703E28
263C1BA861350F3767F9A0652774BC6D03FEBCAF
01ED4F29ECCEF3110717C21D3E4498F409472C39
A3E0FB7EB38ADE229D5D7C33BD74DD0C62BED9B1
9219BF9ECE3D999A5D1F61BB4C9137DCBC92B3C8
4B9B82B565542082E0771F004DC0DE1E36DF9D8B
4CDB3CA20337E1FFCB6F1774C3F7D01FB4C79C76
D5C499A025552656830D43DC9898FC98B7A4877F
9BFC392E149E2DAE1EE95D4935460FB7577DA820
D6E0A87E68B8507CE86B7A1CB55E3439E83658B0
3D47641F2FBFCCA012DCC5D7ECF417D67AB5ADE4
E10EF1C63E2917432901069CF23B7A477DFCA8CD
D801A6C35B3A99777418009D582A93945EB5CEDA
AAD5B08F9A361C6195F93DE2D05380C5305CF28E
3669B628023E6B2E7053DBC6102E81DE716FCC41
7C04B5FDF11A158E8D895324B71FAB475A503CE2
A78740A1A3BB273EF8609F2348B59C7E3488F9A0
BE71950968995D30B579D8EDF7C2F732C76A33C7
BC09B1122F3C3061F0E9166A3BB22C6436977CF3
C3751F51A2A1F3B5BB8C37B024D82AE83CFA9C8D
63B8502CE5D1D432E9C75F2C737E97CD546B7A9B
63FA9E2C0E96B578FD4C904DEBE0C583294FEF57
62662A376B47FDED50A9CB3D316691B7C3903C3A
86E669C397F181F8B816A62450A73415E7F6B2CC
BFCFAF4662C3493D4CFB05759A0F34D4868A08CF
6C76A1BABA43BCCAEE1E34A9FA46665FDA43BD5A
45B82B775FD5FC5CE9904910676F64CC9EA211C1
423C4D044F069B6435BFFC896F368FD335D0EF36
F5F4B59FF6EB1516F32F47B85F42DAAD82A8AA6F
A00729B991C801A4E970929220300CBA45F0A440
67FC406B755AC198F0DFE4313157AE011222511B
8360BEACD4B4334CAB4208D3355F459F099486F0
070A726C6E4418DCF0213874F0C16D93B041E935
FD05E73DC9C71E02E4461D8E5C71DF7C6BC54C4C
7A6ACC1DA884DD30248488FA69557D3C5D5651EC
97E5CB413CE705A0DB1882F2CBC822D26710F67B
46C7401992CF5E2518F8CC8BF505FFE9F65EBC48
4645F5AB98C6E3EFD59BEE793F371086DDD7C260
F4F26A16D4B913CF3208E664E3DD384E56CE77AF
F5FB01DEA6E59CA6DD057054F4A3FF72DDE1D5C6
75107F3EF32EC5F1D2FC9EBE4F158237AE459B7C
02B2908CC07933817116063A72830012A2E72B22
97FE2A4C776C584565BC38BCB8B95F16CA64A8EE
38DAFCB661E4691200C916BE33859593F28759B2
1A38C37342190E96F33967BA9CA0F13B6BFBC70F
0D0E690EFF634B60AECE5663B6352D0D12589B06
0BDCDE67613F3D5F5BCD5A5E368118484A10022D
FD9725D22843091F8D61D5BD4242DF62DD7F3AE9
AFD335D34EB9C673D867EA441C99F3504A644063
10EE7ED28E5C63FDE1C4CB0F1D7CEC78CBD20D8E
65D97276BD73DFDD098DEB599C9B2A1996DB660D
9924E5214957AC3AC5E3BFE1E20F714CA1963C06
41E312CE9E4D27ABC7C90266B115DC70D4849C19
53969D17008385390859143FF6B5DCA2828079F2
236037C6984A62F3B40068113AF4D4F8BFFB3BAC
873D2BF7E405A66940627BE8BE3D53188C8A904B
6144A1072913A8E7572DC4BEA0E0056CCE2C10D1
E98548AD614069B6AAD3E25E8687546DA16B32CE
602C3FBD1A20D30BF764130B50D28876386F8E66
82AAEE91D12CAD6D30676C5210B00BF2236DCD21
2AD280D97B0719D024FC1FAB5C4A6E6A86F723CB
2ABD9AA74AFD75B5E68579BBC4E289FC95C16B07
1B55AD81148C4324CF428F6A6B84E7D22D60AAB2
D2D3DCBE5654B1DEB3C93FE6452BDC71BE93B9E2
827088A0C3127E89C6F72F373C5B3EF7E8A4125B
17661DFBA03E6AAA09142E012D216864F01D1F5E
9151B539751B891401C745A9DE301CBDBADF3FB6
377516ABDA1E249F3DAD9DCF120A6D2C2A5C89B7
90854CE574D03218DF2E7B4A054AA53F6951C1D2
ACABAFAB17A0B14180114EC0A22D712F994CD9C8
440FF68A35E03995AC55E457A67EB1680F9A7CDD
9332F54E27F32B32BF06D70F35CB4FDF6505597D
872FA06D68DB94F178D4F866C5441844D17C38D5
0488A2BAC10E233C8924338A8D55666E8058A161
1AC310BEF1FCF36E941B55ACD29DDCD2D00EE8ED
8A51339879AA673DC0246BDE374F099AFA6DB2E8
D46CFE2B2F6CBBE62B728A03ACA0239A633DD298
023E8E7D5F1FFB147F6C6AC233E4E2100B4C6900
BC43110E112A64798FDFCD8E1526E5ED57766FF4
A8667EDD559F9F7DA9F5BC1008D4467BF9B889A4
C16FF035657C7C638B02AE1753D7E3136A5F0624
D7F41F5F862E5F467B615152C107E53B43347A1D
3664D5D58C1A115DFC25B4D86DE65EE65269250B
9A6207A5FEE6225A300CA316DE4BFEF56BC9FC81
48C54232DA918B0B82357FED943F8194D6F0405E
B8DB2EC6797B19B9164393DA568ACF45DE07EB0F
3D5829DA0C230A03F1779EAA2FB344BC47A787D1
74D12DC2F6C67965BBC08A4C30FF005F044581E2
658B1B3F412A20F9394E77E93E91619E378AEB6C
B29C148AC5D146CA9CDB0905823AC9B7766F0039
878EE652D70FC6B7C819B3E00FAF4C5AC2DFC53A
4A9698A2E5B174E6FE81B2DFAC1BE9B5C7ECA4C6
4BEFF1E4579063AE72DA6CFA3C346FA122DBC469
F42BF6BE4C944BD0DA928421FE5E325162C08496
13C3862AF3C8A32FF40E1DB5488B368B8322FC7F
5317F0485013EE980537285EBF1347804EADE6C7
AD80F4F62DC55FBC61A63846D6570023567EA757
FBB92E68A6F877C4DD2FD8E74FA00F21F2995EE5
5B4994EBE1BB1371343525B6D4E8207FAEE9AB83
CD357605614F6BF555315B75DCE0E3F73BDAB3A5
B1819F88F65967EAEDFF615708C54F2BF832DEEC
533DA90FCA1A2AAA5BB1939E222DA9D9FE9A5195
0DC412DBC9BF0B4FCAC77A3B73AA07AA4FDEBD45
D8A76A01F14B626BCB388F53909BAF6B7298C0B4
5629E2AE7B02FCA1D84162913075679C8F2FD4FD
E84990CB9BF8E3AB0BCAE8A649CB30FE4DC4D767
F66529DF6177DF6A74911157B48A2668AB5F9962
56675261CC68026A1AB4F3EAE444FDE4C3A092C9
7A164F53AF93B80965FF9FDF446D5849B14B3FDA
C8AF0B661078FA075B5B4E80FF37E0597BC8CE93
9BE40CFC227CB8C81CBA3E3269C09C2F753E0F0D
31DF7C2685F9DB846C8BC8FC49B6C9E997BA8062
3BBB61A07435CD781BEDC637CDC9413FC4A6C674
E6332590A2D49E62E88B8632C74459307E6DA7EE
298DD33E8FC3EEEB5E9DC63D9E7E7B4B62F84383
07E6EF24E163E2F6166BFB10582288C9BC5370B5
329B78A5C9EBC2043242DE90CE1B7C6B1BA6C692
9FC32441F3E04946432D86E81A99F96718B9738D
D534700973D8D44EF041E47891D9A16482C657A4
4CE9E54D353BD97238CF551F10A35AEDDDBE6504
237014489151D07CE77A21061083D00FC5CF93F7
A9215DBCB4186C547DCA291B888FF30D966573C5
94C95DA1E850BD85209A4A2AF3E1FB1604F9BB66
D772DA0874059418FCDAACE3F4FF2AC964A852FF
BA1C718242F1B46611C8425BFF6F7AA04F381FCA
33E4E80807204C2B6182A3A14B591ACD25B5F0DB
64D253D88595176B07079E89775176834214B86F
A3DF966D0CB2D84AF8F16C855B97C49364F5D8C0
40CEF3046C916ED7AE557F60E76842828B51DE53
956A6D75483E2BBF7B68B6A3E7213A0EF4181157
02D65B95E28370C1570095FA88F923DD937FAD8F
4705E9B8F1C9E1ADDCD937976297B082765BA3DC
AA950AAD16265917F7DADA5D662F778FB00F82D9
1F7790399A1DABF825E594D113A16207D025BF15
94F162B98A4EE6EFD189829C8E446B02E3040F58
E5C8EA53E49D5A977DAD56AD14BB0D2A61A66491
4CC0BF9C4B987E22F38A6036B143272BCC136063
19DD644AE504F8A1FE5828AF1ED9AD4981DB6209
B527840A212DD4F9B31E20C8ADB1E6BBF65E5D42
A37A21E728AB28240FC9FE3B7C8EEFC0526BA702
239A6B191FAE13FBCF57DBEB753DD6C3E3D728F3
59A08D6E9521370D87CB940AC851075957429097
799BCA97824C88027A7EE452A852F8605E14EFF1
E41F899E73D75DB8215A8636BD8D71065357A547
60A801B346164B6153D75D33ABB3623A0D7CC4A1
63A5C713AF0234AAAD44C486D72ED28530DB49F0
C10C45EF19C80B4C1E766C85EBFBE08F0C1621DC
6B8D76DA69A25160E5D6710C350153BF260FBF9E
50CF0E88EA5C729582753A5AAED2CC7CD1F7DA3A
B773C7022AC5462FA35F4A174B11039738A926C3
C69BF80251259982D5A5AD376A11F88F315ED4A7
98CBBD74D3F49DFFB7D0F4D7A2AEB6F408B16070
A9D6C26549CD6AFF623268033FEBA9972DD7D52E
621C64AF3FCF629AD39F66E90FCAD52575C72D92
FEDC60489C682D1EA555DBBFDC1407193EF9668F
225DCB787E5ED5C999FFA6E21D1D7951151A4659
8A8B7ADD83356C4CE6752837F626B5059F5B54C4
0B2280EF840ADF325520B70D8785512F5148A21F
F64B6A9972A8431D67334E9AD7B0EF61DC05568E
39F1296A956B7BF8890736E528E079043A6DEC51
E63B70066CAD59472F71A28BD855BBC6FC5953A1
16943A59FB412FB8B162616E2A38B1F799FA2FED
B6A4F662D11FE5FD41551C3A990EF9D19008AD9F
04A79EE453BE3270ABB82AB8D76F375F071A4BBE
B6A3745B580EAA12156797FC7024D41ACCE6913F
E400A8BF048C58EA28EDBC68CCC687C86FB8E94F
034CA46B8B3D30493751A2FD7C5C1F25C590657F
0965F952D2D60172CD843C3DA0587EB01F5608BC
1893205276C4448E00ECBD613E5FC75CB672ACC9
4D9982C9433EAB28F8B13083A8BE539683B99859
046AA16D28967A45B2E510985DB4E97755CB47D1
7CF0F32C72044A017E7C8713689475579237A5BD
8A3455B4DEA65DC4B252D2945240CC070CC7D4E4
1CCDA0E13FAEEBFA311DBC1048FB28540394AAD7
F222201E88F57605166FD013BD6AE0B55B9080C6
6F1DD38152858D067BAB9A76C1519C167619BA77
38525C7140D285040E02DD2A7F3C7DBA21042E01
328925461F4AC00F4F56C04F8C910747736412F4
E859530DA7D703D60C8F7266F6C185064F6A1163
D782515E87BE217CCBA9756F7119D7178908404D
10F0F1E452B8D07183D02AC3DF97D0911E98473F
30689DC2681EBCE0E5BB56C0D3E911977850C5A3
3E8C75C5FD74FF3C3982EBB40CC55061536CDBF8
06035EFCB0B44637E58792AA9542B03B3EFC5E9E
DCB5B1F4AD57503D8848A03B04B8A24CCB88AEBD
FF2EBF2ECE71D2701B31F21FB7DF7724B9FCCB0F
B6BF99083A40E79BB0759FA01EBC6A1EA4BD133C
30EDCDA37AAA6783E150F06BB9210A7AABCBE5F0
F25444F0ED9FA9FC4100EFF73396B8DC1328CAE8
8A8C3F4422580DC6D310BEFC77B78700F221B9C2
86C797712FADFDC412856727C1D4E014162FF37A
6A358A037C23F9D3953522479ADFB673821DFE0E
F34DDECF3EA10BD2E2F6308ED1CE537B093578B3
AC97D4A7CC76EB8B73EF6F231B3EEE144DF128A3
E1400C1EB5DBF7AAD5E8AD740F749A6ED479A8C1
1EB0B157FD04A2D3A53C014F27C117C3A4DCD8F3
E2CC0C66BF6B8BDED6C627B512AA25F778BCBF06
F720E347B8264EDE664EA67F9FDB7903BC80AA72
7714106DD46511A6F1E4E1CF4B66378E5849446B
525C47FB3A5E0655FBD4BE963CA1E94D5FECB43D
9B8B0AF7E12F6C4FC6C2F82DBFD55BBA4700E8FC
F6715A5E1669B18194CD53355E632C26EAFF6D39
4874CCFC108EF73667C5A11B0BAB84746017F2E6
112325A40E1807575D205350C75D5FE4213438C5
246EFBB8B71927A0D2F2B726508E8F3A3D42EA51
A729C1982468C774021614EE8ECA0B7B781B51C7
78274C6D3B56C2C28F8A9240F7543A3C1A27A136
42B2BECED24A95A5D537F796CF50168C5413F8B5
529455C83DB706559EA0A8059734E2C2C5AFA874
E21E9FB57BA6DF8F7484ABCDCFAD9ACE88917FF4
D3E28308711C7E539EBEB56D2EEDE88F7223BA79
BF357F4EC7A882B1CFE95BBAC1F2545E3CB1BFFA
D01F069332C8BC4D6B7C4AEB976E7FD5A30285C9
B9426DD6B85B3DF7F1581664672E5D14C40A3C67
D0B4C941A0C14727391705A22D198AA85637C0C0
8FDA235CFD5128B35540A2544323976979BF895D
6E711E4FBF0ED0BC918B59CB5D5F3ED24B2F4F4A
CD2DC5275D6A395C67E060FFC8B427C002A737B6
3FF48021FA0B01C16241CD6A9BC5923D44A38B70
D18ED865749FA0628112E71C73F011CEB04427C4
FAF76441F498E5DEC5C9338D9777A99247537D51
CD989334843A511A09B96BF3F2697F62C9902F07
6553216A9AF7AB34C4ECD94BC0EFFB4BC532980D
B04D70B04B4CAE0B5F86123E4CC2E3649B3DA5F1
B999BA2A89DE4002ECF0C80F2B5745D99D2574D9
3E2A08AFB111416CCD72BD3219C77A0BCE14178F
5B6B71AA17E1CA58CF7723004C71AB2FE5B32123
C1040087E622BB8E4C68036B705FF30028E2C3E6
ECA4EEDBED3A106C10652A574867E383AB8B5F19
0B4D7553A447AFC83F0ED8225A29AE9759D1C266
47961937B34CE2D12BBD2E8AB5CC96C4C493746F
4A37354A2ABC24171D5AC0D77153E44C1A5875B5
1E3451A465717D2F9A5F86359289C347D10D9F7A
BCC4B7595B73CF0757E7D320549433FE8BA9D142
88BC8673305BB0C0A0EB652751D432F285B939A3
4139CE95C5374A14A04A1C15FAEEB0177088FD2C
CA7788C32DA1E4B7863A4FB57D00B55DDACBC7F9
0FB07E231155FF10449B8AA1C7CB22B354C2E666
8D594750CAF5182039A1B516EDA712F3DCAE6339
5D6A96FF68706273E913557462889487D08F89FB
4B4C0E215FCF5B3B8668F48A2EA8A9D2AB0EA5DF
FA3B3B3C48A28F0A689C56D633554420F70899E3
5169A985192D17D5682C1D3126BBFEB1FFD434B6
1F2DBC87A8F4DDBD40D9669DEC65A9053427469A
D89E3BD43D5D909B47A18977AA9D5CE36CEE184C
BBABF44B42207395684605B5602C9D56A5508BE1
1874EAFEE7E813B46CF9433C16FEEC7FD2BCF5D9
41EEAD7050191684912D2CF03AD63596EF2E4976
30CA5A9B918ACA4F8970973CB9375AFC09079E2D
AF6686749E649FB78A378CF531933353A84D38DE
E59C6DDA590A3CEB0011552460D02E98F41F27BC
8A01E30004366B97983F9CB9031DE54645CBB6A5
E6A67AFD553B5BCBE901AAB10FA94CA82566BC27
497FAC9F8FBC810956B8FA9038B8BE150485A13C
71F8E304C692E7FCF92A17F7B0A58158656A8E94
8C2B91EFABDAC3A416066EFE2A5871AAEFF8B522
65EF1579BFC4C985EA0B2320CBF2112D6697EA3B
0B6D74B3473E21F1FD25B3F6CAFE08E65DDA9973
994BE9C30DC76DD942CE6E8C7451FD524B92DF0B
831A7F9360F7919A763E35C54A1752965BB1CAED
7C6749FDD405FBADC212D4C7B8C392129023EE26
DD46BCF1C81ED6D3D7894433608CAE682B7E20CC
E1303E8487837AAAE34BB55970F453EEB5270405
E036F01AD90C1F30FFC3C11CA337AFF9AEAD6BE7
7A5DFB3682476707C3FF0D9DEF4505DE54F1711E
B15679FD0AC8671DD99ABC2D6CACD9128EDEBAE7
D4E638A4BE992EB0411FA7595E293092EEC72224
7CF0A2CFADA67D1C09D531337D47B5F94D0E3CFA
447DC985D1B7D41A565A717AC9B0C85C8BE5A6E0
D9C8CABA980A4D6B90216097775092E0A6EFEE73
BC8A5EBDE6AE1467B56125FD112B09C14C278EAF
1A354290CFDC6883242183BF3FE7CCA3140AEADA
4334C8323E735ADFCB028B17F72913680C43DD15
A042A852961B90D5867591D0EA2B996CB9ECFEF1
BC0A6EE6C66080FD39EB82DC3325816B620DD15F
0F888036AC14BE902F9A5558A8851DCD21CE934A
D6970548458554A6F70AF2FC542024147ED504CE
7F95276D4951499FD756DF344AA24FB38CEAF678
627AD24E2334E200BE6686D73C2CEE2233E460BA
FB78E8CBEB088FE7CA8EFD72ABB73DA4EDFDBD59
C81A8BD1F9CF6D84C525F378CA1D3F8C30770E34
4C7EF252A701E802E3607881901CB30A6D2BA75E
FF993FA3F9C3DB1BC5579094386085481EBBDF45
46331F63BFA0F3BA30DBFE833F4829A8D1DC9B3A
8A7C8E8A1D8B1DE53E844D0E7C1B798740A811DE
606E301E28ED2ABD56D1746E7851A12FF60BE2FD
E54A8FDB49048DD987C27C6AFE6177569C08D770
0D91909AF3F28DAD8B0342EDACE84EB18F0A7FE9
4F9D205F580FC32FCD82A65A39C3799429EE69FE
EC102C8C7E69FAA38A4467159804EC3F50996104
91C6D6EE3E8AC86384E548C299295C756C817B81
AADBBC22238FC401A127BB38DDF41DDB089EF012
F18B538D1BE903B6A6F056435B171589CAF36BF2
FA7CFBB247427763431B7E6D75812A49CC8D30E4
20CEB1F0F51C0E19A9F38DB1AA8E038CAA7AC701
'@ -split("`r`n")
$report = @()
foreach ($line in $list){
$certificate = get-remotesslcertificate $line.endpoint $line.port
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($certificate) | Out-Null
$daysleft = New-TimeSpan -Start (Get-Date) -End $certificate.NotAfter
$chainarray = @()
for ([int]$i = 1;$i -le $chain.ChainElements.Count;$i++){
#get cert type
if ($i -eq 1){$certtype = 'Personal'}
elseif ($i -gt 1 -and $i -lt $chain.ChainElements.Count){$certtype = 'Intermediate'}
elseif ($i = $chain.ChainElements.Count){$certtype = 'Root'}
#find thumbprints in blocklist
if ($blockedcas -contains $chain.ChainElements[$i-1].Certificate.Thumbprint){$blocked = '!!Blocked by this CA!!'}
else {$blocked = 'Not Blocked by this CA'}
$chainarray += $chain.ChainElements[$i-1].Certificate | Select-Object @{label = 'BlockStatus'; expression = {if ($certtype -eq 'Personal'){'Not Applicable'} else {$blocked}}},
@{label = 'CertType';expression = {$certtype}},
Subject
}
$chainout = $chainarray | ForEach-Object {$_ | Select-Object @{label = 'out'; expression = {"$($_.BlockStatus);$($_.CertType);$($_.Subject)"}}} | select -ExpandProperty out
$report += $certificate | Select-Object @{label = "Endpoint"; expression = {"$($line.endpoint):$($line.port)"}},
Subject,
Issuer,
NotBefore,
NotAfter,
@{label = "DaysLeft";expression={$daysleft.Days}},
@{label = "DNSNames";expression={$_.DnsNameList -join($delimiter)}},
@{label = 'CertChain'; expression = {$chainout -join($delimiter)}}
}
#Получаем полный отчет
#full report
Write-Host "Full report" -ForegroundColor Green
Write-Output $report
#Отчет по сертификатам с валидностью меньше $triggerdays дней и #блокировкам
#reports with expired/blocked certificates
Write-Host "Warning" -ForegroundColor Yellow
$report | Where-Object {$_.DaysLeft -lt $triggerdays -or $_.CertChain -match "!!Blocked by this CA!!"}
Если в списке оставить только pop.rambler.ru с портом 995, то вывод будет следующим:
Автоматизируем проверку
Вы можете прогонять эти скрипты вручную или настроить их автоматическое выполнение с последующей отправкой e-mail’а, экспортом в Excel-файл любым другим результатом.
Для формирования отчета в Excel вам потребуется:
Установить модуль ImportExcel:
import-module importexcel
Добавить экспорт в Excel, при необходимости указав массив параметров, которые нужны в отчете:
$report | Where-Object {$_.DaysLeft -lt $triggerdays -or $_.CertChain -match "!!Blocked by this CA!!"} | Select-Object endpoint, issuer, daysleft, dnsnames |Export-Excel c:\report.xls -AutoSize -AutoFilter
У модуля ImportExcel достаточно много дополнительных возможностей — например, можно настроить «подсветку» нужных вам строк (к примеру, выделение красным цветом строк в столбце DaysLeft, если проверяемому сертификату осталось недолго) или другие фичи.
Ну и минутка позитива напоследок.
Во-первых, пока еще не все корневые центры сертификации присоединились к санкциям, а значит, они пока продолжат выпускать SSL-сертификаты для российских доменов. Например, нас пока не забанил CA Globalsign, также есть Intermediate CA, которые могут выпустить сертификат — нужно только их поискать. Так что, не все так плохо.
Во-вторых, в России наконец-то открыли первый собственный Национальный удостоверяющий центр — сервис выдачи уже заработал на «Госуслугах». Однако, чтобы сертификатам, который он выдал, было доверие, этот корневой сертификат нужно установить на каждую машину пользователя. Если в организации используется домен на базе Active Directory, распространить этот сертификат групповыми политиками не составит труда.
ky0
Вы не путаете российские домены с (весьма немногочисленными) доменами компаний, непосредственно попавших под санкции?
Вот уж правда наконец-то.
Лично я давно жду не открытия православного УЦ, которое помимо дальнейшего огораживания рунета изнутри смысловой нагрузки не несёт, а внедрения ECH на радость DPI-системам.
Winntuk Автор
Нет, здесь всё верно. Как раз, те, кто находятся (или их туда добавили совсем недавно) в том списке, о котором речь (https://www.treasury.gov/ofac/downloads/sdnlist.txt), могут лишиться своих сертификатов, практически в любой момент, даже всеми любимый letsencrypt тоже обязан этому списку соответствовать. Речь как раз о невыдаче сертификатов, у которых в поле Country указывается RU. Вот, например KB у Digicert (https://knowledge.digicert.com/solution/Embargoed-Countries-and-Regions.html). Здесь помимо РФ есть еще Куба, Иран, Северная Корея и Сирия, а также несколько TLD
По остальным CA в явном виде такого списка нет, везде просто написано, что "в соответствии с политикой государства", но тем не менее, много у каких издающих центров (партнеров) есть свои KB на тему блокировки, например GoGetSSL https://www.gogetssl.com/news/27.html
ky0
Что-то я не припомню при выпуске сертификата через LE момента заполнения поля со страной.
Бывают российские компании с доменами в интернациональных зонах. Бывают, наоборот, транснациональные компании с сайтом в зоне .ru — как безошибочно забанить одних, не затронув других? Так что глобальный запрет для РФ (не по tld) на выпуск сертификатов мне видится маловероятным.