Настройка защищенного контура mTLS (Mutual TLS) в 1С:Предприятие 8.3
При интеграции с банковскими шлюзами, ГИС и защищенными API возникают ошибки:
- Сервер возвращает ошибку
HTTP 400 No required SSL certificate was sentили403 SSL Client Certificate Required. - Сбой инициализации объекта
ЗащищенноеСоединениеOpenSSLпри загрузке закрытого ключа. - Несовпадение формата сертификатов (PKCS#12 / PFX vs раздельные PEM-файлы).
- Ошибки проверки цепочки доверия клиентского сертификата на серверах Linux.
1. Принцип работы двухсторонней аутентификации (Mutual TLS)
При стандартном TLS только клиент проверяет валидность сертификата сервера. При mTLS сервер запрашивает у клиента его публичный сертификат и проверяет цифровую подпись, сформированную закрытым ключом клиента в процессе TLS-рукопожатия.
2. Подготовка сертификатов для платформы 1С
Платформа 1С:Предприятие требует передачи клиентских сертификатов в формате OpenSSL (файлы .crt / .pem и .key):
# Конвертация PFX/P12 контейнера в открытый сертификат клиента:
openssl pkcs12 -in client_bundle.pfx -clcerts -nokeys -out client.crt
# Извлечение закрытого ключа без шифрования (или с паролем):
openssl pkcs12 -in client_bundle.pfx -nocerts -nodes -out client.key
# Извлечение цепочки удостоверяющих центров (CA):
openssl pkcs12 -in client_bundle.pfx -cacerts -nokeys -out ca-chain.crt3. Программный код вызова защищенного эндпоинта с mTLS
&НаСервере
Функция ВыполнитьЗапросmTLS(Хост, Путь, ТелоЗапросаJSON, ПарольККлючу = "") Экспорт
// Пути к файлам сертификатов на сервере 1С
ПутьКСертификатуКлиента = "/etc/ssl/1c/client.crt";
ПутьККлючуКлиента = "/etc/ssl/1c/client.key";
ПутьККорневымCA = "/etc/ssl/1c/ca-chain.crt";
// 1. Инициализация сертификата клиента
СертификатКлиента = Новый СертификатКлиентаOpenSSL(
ПутьКСертификатуКлиента,
ПутьККлючуКлиента,
ПарольККлючу
);
// 2. Инициализация доверенных корневых сертификатов
СертификатыCA = Новый СертификатыУдостоверяющегоЦентраOpenSSL(ПутьККорневымCA);
// 3. Сборка параметров защищенного соединения
ПараметрыTLS = Новый ПараметрыЗащищенногоСоединенияOpenSSL(СертификатКлиента, СертификатыCA);
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(ПараметрыTLS);
// 4. Создание HTTP-соединения
HTTPСоединение = Новый HTTPСоединение(
Хост,
443,
,,,
30,
ЗащищенноеСоединение
);
HTTPЗапрос = Новый HTTPЗапрос(Путь);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
Возврат HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Исключение
ЗаписьЖурналаРегистрации("mTLS", УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка mTLS рукопожатия: " + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
КонецФункции Частые вопросы (FAQ)
Почему 1С падает с ошибкой 'Ошибка инициализации SSL соединения' при указании ключа?
Закрытый ключ может быть зашифрован неподдерживаемым алгоритмом (например, PKCS#8 PBKDF2). Пересохраните ключ в традиционном формате RSA (openssl rsa -in client.key -out client_rsa.key).
Можно ли использовать mTLS с сертификатами из хранилища Windows (Certificate Store)?
Объект СертификатКлиентаWindows доступен только для тонкого клиента под Windows. Для серверных фоновых заданий rphost (особенно на Linux) необходимо использовать строго СертификатКлиентаOpenSSL с явными файловыми путями.
Как проверить mTLS соединение из консоли сервера до запуска кода 1С?
Выполните команду: openssl s_client -connect host.ru:443 -cert client.crt -key client.key -CAfile ca-chain.crt.
Какие права доступа должны быть у файлов сертификатов на Linux?
Файлы ключей и сертификатов должны принадлежать пользователю службы 1С (chown usr1cv8:grp1cv8 /etc/ssl/1c/*) с правами chmod 600 для ключа и 644 для сертификата.