doc/IT/CADES/AI/cryptopro-csp2.md
2025-11-25 17:06:54 +03:00

476 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## CADES-XL end cryptcp.exe
## 1 Подписание
Алгоритм подписания CADES-XL c использованием утилиты [cryptcp.exe](https://ca.kontur.ru/Files/userfiles/file/Faq/cryptopro-license/%D0%96%D0%A2%D0%AF%D0%98_00087-01%2093%2001_%20%D0%9F%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8%20%D0%B8%20%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2(1).pdf)
### Think
Алгоритм:
- Толстый клиент СЭД: Получение документа для подписания УКЭП.
- Толстый клиент СЭД: Запуск cryptcp.exe с передачей необходимых параметров, включая:
- Путь к файлу документа
- Тип подписи (CAdES-XL)
- Параметры для OCSP (адрес сервера) и TSP (адрес сервера)
- Место сохранения подписи
- cryptcp.exe (используя КриптоПРО CSP) выполняет:
- a) Загрузка и проверка цепочки сертификатов (корневые и промежуточные УЦ из хранилища Windows)
- b) Извлечение сертификата подписанта с Рутокен (запрос закрытого ключа для подписи)
- c) Формирование хэша документа
- d) Подписание хэша закрытым ключом (с Рутокен) и формирование CAdES-BES
- e) Запрос OCSP-ответа от указанного сервера и TSP-метки от указанного сервера
- f) Формирование CAdES-XL контейнера (включая OCSP и TSP)
- cryptcp.exe возвращает управление толстому клиенту СЭД, который получает файл подписи (CAdES-XL) и исходный документ (если не был изменен).
- Толстый клиент СЭД: Формирование Описания электронного документа (XML) и передача трех файлов (документ, подпись CAdES-XL, описание) в хранилище подписанных документов.
Однако, note: в документации указано, что cryptcp.exe может выполнять подписание с усилением до CAdES-XL, но для этого нужно указать соответствующие параметры (например, -cadestype XL, -ocsp и -tsp).
Пример команды для cryptcp.exe:
```
cryptcp -sign -dn "CN=Иванов Иван Иванович" -cadestype XL -ocsp "http://ocsp.kontur.ru" -tsp "http://tsp.kontur.ru" -detached document.pdf document.pdf.sig
```
В этом примере:
- sign - команда подписания
- dn - субъект сертификата (может быть опущен, если сертификат выбран из хранилища)
- cadestype XL - тип подписи CAdES-XL
- ocsp - URL OCSP-сервера
- tsp - URL TSP-сервера
- detached - отделенная подпись (если нужна присоединенная, то не указывается)
Но note: в случае использования Рутокен, cryptcp.exe должен иметь доступ к контейнеру закрытого ключа (через КриптоПРО CSP) и сертификату.
Алгоритм с использованием cryptcp.exe:
- Толстый клиент СЭД: Получение документа для подписания УКЭП.
- Толстый клиент СЭД: Подготовка параметров для cryptcp.exe (выбор сертификата, указание OCSP и TSP серверов, пути к файлам).
- Толстый клиент СЭД: Запуск cryptcp.exe с подготовленными параметрами.
- cryptcp.exe (с использованием КриптоПРО CSP и драйвера Рутокен):
- a) Загрузка сертификата подписанта (из Рутокен или системного хранилища) и проверка цепочки доверия (корневые и промежуточные УЦ из хранилища Windows).
- b) Формирование хэша документа.
- c) Подписание хэша закрытым ключом (с Рутокен) и формирование базовой подписи (CAdES-BES).
- d) Запрос OCSP-ответа от указанного сервера для сертификата подписанта.
- e) Запрос TSP-метки от указанного сервера для подписи.
- f) Формирование CAdES-XL контейнера, включающего базовую подпись, цепочку сертификатов, OCSP-ответ и TSP-метку.
- cryptcp.exe сохраняет подпись в указанный файл и возвращает код ошибки (успех/неудача).
- Толстый клиент СЭД: Проверка кода возврата cryptcp.exe. Если подписание успешно, то формирование описания электронного документа (XML).
- Толстый клиент СЭД: Передача трех файлов (документ, подпись CAdES-XL, описание) в хранилище подписанных документов.
Таким образом, основная работа по формированию CAdES-XL перекладывается на cryptcp.exe, а толстый клиент СЭД управляет процессом через командную строку.
Важно: cryptcp.exe может потребовать указания конкретного сертификата, если их несколько. Это можно сделать через параметр -dn (отличительное имя) или -thumbprint (отпечаток).
Также note: cryptcp.exe может быть запущена с параметром -pin для ввода пин-кода к Рутокен, но ввод пин-кода может также производиться через диалоговое окно, если пин-код не указан.
**Уточненная последовательность:**
- Толстый клиент СЭД: Получение документа для подписания УКЭП.
- Толстый клиент СЭД: Формирование команды для cryptcp.exe, например:
```
cryptcp -sign -thumbprint <отпечаток сертификата> -cadestype XL -ocsp "http://ocsp.kontur.ru" -tsp "http://tsp.tensor.ru" -detached "C:\doc.pdf" "C:\doc.pdf.sig"
```
- Толстый клиент СЭД: Запуск cryptcp.exe и ожидание завершения.
- cryptcp.exe выполняет все криптографические операции, включая взаимодействие с OCSP и TSP.
- Толстый клиент СЭД: Проверка кода возврата. Если 0, то подписание успешно.
- Толстый клиент СЭД: Формирование описания электронного документа (XML).
- Толстый клиент СЭД: Передача в хранилище: документ, подпись CAdES-XL, описание.
Это упрощает алгоритм, так как cryptcp.exe берет на себя все этапы подписания и усиления подписи.
## Уточненный алгоритм с использованием cryptcp.exe
```mermaid
sequenceDiagram
participant ТК as Толстый клиент СЭД
participant CryptCP as cryptcp.exe
participant CSP as КриптоПРО CSP
participant РТ as Рутокен
participant ОС as УЦ Контур OCSP
participant ТС as Тензор TSP
participant ХР as Хранилище
Note over ТК,ТК: 1. Подготовка документа
ТК->>ТК: Получение документа для подписания УКЭП
ТК->>ТК: Определение параметров подписания
Note over ТК,CryptCP: 2. Запуск cryptcp.exe с параметрами
ТК->>CryptCP: Запуск с параметрами CAdES-XL:
ТК->>CryptCP: -sign -detached -cadestype XL<br>-cert -pin N -ocsp -tsp<br>document.pdf document.pdf.sig
Note over CryptCP,CSP: 3. Криптографические операции
CryptCP->>CSP: Запрос сертификатов и ключей
CSP->>РТ: Доступ к закрытому ключу (по PIN)
РТ-->>CSP: Подписанный хэш
CSP-->>CryptCP: Базовая подпись
Note over CryptCP,ОС: 4. Автоматическое усиление подписи
CryptCP->>ОС: Автоматический OCSP-запрос
ОС-->>CryptCP: OCSP-ответ
CryptCP->>ТС: Автоматический TSP-запрос
ТС-->>CryptCP: TSP-метка
Note over CryptCP,CryptCP: 5. Формирование CAdES-XL
CryptCP->>CryptCP: Сборка CAdES-XL контейнера
CryptCP-->>ТК: Файл подписи CAdES-XL
Note over ТК,ХР: 6. Сохранение результатов
ТК->>ТК: Формирование описания ЭД (XML)
ТК->>ХР: Передача в хранилище: документ, подпись CAdES-XL, описание
```
## Детализация использования cryptcp.exe
### Команда для cryptcp.exe:
```bash
cryptcp -sign -detached -cadestype XL -cert -pin N -ocsp "http://ocsp.kontur.ru" -tsp "http://tsp.tensor.ru" "C:\documents\document.pdf" "C:\signatures\document.pdf.sig"
```
**Параметры:**
- `-sign` - команда подписания
- `-detached` - отделенная подпись
- `-cadestype XL` - формат CAdES-XL
- `-cert` - выбор сертификата (может быть с указанием хранилища)
- `-pin N` - пин-код Рутокен (или диалоговый ввод)
- `-ocsp` - URL OCSP-сервера
- `-tsp` - URL TSP-сервера
## Уточненный алгоритм с cryptcp.exe
### 1. **Толстый клиент СЭД:** Подготовка к подписанию
- Получение документа для подписания
- Определение параметров подписи:
- Выбор сертификата (по отпечатку или субъекту)
- Настройка формата (CAdES-XL)
- Указание URL OCSP и TSP серверов
### 2. **Толстый клиент СЭД:** Запуск cryptcp.exe
```python
# Пример кода запуска на python
import subprocess
command = [
"cryptcp.exe",
"-sign",
"-detached",
"-cadestype", "XL",
"-cert",
"-pin", "123456",
"-ocsp", "http://ocsp.kontur.ru",
"-tsp", "http://tsp.tensor.ru",
"document.pdf",
"document.pdf.sig"
]
result = subprocess.run(command, capture_output=True, text=True)
if result.returncode == 0:
print("Подписание успешно")
else:
print("Ошибка подписания:", result.stderr)
```
### 3. **cryptcp.exe:** Автоматическое выполнение полного цикла
- Запрос сертификата с Рутокен
- Проверка цепочки доверия через системное хранилище
- Вычисление хэша документа
- Подписание хэша закрытым ключом
- **Автоматический запрос OCSP-статуса**
- **Автоматический запрос TSP-метки**
- Формирование CAdES-XL контейнера
### 4. **Толстый клиент СЭД:** Обработка результатов
- Проверка кода возврата cryptcp.exe
- Чтение сгенерированного файла подписи
- Валидация подписи (опционально)
### 5. **Толстый клиент СЭД:** Формирование пакета документов
- Создание описания электронного документа (XML)
- Формирование итогового пакета:
- Исходный документ
- Файл подписи CAdES-XL
- XML-описание
### 6. **Толстый клиент СЭД:** Передача в хранилище
- Отправка пакета в систему хранения
- Запись в журнал аудита
## Преимущества использования cryptcp.exe:
### Автоматизация процесса:
```bash
# Одной командой выполняются все этапы:
cryptcp -sign -detached -cadestype XL -cert -pin 123456 -ocsp -tsp input.pdf output.sig
# Вместо ручной реализации:
# 1. Получение хэша
# 2. Подписание хэша
# 3. OCSP-запрос
# 4. TSP-запрос
# 5. Сборка CAdES-XL
```
### Надежность:
- Использует проверенные алгоритмы КриптоПРО
- Корректная работа с форматами
- Обработка ошибок и исключений
### Соответствие стандартам:
- Правильное формирование CAdES-XL
- Корректное включение OCSP и TSP данных
- Соответствие требованиям УКЭП
## Важные замечания:
1. **PIN-код** может передаваться параметром или запрашиваться интерактивно
2. **Выбор сертификата** может быть по отпечатку, субъекту или через диалог
3. **Обработка ошибок** - необходимо анализировать код возврата cryptcp.exe
4. **Логирование** - cryptcp.exe может вести детальные логи для отладки
Данный подход упрощает реализацию, так как вся сложность криптографических операций и формирования CAdES-XL инкапсулирована в cryptcp.exe.
## 2 Запрос
Ты не указал, что личный сертификат подписанта вставляется в подпись. Это нужно для того, чтобы при проверке подписи не устанавливать на компьютере проверяющего личный сертификат подписанта.
Мы уточняем алгоритм с учетом использования cryptcp.exe, который сам формирует CAdES-XL и включает сертификат подписанта в подпись.
В предыдущем ответе я упустил момент, что cryptcp.exe автоматически включает сертификат подписанта в подпись (это стандартное поведение при использовании параметра -cert).
Таким образом, при проверке подписи на другом компьютере не требуется устанавливать личный сертификат подписанта, так как он уже содержится в подписи.
Уточненный алгоритм с акцентом на включение сертификата:
- Толстый клиент СЭД: Получение документа для подписания УКЭП.
- Толстый клиент СЭД: Запуск cryptcp.exe с параметрами, указывающими на необходимость включения сертификата (параметр -cert) и формирования CAdES-XL.
- cryptcp.exe выполняет:
- Запрос сертификата с закрытым ключом (с Рутокен) и включение его в подпись (в контейнер CAdES-BES, а затем в CAdES-XL).
- Проверку цепочки сертификатов (корневые и промежуточные должны быть установлены в системе).
- Подписание хэша документа.
- Запрос OCSP-ответа и включение его в подпись.
- Запрос TSP-метки и включение ее в подпись.
- Формирование CAdES-XL контейнера, который включает:
- Исходную подпись (CAdES-BES)
- Сертификат подписанта
- Цепочку сертификатов (если настроено)
- OCSP-ответ
- TSP-метку
- Толстый клиент СЭД: Получение файла подписи и формирование описания электронного документа (XML).
- Толстый клиент СЭД: Передача документа, подписи и описания в хранилище.
При проверке подписи на другом компьютере необходимо:
- Установить КриптоПРО CSP.
- Установить доверенные корневые и промежуточные сертификаты УЦ (например, УЦ Контур).
Сертификат подписанта не требуется устанавливать, так как он извлекается из подписи.
Таким образом, в алгоритме, который я ранее описал, пункт 3c (получение сертификата подписанта) выполняется cryptcp.exe автоматически и сертификат включается в подпись.
Для полноты, давайте приведем пример команды cryptcp.exe с комментариями:
```
cryptcp -sign -detached -cadestype XL -cert -pin 123456 -ocsp "http://ocsp.kontur.ru" -tsp "http://tsp.tensor.ru" "document.pdf" "document.pdf.sig"
```
Параметр -cert указывает, что нужно использовать сертификат из хранилища и включить его в подпись.
Если необходимо указать конкретный сертификат (например, по отпечатку), то можно использовать параметр -cert -thumbprint <отпечаток>.
## 3 Уточнение
" Параметр -cert указывает, что нужно использовать сертификат из хранилища и включить его в подпись."
Из какого хранилища? Личный сертификат записан ведь в РуТокен.
Мы используем КриптоПРО CSP, который предоставляет единое интерфейсное хранилище для всех сертификатов, включая сертификаты из подключенных токенов (Рутокен).
Когда мы указываем параметр -cert, утилита cryptcp.exe обращается к КриптоПРО CSP, которое, в свою очередь, обращается к драйверу Рутокен и извлекает сертификат из токена.
Таким образом, сертификат из Рутокена становится доступен через криптопровайдер и может быть включен в подпись.
Однако, стоит отметить, что cryptcp.exe может работать с разными хранилищами. По умолчанию, если не указано иное, используется хранилище «MY» (личные сертификаты), которое включает в себя и сертификаты, доступные через токены.
Если на токене (Рутокен) несколько сертификатов, то cryptcp.exe может запросить выбор сертификата, если не указан конкретный сертификат (например, по отпечатку или субъекту).
Для уточнения, можно использовать параметры:
- cert - использовать сертификат из хранилища (по умолчанию из MY) и включить в подпись.
- certm - использовать сертификат из хранилища машины (Local Machine).
- certu - использовать сертификат из хранилища пользователя (Current User).
Но поскольку Рутокен обычно подключен к текущему пользователю, то по умолчанию используется хранилище MY текущего пользователя, которое включает сертификаты с подключенных токенов.
Таким образом, команда:
```
cryptcp -sign -detached -cadestype XL -cert ...
```
будет использовать сертификат из Рутокен (если он там единственный или будет предложен выбор) и включит его в подпись.
Если нужно явно указать сертификат, можно использовать параметр -thumbprint (отпечаток) или -dn ( Distinguished Name).
Пример с отпечатком:
```
cryptcp -sign -detached -cadestype XL -thumbprint "a1b2c3..." ...
```
Итак, уточненный алгоритм:
- Толстый клиент СЭД подготавливает документ и параметры подписания.
- Запускает cryptcp.exe с параметром -cert (и, возможно, с указанием конкретного сертификата, если их несколько).
- КриптоПРО CSP обращается к Рутокен (через драйвер) и извлекает сертификат (открытую часть) и использует закрытый ключ для подписания (с вводом пин-кода).
- cryptcp.exe формирует CAdES-BES, включая в него сертификат, затем усиливает до CAdES-XL, добавляя OCSP-ответ и TSP-метку.
- Готовый файл подписи возвращается в толстый клиент.
При проверке на другом компьютере сертификат подписанта будет извлечен из подписи, и для проверки цепочки потребуются только корневые и промежуточные сертификаты УЦ, которые должны быть установлены в доверенном хранилище проверяющего компьютера.
Отличное замечание! Вы абсолютно правы. Давайте разберем этот важный момент.
## Хранилища сертификатов в контексте КриптоПРО и Рутокен
```mermaid
graph TB
subgraph "Логическая архитектура хранилищ"
A[cryptcp.exe -cert] --> B[КриптоПРО CSP]
B --> C[Единое виртуальное хранилище]
C --> D[Хранилище MY Текущий пользователь]
C --> E[Хранилище MY Локальная машина]
C --> F[Токены и смарт-карты]
F --> G[Рутокен]
F --> H[Другие токены]
G --> I[Закрытый ключ]
G --> J[Сертификат]
D --> K[Копии сертификатов с токенов]
end
```
## Как работает параметр `-cert` с Рутокен:
**КриптоПРО CSP создает единое логическое хранилище**, которое включает:
1. **Сертификаты из токенов/смарт-карт** (включая Рутокен)
2. **Системное хранилище Windows** (MY, ROOT, CA)
3. **Файловое хранилище КриптоПРО**
Когда используется `-cert`:
```mermaid
sequenceDiagram
participant CryptCP as cryptcp.exe
participant CSP as КриптоПРО CSP
participant Драйвер as Драйвер Рутокен
participant РТ as Рутокен
participant Хранилище as Системное хранилище
CryptCP->>CSP: Запрос списка сертификатов (с -cert)
CSP->>Драйвер: Запрос сертификатов с подключенных токенов
Драйвер->>РТ: Чтение сертификата
РТ-->>Драйвер: Сертификат с Рутокен
Драйвер-->>CSP: Сертификаты из токенов
CSP->>Хранилище: Запрос сертификатов из MY
Хранилище-->>CSP: Сертификаты из Windows хранилища
CSP-->>CryptCP: Объединенный список сертификатов
Note right of CryptCP: Пользователь выбирает сертификат<br>или используется первый подходящий
CryptCP->>CSP: Подписание выбранным сертификатом
CSP->>Драйвер: Операция подписи (закрытый ключ на Рутокен)
Драйвер->>РТ: Подписание с использованием PIN
РТ-->>Драйвер: Результат подписи
Драйвер-->>CSP: Подписанные данные
CSP-->>CryptCP: Подпись с включенным сертификатом
```
## Уточненная команда с выбором сертификата:
```bash
# Базовый вариант (выбор из всех доступных сертификатов)
cryptcp -sign -detached -cadestype XL -cert -pin 123456 document.pdf document.pdf.sig
# С указанием конкретного хранилища
cryptcp -sign -detached -cadestype XL -cert -pin 123456 -provtype 75 document.pdf document.pdf.sig
# С указанием отпечатка сертификата
cryptcp -sign -detached -cadestype XL -thumbprint "a1b2c3d4..." -pin 123456 document.pdf document.pdf.sig
```
## Детализация хранилищ:
### 1. **Хранилище MY (Личные сертификаты)**
- Сертификаты из Рутокен (при подключенном токене)
- Сертификаты из системного хранилища Windows
- Файловые сертификаты КриптоПРО
### 2. **Как сертификат с Рутокен попадает в "хранилище":**
```cpp
// КриптоПРО CSP создает виртуальное представление
// При подключении Рутокен:
CSP->EnumContainers() -> Возвращает контейнеры с токенов
CSP->GetCertificateFromContainer() -> Читает сертификат с Рутокен
// Сертификат становится доступен через криптопровайдер
```
## Практические сценарии:
### Сценарий 1: Один Рутокен подключен
```bash
# cryptcp увидит сертификат с Рутокен в хранилище MY
cryptcp -sign -detached -cert -pin 123456 document.pdf document.pdf.sig
```
### Сценарий 2: Несколько токенов/сертификатов
```bash
# cryptcp предложит выбрать сертификат
cryptcp -sign -detached -cert -pin 123456 document.pdf document.pdf.sig
# Или укажите конкретный сертификат по отпечатку
cryptcp -sign -detached -thumbprint "A1B2C3..." -pin 123456 document.pdf document.pdf.sig
```
### Сценарий 3: Указание провайдера (Рутокен)
```bash
# Явное указание провайдера для Рутокен
cryptcp -sign -detached -cert -pin 123456 -provtype 75 document.pdf document.pdf.sig
```
## Код с обработкой выбора сертификата:
```csharp
public class CryptCpSigner
{
public bool SignDocument(string documentPath, string signaturePath, string pin, string thumbprint = null)
{
var arguments = new List<string>
{
"-sign",
"-detached",
"-cadestype", "XL",
"-cert" // Используем сертификат из "хранилища"
};
if (!string.IsNullOrEmpty(thumbprint))
{
arguments.Add("-thumbprint");
arguments.Add(thumbprint); // Конкретный сертификат
}
arguments.Add("-pin");
arguments.Add(pin);
arguments.Add("-ocsp");
arguments.Add("http://ocsp.kontur.ru");
arguments.Add("-tsp");
arguments.Add("http://tsp.tensor.ru");
arguments.Add(documentPath);
arguments.Add(signaturePath);
// Запуск cryptcp.exe
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "cryptcp.exe",
Arguments = string.Join(" ", arguments.Select(arg => $"\"{arg}\"")),
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using (Process process = Process.Start(startInfo))
{
process.WaitForExit();
return process.ExitCode == 0;
}
}
}
```
## Вывод:
Параметр `-cert` действительно работает с **единым виртуальным хранилищем КриптоПРО**, которое включает сертификаты с подключенных Рутокенов. Сертификат с физического токена становится доступен через криптопровайдер и может быть использован для подписания с включением в итоговую CAdES-XL подпись.
Благодарю за этот важный вопрос! Это ключевой аспект понимания работы электронной подписи с аппаратными токенами.