Как решить проблему с обменом 1С:Управление торговлей 10.3 и сайтом Битрикс при ошибке 301 Moved Permanently и проверке отзыва сертификата?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При попытке настроить обмен данными между конфигурацией 1С:Управление торговлей 10.3 и сайтом, работающим на платформе Битрикс, часто возникают сложности, которые на первый взгляд могут показаться связанными с некорректными логином или паролем. Однако, как показывает практика, истинные причины могут крыться глубже, в особенностях взаимодействия HTTP/HTTPS протоколов и механизмах работы SSL-сертификатов. Рассмотрим подробно две основные проблемы, с которыми мы можем столкнуться: ошибка 301 Moved Permanently и ошибка "Не удалось выполнить проверку отзыва сертификата".

Разбираемся с ошибкой 301 Moved Permanently при подключении к сайту Битрикс

Изначально, мы можем предполагать, что проблема заключается в неверных учетных данных, если 1С выдает сообщение об ошибке подключения, а через браузер мы успешно заходим на сайт, используя тот же логин и пароль. Однако, нам следует внимательно присмотреться к ответу сервера. Если в ответе сервера мы обнаруживаем код 301 Moved Permanently, это означает, что проблема не в авторизации, а в перенаправлении адреса.

Что означает 301 Moved Permanently?

Код состояния HTTP 301 Moved Permanently сообщает клиенту (в нашем случае, 1С), что запрошенный ресурс был навсегда перемещен на новый URL-адрес. Это не ошибка в привычном понимании, а инструкция серверу. Веб-браузеры обрабатывают такие перенаправления автоматически и незаметно для пользователя, самостоятельно переходя по новому адресу. Однако программный код, который мы используем в 1С для обмена, не всегда умеет обрабатывать редиректы без нашего явного указания.

Типичные причины возникновения 301 редиректа в контексте обмена с Битрикс:

  1. Принудительный переход с HTTP на HTTPS: Это наиболее распространенная причина. На веб-сервере (например, Nginx или Apache) часто настраиваются правила, которые все запросы, поступающие по незащищенному протоколу http://, принудительно перенаправляют на защищенный https://. Даже если мы в 1С указали адрес с https://, какая-то часть нашего запроса или внутренний вызов модуля обмена может по ошибке обращаться по http://.
  2. Добавление или удаление "www": Сервер может быть настроен таким образом, чтобы все адреса приводились к единому виду: либо всегда с www. (например, https://www.site.ru), либо всегда без www. (например, https://site.ru). Если наш запрос не соответствует этому стандарту, произойдет редирект.
  3. Наличие или отсутствие завершающего слэша в конце адреса: Как и было замечено в обсуждении, сервер может добавлять завершающий слэш (/) в конце URL, если его там нет (например, перенаправлять с https://site.ru/exchange на https://site.ru/exchange/), или наоборот, убирать его, что также вызовет редирект.

Как обнаружить и обработать 301 редирект в 1С?

Для корректной обработки ответа с кодом 301 нам необходимо выполнить следующие шаги:

  1. Получить HTTP-ответ от сервера: Мы используем объекты HTTPСоединение и HTTPЗапрос для взаимодействия с веб-сервером.
  2. Проанализировать код состояния ответа: После отправки запроса мы получаем объект HTTPОтвет. Его свойство КодСостояния покажет нам код HTTP-ответа, в нашем случае это будет 301.
  3. Извлечь новый адрес из заголовка "Location": Если код состояния равен 301 (или другим кодам перенаправления, таким как 302, 307), сервер обязательно передает в заголовках ответа новый URL-адрес, на который следует перенаправить запрос. Этот адрес находится в заголовке с именем "Location". Нам нужно получить значение этого заголовка.
  4. Выполнить новый HTTP-запрос по новому адресу: После получения нового URL мы должны сформировать и отправить еще один HTTPЗапрос уже по этому новому адресу.
  5. Передача аутентификационных заголовков: Важно при повторном запросе не забыть передать заголовки аутентификации (например, Cookie), которые могли быть получены в ответе на первый запрос и необходимы для успешной авторизации на Битриксе.

Рассмотрим пример кода, который может помочь в такой ситуации, основанный на модуле для более свежих конфигураций, но адаптированный для понимания принципа:


Функция ПолучитьДанныеССервера(Соединение, ПараметрыЗапроса = "", Заголовки = "", ПараметрыОбмена) Экспорт
    
    ОтветСервера     = "";
    лКодировка       = "";
    
    Попытка
        
        HTTPЗапрос = Новый HTTPЗапрос;
        HTTPЗапрос.АдресРесурса = ПараметрыЗапроса; // Здесь может быть адрес без завершающего слэша
        
        // Передача Cookie для сохранения сессии авторизации
        Если Не ПустаяСтрока(Заголовки) И Найти(Заголовки, "Cookie: ") = 1 Тогда
            HTTPЗапрос.Заголовки.Вставить("Cookie", Прав(Заголовки, СтрДлина(Заголовки) - СтрДлина("Cookie: ")));
        КонецЕсли;
        
        Ответ            = Соединение.ОтправитьДляОбработки(HTTPЗапрос);    
        
        // Проверяем код состояния
        Если Ответ.КодСостояния = 301 Или Ответ.КодСостояния = 302 Или Ответ.КодСостояния = 307 Тогда
            // Если получили редирект, пытаемся получить новый адрес
            НовыйАдрес = Ответ.Заголовки.Получить("Location");
            Если Не ПустаяСтрока(НовыйАдрес) Тогда
                Сообщить("Получен редирект на адрес: " + НовыйАдрес);
                
                // Переформировываем запрос на новый адрес
                HTTPЗапрос.АдресРесурса = НовыйАдрес; 
                Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос); // Повторяем запрос
            Иначе
                Сообщить("Получен редирект, но не удалось найти новый адрес в заголовке Location.");
            КонецЕсли;
        КонецЕсли;
        
        ОтветСервера     = Ответ.ПолучитьТелоКакСтроку();
        
        ContentType = Ответ.Заголовки.Получить("Content-Type");
        Если Не ПустаяСтрока(ContentType) Тогда
            лКодировка       = Прав(ContentType, СтрДлина(ContentType) - (Найти(ContentType, "charset=")+7));
        КонецЕсли;
        
    Исключение
        СообщитьПодробно(ОписаниеОшибки(), ПараметрыОбмена, Истина, Истина);
        СообщитьПодробно("Не удалось получить данные с сервера. Проверьте правильность адреса сервера, порт, имя пользователя и пароль," + Символы.ПС + "а также настройки подключения к Интернет.", ПараметрыОбмена, Истина, Истина)
    КонецПопытки;
    
    Возврат ОтветСервера;
    
КонецФункции

В этом примере мы видим, как можно получить ответ от сервера с помощью Соединение.ОтправитьДляОбработки(HTTPЗапрос). Нам следует внимательно проверять значение HTTPЗапрос.АдресРесурса перед отправкой, чтобы убедиться, что оно соответствует ожидаемому формату сервера Битрикс (например, наличие или отсутствие завершающего слэша, использование https://). Попробуйте добавить завершающий слэш, если его нет в конце части адреса, указанной в ПараметрыЗапроса.

Важно понимать, что HTTPСоединение лишь устанавливает сессию на веб-сервере (например, Nginx или Apache), но само по себе не гарантирует авторизацию в Битрикс. Логин и пароль для Битрикс обычно передаются в параметрах запроса (POST-данных) и закрепляются в куках (Cookie), которые затем используются в последующих запросах для поддержания авторизованной сессии. Поэтому нам критически важно убедиться, что куки корректно передаются между запросами, особенно при наличии редиректов.

Для более глубокой диагностики мы можем использовать инструменты разработчика браузера (F12) при входе на сайт через браузер. Мы посмотрим, какие HTTP-запросы отправляются, какие заголовки передаются (особенно Cookie и Location при редиректах), и сравним их с тем, что отправляет 1С. Это поможет нам выявить расхождения.

Решение проблемы "Не удалось выполнить проверку отзыва сертификата"

Если мы успешно преодолели проблему 301 редиректа, то на следующем этапе, особенно после обновления или изменения настроек конфигурации 1С (например, снятия режима совместимости), мы можем столкнуться с новой ошибкой: "Не удалось выполнить проверку отзыва сертификата". Эта ошибка напрямую связана с безопасностью HTTPS-соединения и может быть достаточно коварной.

Суть проблемы:

Когда 1С устанавливает защищенное соединение по протоколу HTTPS, она (через системные средства Windows на сервере 1С) пытается проверить статус SSL-сертификата сайта. Эта проверка включает в себя выяснение, не был ли сертификат отозван (аннулирован) выдавшим его центром сертификации (УЦ). Для этого система обращается к специальным серверам УЦ, которые содержат списки отозванных сертификатов (CRL - Certificate Revocation List) или предоставляют статус сертификата в режиме онлайн (OCSP - Online Certificate Status Protocol). Ошибка возникает, если по какой-либо причине этот процесс проверки не может быть завершен.

Основные причины и пути решения:

  1. Отсутствие доступа в интернет у сервера 1С: Это самая частая причина. Служба сервера 1С ("1С:Предприятие 8.3 Server") обычно запускается от имени специального системного пользователя (например, USR1CV8 или NETWORK SERVICE). В целях безопасности или из-за некорректных настроек сети у этого пользователя может быть ограничен или полностью отсутствовать доступ в интернет. Если сервер 1С не может связаться с серверами центра сертификации для проверки статуса сертификата сайта, возникнет данная ошибка.

    Решение: Нам следует убедиться, что у пользователя, от имени которого работает служба сервера 1С, есть полноценный доступ в интернет, по крайней мере, к адресам, указанным в сертификате для проверки отзыва. Мы можем временно переключить службу на пользователя с полными правами (например, локального администратора), чтобы проверить гипотезу, но затем обязательно настроить доступ для основного пользователя. Проверить текущего пользователя службы можно через "Диспетчер задач" -> вкладка "Службы" -> "1C:Enterprise 8.3 Server" -> "Перейти к процессам" -> найти процесс rphost.exe и посмотреть его пользователя. Либо через "Панель управления" -> "Администрирование" -> "Службы".

  2. Блокировка доступа файрволом или прокси-сервером: Сетевые экраны (брандмауэры), антивирусные программы или корпоративные прокси-серверы могут блокировать исходящие соединения к серверам списков отзыва сертификатов (CRL) или серверам службы статуса онлайн-сертификатов (OCSP). Адреса этих серверов обычно указываются в свойствах SSL-сертификата сайта. Мы можем просмотреть их, открыв сертификат сайта в браузере (кликнув на замочек в адресной строке), перейти на вкладку "Состав" и найти поля "Точки распространения списков отзыва (CRL)" и "Доступ к информации центра сертификации (AIA), включая OCSP".

    Решение: Нам необходимо проверить журналы файрвола на сервере 1С и на сетевом оборудовании. При необходимости мы должны добавить адреса серверов УЦ (OCSP/CRL) в исключения файрвола. Если используется прокси-сервер, нам следует убедиться, что настройки прокси корректно указаны для 1С и для системы в целом, позволяя доступ к этим внешним ресурсам. Нам также следует проверить, настроены ли системные переменные окружения для прокси, так как низкоуровневые компоненты Windows могут использовать их.

  3. Устаревшие корневые сертификаты Windows: На сервере, где исполняется код 1С, могут отсутствовать или быть устаревшими корневые сертификаты удостоверяющих центров, которые необходимы для построения цепочки доверия до сертификата нашего сайта. Если система не может доверять УЦ, она не сможет и проверить статус сертификата.

    Решение: Нам необходимо установить последние обновления операционной системы Windows. Обновления Windows, особенно критические, часто включают в себя обновление хранилища корневых сертификатов, что может решить проблему. Мы также можем вручную импортировать необходимый корневой сертификат, если точно знаем, какой УЦ выдал сертификат для сайта, но это более сложный путь.

  4. Некорректная дата и время на сервере: Если системное время на сервере 1С сильно отличается от реального (даже на несколько минут), это может привести к невозможности корректной проверки срока действия сертификата и его статуса. Сертификаты имеют строго определенные даты начала и окончания действия, и любая рассинхронизация времени может привести к ошибкам.

    Решение: Мы должны настроить синхронизацию времени с сервером точного времени в интернете (NTP-сервером) на сервере 1С. Убедимся, что служба синхронизации времени Windows работает корректно.

Диагностика с помощью журнала событий CAPI2:

Для точного определения причины ошибки "Не удалось выполнить проверку отзыва сертификата" мы можем использовать системный журнал событий Windows, а именно журнал CAPI2. Этот журнал содержит подробную информацию о всех операциях с криптографическими компонентами, включая проверку сертификатов.

  1. Включить ведение журнала CAPI2: Откроем "Просмотр событий" (Event Viewer). Перейдем по пути: "Журналы приложений и служб" -> "Microsoft" -> "Windows" -> "CAPI2" -> "Operational". Щелкнем правой кнопкой мыши по "Operational" и выберем "Включить журнал" (Enable Log).
  2. Повторить попытку обмена в 1С: После включения журнала мы должны повторить попытку выполнения обмена в 1С, чтобы вызвать ошибку и зафиксировать ее в журнале.
  3. Анализировать записи в журнале CAPI2: Вернемся в журнал CAPI2. Там появятся записи, которые с большой детализацией покажут, на каком этапе произошла ошибка проверки отзыва сертификата, к какому URL-адресу не удалось получить доступ (например, адрес сервера CRL/OCSP) и по какой именно причине (например, тайм-аут ожидания, отказ в доступе). Эта информация будет ключевой для понимания проблемы и выбора правильного пути решения. Мы будем искать события с пометками "Failure" или "Error".

Таким образом, решая проблемы с обменом 1С и Битрикс, нам следует последовательно проверять как настройки URL-адресов и логики обработки HTTP-ответов в коде 1С, так и системные сетевые настройки и параметры безопасности на сервере 1С. Только комплексный подход позволит нам добиться стабильного и надежного обмена данными.

← На главную