Как создать сертификат клиента в формате .p12 для защищенного соединения в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов интеграции 1С с внешними веб-сервисами программисты часто сталкиваются с необходимостью использования объекта ЗащищенноеСоединениеOpenSSL. Одной из наиболее запутанных задач является работа с клиентскими сертификатами, особенно когда система требует файл в формате .p12 (PKCS#12). В этой статье мы подробно разберем, почему нельзя создать такой файл, имея только адрес сайта, и как правильно подготовить сертификаты для работы в среде 1С:Предприятие.

Понимание основ: Почему имени сайта недостаточно

Рассмотрим ситуацию, когда при попытке установить соединение вы используете следующий код:


ssl = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаФайл("C:/certs/user.p12", "password")
);

Первое и самое важное заблуждение, которое мы должны развеять: файл .p12 невозможно сгенерировать, зная только доменное имя сайта. Давайте выясним причину. Когда вы просто заходите на сайт через браузер (обычный HTTPS), происходит односторонняя проверка. Ваш компьютер проверяет сертификат сервера, чтобы убедиться, что сайт подлинный. Для этого 1С не требует клиентского сертификата.

Однако использование параметра СертификатКлиентаФайл в коде 1С указывает на то, что сервер требует двусторонней проверки подлинности (Mutual TLS или mTLS). В этом сценарии не только вы проверяете сервер, но и сервер требует, чтобы ваша программа предъявила свой «цифровой паспорт». Этот паспорт (файл .p12) содержит ваш уникальный закрытый ключ, который является секретным и никогда не передается по сети. Именно поэтому его нельзя «скачать» с сайта или восстановить по его названию.

Анатомия контейнера .p12 (PKCS#12)

Для того чтобы эффективно работать с криптографией в 1С, проанализируем содержимое файла .p12. Это зашифрованный архив, который объединяет несколько критически важных компонентов:

  1. Закрытый ключ (Private Key): Самый секретный элемент. Он создается на вашей стороне и используется для расшифровки данных и создания электронных подписей.
  2. Публичный сертификат (Public Certificate): Документ, содержащий ваш открытый ключ и информацию о владельце. Его вы передаете серверу для идентификации.
  3. Цепочка доверия (Intermediate Certificates): Набор сертификатов промежуточных удостоверяющих центров, которые подтверждают, что ваш сертификат является легитимным.

Без наличия закрытого ключа создание работоспособного контейнера .p12 технически невозможно.

Процесс создания файла .p12 с помощью OpenSSL

Разберем по шагам, как создать необходимый файл, если вы являетесь администратором системы или получили необходимые данные от владельца веб-сервиса. Чаще всего для этих целей используется утилита OpenSSL.

Шаг 1. Генерация закрытого ключа и запроса на сертификат (CSR)

Сначала мы должны создать свой закрытый ключ и запрос, который потом будет подписан. В консоли это выглядит так:

openssl req -new -newkey rsa:2048 -nodes -keyout my_private_key.key -out my_request.csr

В процессе выполнения этой команды вам предложат ввести данные организации и доменное имя.

Шаг 2. Получение подписанного сертификата

Вы передаете файл my_request.csr администратору сервиса, к которому подключаетесь. Он подписывает его и возвращает вам файл сертификата (обычно с расширением .crt или .pem).

Шаг 3. Сборка контейнера .p12

Теперь, когда у нас есть закрытый ключ (.key) и полученный сертификат (.crt), мы можем объединить их в один файл, который поймет 1С. Проанализируем команду сборки:

openssl pkcs12 -export -out user.p12 -inkey my_private_key.key -in user.crt

При выполнении этой команды OpenSSL обязательно потребует установить пароль. Этот пароль крайне важен, так как именно его вы будете указывать во втором параметре конструктора Новый СертификатКлиентаФайл в 1С.

Использование сертификата в коде 1С:Предприятие

После того как файл создан, его необходимо правильно подключить. Рассмотрим пример кода для создания защищенного соединения:


// Указываем путь к созданному файлу и пароль, заданный при экспорте в OpenSSL
ПутьКСертификату = "C:/certs/user.p12";
ПарольСертификата = "ваш_пароль";

Попытка
    СертификатКлиента = Новый СертификатКлиентаФайл(ПутьКСертификату, ПарольСертификата);
    
    // В большинстве случаев для проверки сервера используются системные сертификаты
    // Поэтому второй параметр оставляем Неопределено
    ssl = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Неопределено);
    
    // Теперь можно использовать ssl при создании HTTPСоединения
    Соединение = Новый HTTPСоединение("api.website.com", , , , , 30, ssl);
    
    Запрос = Новый HTTPЗапрос("/v1/data");
    Ответ = Соединение.Получить(Запрос);
    
    Сообщить("Код ответа: " + Ответ.КодСостояния);
Исключение
    Сообщить("Ошибка при установке защищенного соединения: " + ОписаниеОшибки());
КонецПопытки;

Особенности работы на разных операционных системах

Проанализируем нюансы, которые могут возникнуть при эксплуатации данного решения в зависимости от того, где работает ваш сервер 1С.

Для Windows:
Часто 1С опирается на системные библиотеки Windows (Schannel/CryptoAPI). Если прямой путь к .p12 не срабатывает, попробуйте импортировать сертификат в хранилище сертификатов пользователя, под которым запускается служба 1С:Предприятия. В 1С в этом случае можно использовать конструктор СертификатКлиентаСИстемноеХранилище.

Для Linux:
В среде Linux 1С работает напрямую с библиотеками OpenSSL. Здесь критически важно проверить права доступа. Файл .p12 должен быть доступен для чтения пользователю usr1cv8. Если у службы нет прав на файл или на папку, где он лежит, соединение будет прервано с неочевидной ошибкой.

Резюме для разработчика

Подведем итог нашим действиям. Если перед вами стоит задача «подключиться к API через сертификат», следуйте этому алгоритму:

  1. Выясните тип проверки: Если это обычный HTTPS, сертификат клиента вам вообще не нужен.
  2. Получите данные: Либо запросите готовый .p12 у администратора сервиса, либо сгенерируйте .csr, отправьте его на подпись и соберите .p12 сами.
  3. Проверьте пароль: Контейнер .p12 почти всегда защищен паролем, без которого 1С не сможет извлечь закрытый ключ.
  4. Настройте окружение: Убедитесь, что сервер 1С (особенно если это Linux) имеет физический доступ к файлу сертификата по указанному пути.

Помните, что безопасность SSL строится на доверии и владении закрытым ключом. Попытка «сгенерировать сертификат из названия сайта» противоречит самой сути криптографии, так как это позволило бы любому злоумышленнику выдать себя за владельца ресурса.

← На главную