Настройка проверки формата сертификатов
Сервис Проверки Подписи «КриптоПро SVS» позволяет настроить дополнительную проверку соответствия полей сертификата установленной форме.
Проверка происходит на основании структуры полей, представленных в следующих правилах.
- Версия (version). Версия сертификата должна быть не ниже 3.
- Серийный номер (serial number). Проверяется наличие номера и отсутствие в нем недопустимых символов.
- Алгоритм подписи (signature). В поле algorithm, входящем в состав поля signature, должен содержаться идентификатор используемого алгоритма подписи:
- ГОСТ Р 34.10–2012 с ключом длиной 256 бит: "1.2.643.7.1.1.3.2", szOID_CP_GOST_R3411_12_256_R3410
- ГОСТ Р 34.10–2012 с ключом длиной 512 бит: "1.2.643.7.1.1.3.3", szOID_CP_GOST_R3411_12_512_R3410
- (для архивного хранения и проверки подписи) ГОСТ Р 34.10-2001: "1.2.643.2.2.3", szOID_CP_GOST_R3411_R3410EL
- Имя издателя (issuer) — проверяется только наличие его в сертификате.
- Дата и время начала действия сертификата (notBefore).
- Дата и время окончания действия сертификата (notAfter).
- Имя владельца сертификата (subject).
Возможна проверка следующих компонентов имени владельца сертификата (компоненты имени проверяются на допустимые символы, длину, если такие требования имеются):
- ФИО или наименование владельца (и другие сведения, если требуется) (commonName, title, surname, givenName)
- Местонахождение (countryName, stateOrProvinceName, localityName, streetAddress)
- СНИЛС (SNILS)
- ОГРН (OGRN)
- ОГРНИП (OGRNIP)
- ИНН (INN)
- ИНН юридического лица (ЮЛ) (INNLE)
- совпадение общего имени и наименования организации (CN=O)
- тип идентификации заявителя (identificationKind)
- Открытый ключ (subjectPublicKeyInfo). Проверяется только наличие его в сертификате.
- Дополнения (расширения) сертификата (Extensions). Проверяется только наличие следующих расширений в сертификате.
- Authority Key Identifier, OID.2.5.29.35, идентификатор ключа УЦ.
- Key Usage, OID.2.5.29.15, область использования ключа.
- Certificate Policies, OID.2.5.29.32, политики сертификата. Для данного расширения проверяется содержимое в соответствии с требованиями, указанными в Приказе ФСБ РФ от 27 декабря 2011 г. N 795.
- Subject Sign Tool, OID.1.2.643.100.111, сведения о средстве ЭП владельца сертификата.
- Issuer Sign Tool, OID.1.2.643.100.112, сведения о средствах ЭП УЦ и средствах УЦ.
- ExtendedKeyUsage, OID.2.5.29.37, расширенное использование ключа. Состав дополнения (расширения) зависит от информационной системы, в которой используется сертификат.
- CDP, OID.2.5.29.31, точки распространения списков сертификатов, досрочно прекративших действие (CRL).
- IdentificationKind, OID.1.2.643.100.114, идентификация заявителя,
- privateKeyUsagePeriod, OID.2.5.29.16, срок действия ключа подписи.
Проверка сертификата выполняется при помощи специального плагина. Для активации проверки
сертификатов необходимо зарегистрировать плагин с помощью Windows PowerShell. После
установки КриптоПро SVS плагин находится в директории <Путь установки>\Plugins\certverifiers\
и называется SVS.CertificateVerifier.Qualified.dll
.
Для регистрации и настройки плагина проверки формата сертификатов используются командлеты Add-VsCertificateVerifierPlugin, Get-VsCertificateVerifierPlugin, Remove-VsCertificateVerifierPlugin.
Для настройки проверки того, что сертификаты выданы определенным УЦ, необходимо выполнение следующих действий:
зарегистрировать отпечатки корневых сертификатов в КриптоПро SVS. Работа с отпечатками производится при помощи командлетов Add-VsQualifiedCAThumbprints, Get-VsQualifiedCAThumbprints и Remove-VsQualifiedCAThumbprints. Если отпечатки не заданы, данная проверка сертификатов проводиться не будет.
установить корневые сертификаты УЦ в выделенное хранилище КриптоПро SVS. Хранилище создается автоматически при установке КриптоПро SVS и имеет название вида
<Имя веб-приложения SVS>-TSL
.
Пример настройки плагина
# Регистрация плагина и настройка пути к файлу TSL (Windows)
Add-VsCertificateVerifierPlugin -Assembly SVS.CertificateVerifier.Qualified.dll -PluginDescription "Проверка сертификата на соответствие установленной форме" -Parameters @{'TSLPath'='C:\TSL.xml'}
# Регистрация плагина и настройка пути к файлу TSL (*nix)
Add-VsCertificateVerifierPlugin -Assembly CryptoPro.Plugins.VerificationService.CertificateVerifier.Qualified.dll -PluginDescription "Проверка сертификата на соответствие установленной форме" -Parameters @{'TSLPath'='/path_to/TSL.xml'}
# Добавление отпечатков корневых сертификатов Минцифры РФ
Add-VsQualifiedCAThumbprints -Thumbprint 4bc6dc14d97010c41a26e058ad851f81c842415a
Add-VsQualifiedCAThumbprints -Thumbprint aff05c9e2464941e7ec2ab15c91539360b79aa9d
Add-VsQualifiedCAThumbprints -Thumbprint 2f0cb09be3550ef17ec4f29c90abd18bfcaad63a
Если плагин зарегистрирован и настроен, в веб-интерфейсе КриптоПро SVS при проверке сертификата будет выводиться дополнительная информация о соответствии его заданным правилам. При проверке ЭП также будет осуществляться проверка данного сертификата.
Дополнительные параметры плагина:
- LocationCheck – требовать обязательного наличия компонентов местонахождения (S, L, STREET). Возможные значения: true, false. Значение по умолчанию false;
- OrganizationNameStrictCheck – требовать совпадения значений компонентов имени CN и O в сертификате. Возможные значения: true, false. Значение по умолчанию false;
- INNforLECheckMode – режим проверки ИНН ЮЛ. Возможные значения: Any, Soft, Strict. Значение по умолчанию Soft.
- Any – требуется присутствие INN и/или INNLE;
- Soft – требуется присутствие INNLE; присутствие INN докускается;
- Strict – требуется присутствие только INNLE.
- TSLPath - полный путь к файлу TSL.
- EnforcePrivateKeyUsagePeriodCheck - проверка срока действия ключа подписи. Возможные значения: true, false. Значение по умолчанию true. В случае значения true нарушение срока действия ключа подписи будет восприниматься плагином как ошибка, в случае false - как предупреждение;
- GovernmentIssuerList - список издателей, чьи выданные сертификаты будут восприниматься как сертификаты госслужащего. В параметре необходимо указывать значения CN допустимых издателей через запятую;
- PersonRdnExcludeList - компоненты имени, недопустимые для сертификатов, тип которых определен как сертификат физического лица. В параметре необходимо указывать список OID, разделенных запятой;
- EnterpreneurRdnExcludeList - компоненты имени, недопустимые для сертификатов, тип которых определен как сертификат физического лица, являющегося индивидуальным предпринимателем. В параметре необходимо указывать список OID, разделенных запятой;
- JuridicalRdnExcludeList - компоненты имени, недопустимые для сертификатов, тип которых определен как сертификат юридического лица. В параметре необходимо указывать список OID, разделенных запятой;
- JuridicalForeignerRdnExcludeList - компоненты имени, недопустимые для сертификатов, тип которых определен как сертификат филиала (представительства) иностранного юридического лица. В параметре необходимо указывать список OID, разделенных запятой;
- JuridicalRepresentativeRdnExcludeList - компоненты имени, недопустимые для сертификатов, тип которых определен как сертификат физического лица, действующего от имени юридического лица без доверенности. В параметре необходимо указывать список OID, разделенных запятой;
- GovernmentRdnExcludeList - компоненты имени, недопустимые для сертификатов, тип которых определен как сертификат лица, замещающего государственные должности. В параметре необходимо указывать список OID, разделенных запятой.
Пример регистрации плагина с дополнительными параметрами:
Add-VsCertificateVerifierPlugin -DisplayName $vs_name -Assembly CryptoPro.Plugins.VerificationService.CertificateVerifier.Qualified.dll -PluginDescription "Проверка сертификатов на соответствие установленной форме" -Parameters @{'TSLPath'='/opt/tmp/tsl/tsl.xml';'JuridicalRepresentativeRdnExcludeList'='2.5.4.3,2.5.4.2';'GovernmentIssuerList'='УЦ ООО Лунный свет, КОРНЕВОЙ УЦ ИП Иванов'}
Проверка УЦ на принадлежность к заданному списку
Для проверки УЦ на принадлежность к заданному списку УЦ необходимо указать путь к файлу со списком
УЦ Tsl.xml
в параметре TSLPath при настройке плагина.
Файл Tsl.xml
публикуется по адресу https://e-trust.gosuslugi.ru/app/scc/portal/api/v1/portal/ca/getxml
.
Загрузка файла Tsl.xml
возможна следующими способами:
- при помощи утилиты TSLTool
# Для Windows (необходимо перейти в директорию установки)
DSS.TslTool.exe --skipcrl --skipcerts --skiproot
# Для *nix
tsltool --skipcrl --skipcerts --skiproot
Файл TSL будет загружен в папку tmp
в каталоге утилиты TSLTool.exe.
- при помощи команды
iwr
в консоли PowerShell (только для Windows)
iwr -uri https://e-trust.gosuslugi.ru/app/scc/portal/api/v1/portal/ca/getxml -OutFile E:\tmp\tsl.xml
SVS автоматически отслеживает изменения файла TSL, путь к которому указан в параметре TSLPath. Скопировать актуальный файл TSL можно с помощью скрипта, приведенного ниже (только для Windows). Данный скрипт возможно добавить в планировщик задач и выполнять раз в сутки (или чаще).
Пример скрипта копирования TSL:
$ErrorActionPreference = "Stop"
# Полный путь к загруженному файлу TSL
$sourceFile = "E:\tmp\tsl_source\tsl.xml"
# Полный путь к файлу TSL, используемому SVS
$destinationFile = "E:\tmp\tsl_target\tsl.xml"
# Загрузка файла TSL
wget https://e-trust.gosuslugi.ru/app/scc/portal/api/v1/portal/ca/getxml -OutFile $sourceFile
if (!(Test-Path $sourceFile -PathType Leaf)) {
# Загруженный файл TSL отсутствует
Write-Host "Файл TSL отсутствует! " $sourceFile
exit 2;
}
$targetFolder1 = Split-Path $destinationFile -Parent
if (!(Test-Path $targetFolder1 -PathType Container)) {
# Не существует каталог, в который требуется скопировать файл TSL
Write-Host "Каталог не существует! " $targetFolder1
exit 2;
}
if (!(Test-Path $destinationFile -PathType Leaf)) {
Write-Host "Копирование нового файла TSL..."
# Целевой файл TSL отсутствует
# Просто копируем файл TSL
Copy-Item $sourceFile -Destination $destinationFile
} else {
# Целевой файл TSL присутствует
# Копируем файл TSL при помощи временного файла
Write-Host "Замена существующего файла TSL... "
$targetFolder = Split-Path $destinationFile -Parent
$tmpTslPath = Join-Path -Path $targetFolder -ChildPath "temp_tsl.xml"
if (Test-Path $tmpTslPath -PathType Leaf) {
# Если временный файл существует, удалим его
Remove-Item $tmpTslPath -Force
}
# Копируем TSL во временный файл
Copy-Item $sourceFile -Destination $tmpTslPath
# Перемещаем TSL в целевой файл
Move-Item $tmpTslPath -Destination $destinationFile -Force
}
Настройка выполнения проверки полей сертификата по умолчанию
Проверка соответствия полей сертификата установленной форме при помощи описанного в данном разделе плагина
может применяться по умолчанию как в веб-интерфейсе SVS, так и при обращении к SVS с использованием REST API.
Для этого в настройках плагина необходимо указать флаг CheckByDefaultRequired
.
Пример:
Set-VsCertificateVerifierPlugin -ID 1 -CheckByDefaultRequired 1
В зависимости от интерфейса SVS данная настройка будет применена следующим образом:
- в веб-интерфейсе SVS - напротив пункта "Проверка сертификата на соответствие установленной форме" (или иной формулировке, если это было указано при настройке плагина) в разделе "Дополнительные проверки" по умолчанию будет активирован чекбокс. Пользователь может самостоятельно отключить проверку, деактивировав данный чекбокс перед отправкой сертификата на проверку.
- при использовании REST API SVS - параметр зависит от переданного в запросе списка CertVerifiersPluginsIds:
- если список передан - проверка не учитывается, будут применены плагины, указанные в списке;
- если список передан со значением NULL - проверка не учитывается, никакие дополнительные проверки к сертификату применяться не будут;
- если список НЕ передан (отсутствует в запросе) - проверка учитывается, сертификат будет проверен в соответствии с настройками плагина, описанного в данном разделе.
Для прикладных систем, взаимодействующих с КриптоПро SVS через REST API, но не умеющих обрабатывать результаты дополнительных проверок сертификатов (параметр CertificateVerificationResult), можно включить неуспешный результат проверки в основное сообщение об ошибке (параметр Message). Данное поведение можно настроить при помощи следующей команды.
Set-VsProperties -IncludeCertPluginErrorInfoInMainError 1
Restart-VsInstance