mirror of
https://github.com/bpmbpm/doc.git
synced 2026-04-30 12:30:52 +00:00
476 lines
31 KiB
Markdown
476 lines
31 KiB
Markdown
## 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 подпись.
|
||
|
||
Благодарю за этот важный вопрос! Это ключевой аспект понимания работы электронной подписи с аппаратными токенами.
|