ВОЙТИ

Не работает https

Последние изменения: 09.08.2018
добавить в избранные

При переходе на протокол https 1с перестает подключаться к сайту. Причина кроется в самой 1с, которая в 21 веке знать не знает про https. У нас есть несколько вариантов решения этой проблемы. Если у вас есть свой, более элегантный, то дайте нам знать.

1. Остаться на http

Суть решения проблемы сводится к тому, чтобы оставить http конкретно для ссылки обмена, а весь сайт пусть и далее работает на https. Но если просто взять и воткнуть http ссылку в настройку обмена, то ничего не произойдет, поскольку будет выполнена 301-я переадресация на ссылку с https и вот снова вернулись к начальной проблеме.

Поэтому надо добавить исключение на ссылку для обмена, чтобы она обслуживалась по протоколу http, и тогда с 1с все будет в порядке.

1.1. Можно самостоятельно добавить исключение на ссылку обмена

Не знаю точно как это делается в apache2, но на стороне nginx мы обычно делаем следующим образом:

server {
   listen *:80;
   server_name www.{domain} {domain};
   location /export/soforp_exchange1c.php {
      client_max_body_size 132m;
      // тут мы напрямую передаем управление за апач
      proxy_pass http://127.0.0.1:88/export/soforp_exchange1c.php;
      include /etc/nginx/proxy_params;
   }
   location / {
      return 301 https://$host$request_uri;
   }
}

Вариант для .htaccess выглядит следующим образом:

RewriteEngine On 
RewriteBase / 
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteCond %{REQUEST_URI} !^export/soforp_exchange1c.php
RewriteRule ^([^?]*) https://demo.neoseo.com.ua/$1 [R=301,L]

ВНИМАНИЕ!! С 121 версии код модуля изменен на neoseo_exchange1c.php, поэтому используйте его, а не soforp_exchange1c.php

Для того, чтобы отработали правила прописанные в .htaccess необходимо отключить переадресацию с http на https на хостинге

1.2. Можно попросить хостера помочь с настройкой исключений

Если вы не разбираетесь в .htaccess или конфигах nginx, то просто дайте хостеру почитать эту ссылку и пусть он вам поможет настроить ваш хостинг так, чтобы ссылка для обмена не редиректилась на https, а потому все работало.

2. Подружиться с https

Если предыдущие варианты не сработали, то можно попробовать таки подружиться с 1с.

2.1. Доработать 1с

Если у вас есть возможность заглянуть в конфигуратор 1с, то можете отыскать там такие строчки:

Соединение = Неопределено;
 Попытка
  Соединение = Новый HTTPСоединение(
   ПараметрыПодключения.Сервер,
   ПараметрыПодключения.Порт,
   ПараметрыПодключения.Пользователь,
   ПараметрыПодключения.Пароль,
   ПараметрыПодключения.Прокси,
   ПараметрыПодключения.ЗащищенноеСоединение
  );
 Исключение
  ДобавитьОписаниеОшибки(ОписаниеОшибки,
   ОписаниеИсключительнойОшибки(
    СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
     НСтр("ru = 'Не удалось установить соединение с сервером %1:%2. Проверьте правильность адреса сервера, порт, имя пользователя и пароль.'"),
     ПараметрыПодключения.Сервер,
     ПараметрыПодключения.Порт)));
  Соединение = Неопределено;
 Конецпопытки;

и заменить на эти

Соединение = Неопределено;
 ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows()); //as_не типовое для работы по https
 Попытка
  Соединение = Новый HTTPСоединение(
   ПараметрыПодключения.Сервер,
   ПараметрыПодключения.Порт,
   ПараметрыПодключения.Пользователь,
   ПараметрыПодключения.Пароль,
   ПараметрыПодключения.Прокси,
   ,
   ?(ПараметрыПодключения.ЗащищенноеСоединение, ssl, Неопределено)
  );
 Исключение
  ДобавитьОписаниеОшибки(ОписаниеОшибки,
   ОписаниеИсключительнойОшибки(
    СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
     НСтр("ru = 'Не удалось установить соединение с сервером %1:%2. Проверьте правильность адреса сервера, порт, имя пользователя и пароль.'"),
     ПараметрыПодключения.Сервер,
     ПараметрыПодключения.Порт)));
  Соединение = Неопределено;

после этого ссылка с https должна работать на ура


2.2. Подложить сертификат в 1с

Если вы понимаете толк в извращениях, то можно также попробовать подложить сертификат в саму 1с. Делается это следующим образом, доставшимся нам из фресок

Для начала надо добавить сертификат в хранилище сертификатов в 1С в папке bin файл cacert.pem . Инструкция по получению здесь http://infostart.ru/public/79494/

1. Качаем подходящий дистрибутив http://www.slproweb.com/products/Win32OpenSSL.html 

2. После установки нужно указать переменную, открываем командную строку под админом вводим команду 

set OPENSSL_CONF=D:\OpenSSL-Win32\bin\openssl.cfg

После этого программа начинает работать 

3. В браузере открываем урл где можно посмотреть сертификат, открываем просмотр цепочки сертификатов 

Я пользовался Firefox поэтому дальше буду описывать действия для него 

Открываем сертификат - подробнее 

4. Сохраняем каждый сертификат из цепочки по 2 раза в разных форматах 

лучше использовать короткие понятные пути 

1й формат 

4.1 Экспортировать, выбираем тип файла Сертификат X.509 в формате PEM (*.crt:*.pem) 

повторяем для всех сертификатов цепочки 

2й формат 

4.1 Экспортировать, выбираем тип файла Сертификат X.509 в формате DER (*.der) 

повторяем для всех сертификатов цепочки 

Далее открываем командную строку 

вводим команду, переходим в папку с Open ssl 

cd c:\OpenSSL-Win64\bin

Далее формируем подпись 

c:\OpenSSL-Win64\bin>openssl x509 -inform der -in D:\p.der -out D:\textcert.pem -text -fingerprint -md5

На экране отображается сгенерированная подпись и сертификат 

Через пометить выбираем полученный результат, копируем и добавляем в конец файла 

C:\Program Files (x86)\1cv8\8.3.5.1460\bin\cacert.pem

Добавленный результат форматируем 

Делаем заголовок 

Имя для заголовка лучше брать из добавляемого сертификата 

Просмотр сертификата - Выбираем сертификат - Внизу поле субъект CN = Symantec Class 3 EV SSL CA - G3 

из него забираем заголовок 

Symantec Class 3 EV SSL CA - G3 

переносим MD под заголовок 

Получается: 

Symantec Class 3 EV SSL CA - G3 

==================== 

MD5 Fingerprint=DF:51:CE:65:BC:43:F9:1B:3E:1E:CF:48:AB:23:36:25 

остальное оставляем внизу 

Далее блокнотом открываем сохраненный сертификат в формате *.crt копируем его содержание 

Вставляем в конец файла cacert.pem

2 комментария
Ivan Kalygin
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/export/soforp_exchange1c.php$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Решение редиректа всего сайта на https кроме ссылки обмена, спасибо ребятам из beget'a )
Александр Захарчук
в случае с 1с может помочь замена

Соединение = Новый HTTPСоединение(СтруктураПараметровСайта.Сервер, Порт, СтруктураПараметровСайта.ИмяПользователя, СтруктураПараметровСайта.Пароль, ИнтернетПрокси, СтруктураПараметровСайта.ЗащищенноеСоединение);

на

Соединение = Новый HTTPСоединение(СтруктураПараметровСайта.Сервер, Порт,СтруктураПараметровСайта.ИмяПользователя, СтруктураПараметровСайта.Пароль,ИнтернетПрокси,,Новый ЗащищенноеСоединениеOpenSSL());