В современных условиях безопасности передача данных по незащищенному протоколу HTTP становится недопустимой. Использование SSL/TLS шифрования (протокол HTTPS) позволяет защитить передаваемые данные от перехвата и подмены. В рамках данной статьи мы подробно разберем, как реализовать поддержку HTTPS для HTTP-сервисов на платформе 1С:Предприятие 8.3, начиная от настройки веб-сервера и заканчивая написанием программного кода для защищенного соединения.
Прежде всего, нам необходимо четко разделить задачу на две составляющие. Первая — это публикация вашего сервиса, чтобы к нему можно было обратиться по HTTPS. Вторая — это потребление (вызов) стороннего или своего же сервиса из кода 1С. Рассмотрим эти ситуации по порядку.
Для публикации HTTP-сервиса 1С основные настройки производятся не в самой платформе, а на стороне веб-сервера (Apache или IIS). Платформа 1С работает через расширение веб-сервера, поэтому, как только вы настроите SSL-сертификат в Apache или IIS, ваш сервис автоматически станет доступен по адресу https://адрес_сервера/имя_публикации. На стороне конфигурации 1С в объекте HTTP-сервис никаких специальных флажков «Включить HTTPS» ставить не требуется.
Если ваша задача — обратиться из кода 1С к ресурсу по защищенному протоколу, то стандартного конструктора HTTPСоединение будет недостаточно. Проанализируем, какие изменения необходимо внести в программный код.
Для инициализации защищенного сеанса в 1С используется специальный объект ЗащищенноеСоединениеOpenSSL. Рассмотрим пример реализации такого подключения:
// Определяем параметры сертификатов (необязательно, если используются доверенные ЦС)
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем соединение, указывая порт 443 и объект защищенного соединения
HTTPСоединение = Новый HTTPСоединение(
"api.myserver.ru", // Адрес сервера
443, // Стандартный порт HTTPS
Логин,
Пароль,
, // Прокси
, // Таймаут
ЗащищенноеСоединение
);
Обратите внимание, что если вы не укажете ЗащищенноеСоединениеOpenSSL, 1С попытается установить обычное HTTP-соединение, что приведет к ошибке или сбросу сессии со стороны сервера.
Выясним причину частой ошибки: «Удаленный узел не прошел проверку». Это происходит, когда вы используете сертификат, выданный не доверенным центром сертификации (например, самоподписанный для внутренних нужд). В этом случае платформа 1С не может подтвердить подлинность сервера.
Рассмотрим способы решения этой проблемы:
Пример кода с игнорированием проверок состава сертификата:
// Параметры: ПроверкаИмениСервера, ПроверкаЦепочкиСертификатов
СертификатПроверки = Новый СертификатПроверкиОС(Ложь, Ложь);
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, СертификатПроверки);
HTTPСоединение = Новый HTTPСоединение("internal-service.local", 443, , , , , ЗащищенноеСоединение);
Проанализируем ситуацию, когда сервер 1С работает под управлением ОС Linux. В отличие от Windows, где сертификаты берутся из системного хранилища, в Linux 1С ориентируется на стандартные пути библиотек OpenSSL. Если вы используете собственный сертификат, его необходимо добавить в системное хранилище и обновить кэш командой update-ca-certificates.
Также важно помнить, что версия OpenSSL, поставляемая с платформой 1С, может отличаться от той, что установлена в системе. Начиная с релизов 8.3.18+, разработчики получили больше инструментов для управления протоколами TLS. Если ваш сервер требует строго TLS 1.2 или 1.3, убедитесь, что ваша версия платформы поддерживает эти протоколы.
Разберем важный нюанс при использовании архитектуры с обратным прокси-сервером (например, Nginx), который терминирует SSL. В такой схеме Nginx принимает HTTPS-запрос, расшифровывает его и передает на Apache по обычному HTTP.
Чтобы 1С корректно определяла протокол и строила правильные ссылки (например, в ответах сервиса), необходимо настроить передачу заголовка X-Forwarded-Proto. На стороне веб-сервера Apache в конфигурации следует убедиться, что модуль remoteip правильно обрабатывает эти заголовки. В самом файле default.vrd атрибут base должен указывать актуальный путь, но специфических настроек именно для HTTPS там обычно не требуется, так как логика шифрования остается на уровне веб-сервера.
В некоторых случаях требуется не только проверка сервера клиентом, но и проверка клиента сервером. Для этого в 1С реализована поддержка клиентских сертификатов. Посмотрим, как это выглядит в коде:
// Загружаем клиентский сертификат из файла PFX
СертификатКлиента = Новый СертификатКлиентаИзФайла("C:\Certs\client.pfx", "ПарольКФайлу");
// Инициализируем защищенное соединение с сертификатом клиента
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента);
HTTPСоединение = Новый HTTPСоединение("secure.service.ru", 443, , , , , ЗащищенноеСоединение);
Этот метод гарантирует, что к вашему HTTP-сервису смогут подключиться только те клиенты, у которых есть соответствующий закрытый ключ.
Установление защищенного соединения (так называемое «SSL-рукопожатие») — операция ресурсоемкая и затратная по времени. Если вам необходимо выполнить серию запросов к одному и тому же сервису, не пересоздавайте объект HTTPСоединение в цикле. Создайте его один раз и используйте для отправки всех необходимых HTTPЗапрос. Это позволит сэкономить время на повторных проверках сертификатов и согласовании ключей шифрования.
Важно: При работе с мобильной платформой 1С требования к сертификатам значительно строже. Современные версии Android и iOS могут блокировать соединения даже с правильно настроенным ЗащищенноеСоединениеOpenSSL, если сертификат самоподписанный. Для мобильных приложений настоятельно рекомендуется использовать сертификаты от доверенных центров, таких как Let's Encrypt.