Публикация HTTP сервиса с использованием клиентского SSL сертификата

23.01.26

Администрирование - Администрирование веб-серверов

Публикация http-сервиса через Apache под Windows, с использованием ssl клиентского сертификата p12. База реализующая обработку запросов GET, POST с получением и передачей JSON

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
База с сервисами + шаблон для выпуска клиентских сертификатов
.zip 40,97Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Данный материал составлен в рамках подготовки ответа на вопрос - "а как нам опубликовать свой api в 1С?" для моего хорошего друга Егора. Приведён пример публикации с полным, мне известным набором опций, некоторые из которых можно выключить. Например, пароль пользователя 1C зашит в vrd файл, чтобы упростить работу сторонним разработчикам. Для авторизации используется механизм клиентских HTTPs сертификатов в виде p12 файлов, которые подходят для авторизации тонких клиентов.

 

Прилагаю к публикации файл с базой, c развёрнутыми сервисами.

В целом, это вся настройка:


 

Код ни на что не претендует, выдернул из того, что было (это весь)

 		  
Функция ОбработатьЗапрос(Запрос)

	ИмяМетода = Запрос.ПараметрыURL.Получить("Method");
	Ответ = Новый HTTPСервисОтвет(400);
	
	Если ИмяМетода = "test" Тогда
		Ответ.КодСостояния = 202;
	ИначеЕсли ИмяМетода = "GetTables" Тогда
		Ответ = Новый HTTPСервисОтвет(200);	
		Ответ.Заголовки.Вставить("Content-type", "application/json;  charset=utf-8");		
		Ответ.УстановитьТелоИзСтроки(ОбработкаAPI.ВернутьТаблицы(Запрос.ПараметрыЗапроса), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);	
	ИначеЕсли ИмяМетода = "GetFile" Тогда
		
		Ответ = Новый HTTPСервисОтвет(200);	
		Ответ.Заголовки.Вставить("Content-type", "application/any;  charset=utf-8");
		Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=" + "file.txt");
		
		Ответ.УстановитьТелоИзДвоичныхДанных(ПолучитьДвоичныеДанныеФайла(Запрос.ПараметрыЗапроса)); 
		
	ИначеЕсли ИмяМетода = "TakeJSON" Тогда	
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку());
		ПринятыеДанные = ПрочитатьJSON(ЧтениеJSON,,,ФорматДатыJSON.ISO); 
		ЧтениеJSON.Закрыть();	
		
		СтруктураОтвета = Новый Структура;
		Для каждого КиЗ ИЗ ПринятыеДанные Цикл
			СтруктураОтвета.Вставить(КиЗ.Ключ,"1337");			
		КонецЦикла;
		
		Ответ = Новый HTTPСервисОтвет(200);	
		Ответ.Заголовки.Вставить("Content-type", "application/json;  charset=utf-8");		
		Ответ.УстановитьТелоИзСтроки(ОбработкаAPI.ВернутьJSONСОписаниемДат(СтруктураОтвета), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Иначе
		Ответ.КодСостояния = 405;
		Результат = "Отсутствует Метод " + ИмяМетода;	
	КонецЕсли;
	
	Возврат Ответ;

КонецФункции // ОбработатьЗапрос()

Функция ПолучитьДвоичныеДанныеФайла(ПараметрыЗапроса) Экспорт

	Поток = новый ПотокВПамяти();
	Запись = новый ЗаписьДанных(Поток,КодировкаТекста.UTF8);
	Запись.ЗаписатьСимволы("Тестовый текстовый файл");
	Запись.Закрыть(); 	
	
	Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
	//Файл = Справочники.МойСправочник.ПолучитьСсылку(Новый УникальныйИдентификатор(ПараметрыЗапроса["uid"]));
	//Возврат Новый ДвоичныеДанные(ПутьКФайлу);	
КонецФункции // ПолучитьДвоичныеДанныеФайла()

//Функция ВернутьДанныеТаблиц(ДатаНачала,ДатаОкончания,Поставщик)
Функция ВернутьДанныеТаблиц()
	#Область ТестовыеТаблицы
	
	Таблица1 = Новый ТаблицаЗначений;
	Таблица1.Колонки.Добавить("Номер");
	Таблица1.Колонки.Добавить("Дата");
	Таблица1.Колонки.Добавить("Комментарий");
	
	НС = Таблица1.Добавить();
	НС.Номер = 1;
	НС.Дата = Дата(2026,01,01);
	НС.Комментарий = "С Новым годом!";
	
	НС = Таблица1.Добавить();
	НС.Номер = 2;
	НС.Дата = Дата(2026,02,17);
	НС.Комментарий = "С Китайским новым годом!";
	
	Таблица2 = Новый ТаблицаЗначений;
	Таблица2.Колонки.Добавить("Номер");
	Таблица2.Колонки.Добавить("ДатаДоговора");
	Таблица2.Колонки.Добавить("Комментарий"); 
	
	НС = Таблица2.Добавить();
	НС.Номер = "1111-000001";
	НС.ДатаДоговора = Дата(2025,12,14);
	НС.Комментарий = "С Ханукой!";
	
	#КонецОбласти        
	
	Рез = Новый Структура();
	Рез.Вставить("Таблица1", ОбщегоНазначенияТаблицаЗначенийВМассив(Таблица1));
	Рез.Вставить("Таблица2", ОбщегоНазначенияТаблицаЗначенийВМассив(Таблица2));
	Рез.Вставить("ОписаниеДат","Дата,ДатаДоговора"); 	
	
	//ЗаменитьСсылкуНаУИД(Рез.ТаблицаИнвойсов,"Ссылка");	
	//ЗаменитьСсылкуНаУИД(Рез.Контейнеры,"Ссылка");	
	//ЗаменитьСсылкуНаУИД(Рез.Услуги,"Ссылка");	
	Возврат Рез;
КонецФункции           

Функция ВернутьТаблицы(ПараметрыЗапроса) Экспорт
		
	//ТГП = ВернутьДанныеТаблиц(ВернутьДату(ПараметрыЗапроса["ds"]),ВернутьДату(ПараметрыЗапроса["de"]),Число(ПараметрыЗапроса["supp"]));	
	ТГП = ВернутьДанныеТаблиц();	
	
	Возврат ВернутьJSONСОписаниемДат(Новый Структура("Таблица1,Таблица2",ТГП.Таблица1,ТГП.Таблица2),ТГП.ОписаниеДат);
	
КонецФункции       

Функция ВернутьJSONСОписаниемДат(Значение,ПереченьПолейСДатами=Неопределено) Экспорт
		
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();	
	ЗаписатьJSON(ЗаписьJSON, Значение);
	СтрокаДЖ = ЗаписьJSON.Закрыть(); 
	
	Если ПереченьПолейСДатами=Неопределено Тогда
		Возврат СтрокаДЖ;
	КонецЕсли;
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();	
	ЗаписатьJSON(ЗаписьJSON,Новый Структура("ПереченьПолейСДатами,Значение",ПереченьПолейСДатами,СтрокаДЖ),СтандартныеНастройкиСериализацииJSON());
	
	Возврат ЗаписьJSON.Закрыть();

КонецФункции // ВернутьJSONСОписанием() 

Функция СтандартныеНастройкиСериализацииJSON() Экспорт
	НС = Новый НастройкиСериализацииJSON;
	НС.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
	НС.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
	Возврат НС;	
КонецФункции   

Процедура ЗаменитьСсылкуНаУИД(ТЗ,КолонкиЧерезЗапятую)
	
	Колонки = СтрРазделить(КолонкиЧерезЗапятую,",");	
	Для каждого Строка ИЗ ТЗ Цикл
		Для каждого Колонка из Колонки Цикл
			Строка[Колонка] = ?(ЗначениеЗаполнено(Строка[Колонка]),Строка(Строка[Колонка].УникальныйИдентификатор()),"00000000-0000-0000-0000-000000000000");	
		КонецЦикла;	
	КонецЦикла;	
	
КонецПроцедуры

Функция ВернутьДату(СтрД) // 01-01-2025
	
	Возврат Дата(Прав(СтрД,4),Сред(СтрД,4,2),Лев(СтрД,2));

КонецФункции // ВернутьДату()

Функция ОбщегоНазначенияТаблицаЗначенийВМассив(ТаблицаЗначений)
	
	Массив = Новый Массив();
	СтруктураСтрокой = "";
	НужнаЗапятая = Ложь;
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		Если НужнаЗапятая Тогда
			СтруктураСтрокой = СтруктураСтрокой + ",";
		КонецЕсли;
		СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
		НужнаЗапятая = Истина;
	КонецЦикла;
	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
		НоваяСтрока = Новый Структура(СтруктураСтрокой);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);
		Массив.Добавить(НоваяСтрока);
	КонецЦикла;
	Возврат Массив;

КонецФункции

 

Apache

Загрузите Apache, разместите Apache24 на цэ диске (можно в другом месте, необходимо изменить SRVROOT)

Приведённые ниже пути, относительны  C:\Apache24

 

сonf/httpd.conf

# === Основные настройки ===
Define SRVROOT "C:/Apache24"
ServerRoot ${SRVROOT}
Listen 4453
ServerAdmin admin@example.org
ServerName terminal.example.org

# === Размер тела запроса (100MB) ===
LimitRequestBody 104857600

# === Поддержка Keep-Alive для долгих запросов 1С ===
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 300
Timeout 600

# === Настройки ядра ===
AcceptFilter https none 
AcceptFilter http none 
EnableSendfile Off 
EnableMMAP Off 

# === Загрузка необходимых модулей ===
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule _1cws_module "C:/Program Files/1cv8/8.3.27.1859/bin/wsap24.dll"
LoadModule headers_module modules/mod_headers.so
LoadModule alias_module modules/mod_alias.so

# === Корневая директория ===
DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# === Запрет доступа к системным файлам ===
<Files ".ht*">
    Require all denied
</Files>
<DirectoryMatch "^.*/\..+">
    Require all denied
</DirectoryMatch>

# === Логи ===
ErrorLog "logs/error.log"
LogLevel warn
CustomLog "logs/access.log" common

# === SSL ===
<IfModule ssl_module>
    SSLEngine On
    SSLCertificateFile conf/certs/cert.pem
    SSLCertificateKeyFile conf/certs/key.pem
    SSLCACertificateFile conf/certs/ca.crt

    SSLProtocol -all +TLSv1.2
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder On
    #SSLOpenSSLConfCmd CertificateVerification require

    SSLSessionCache "shmcb:${SRVROOT}/logs/ssl_scache(2048000)"
    SSLSessionCacheTimeout 300

    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl

    CustomLog "${SRVROOT}/logs/ssl_request.log" \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" env=HTTPS
</IfModule>

# === Публикация базы 1С ===
Alias "/post4egor" "bases/post4egor"
<Directory "bases/post4egor">
    AllowOverride None
    Options None
    Require all granted

    SetHandler 1c-application
    ManagedApplicationDescriptor "bases/post4egor/default.vrd"

    #Header set Cache-Control "no-store, no-cache, must-revalidate"
    #Header set Pragma "no-cache"

    SSLVerifyClient require
    SSLRequire %{SSL_CLIENT_S_DN_CN} eq "Apache1CPub"
    
</Directory>


# === Индексный файл ===
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

 

bases/post4egor/default.vrd

<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		base="/post4egor"
		ib="Srvr=&quot;onec&quot;;Ref=&quot;post4egor&quot;;usr=&quot;1CAPIUser&quot;;pwd=&quot;keef9yooy3Ze1itiexie&quot;;">
		<httpServices publishByDefault="false">
		<service name="Api"
			rootUrl="api"
			enable="true"
			reuseSessions="autouse"
			sessionMaxAge="60"
			poolSize="20"
			poolTimeout="10">
		</service>
	</httpServices>
</point>

 

Сертификат web-сервера

Выпуск самоподписанного сертификата

openssl req -x509 -nodes -days 3650 -newkey rsa:3072 \
  -keyout key.pem \
  -out cert.pem \
  -subj "/C=RU/ST=Moscow/L=Moscow/O=Company/OU=IT/CN=localhost"

Только для ознакомления. Не используйте самоподписанные сертификаты в бою 

 

Сертификат центра сертификации

Им будут подписаны клиентские сертификаты

openssl req -new -newkey rsa:3072 -nodes -keyout ca.key -x509 -days 3650 \
          -subj "/C=RU/ST=Msk/L=Msk/O=MyOrg/OU=MyUnit/CN=IT/emailAddress=usr@localhost" \
          -out ca.crt

 

Клиентские сертификаты

Методика выпуска подробно изложена в великолепной, нестареющей статье https://www.opennet.ru/base/sec/ssl_cert.txt.html

К публикации приложен файл Template.tar.bz2, в котором подготовлен каталог по методике из этой статьи (Только для unix-подобных систем)

В этом каталоге необходимо выполнить предыдущую команду по выпуску CA, и выпустить сам сертификат:

./create_cert ORGUNIT COMPANY VASYA PASS

Для примера выпустим сертификат Apache1CPub без пароля:

./create_cert IT Apache1CPub Apache1CPub
ls -l ./db/certs/Apache1CPub/Apache1CPub/
итого 22
-rw-r--r-- 1 root root 4617 янв 23 10:48 Apache1CPub.crt
-rw-r--r-- 1 root root 1037 янв 23 10:48 Apache1CPub.csr
-rw------- 1 root root 1704 янв 23 10:48 Apache1CPub.key
-rw------- 1 root root 3885 янв 23 10:48 Apache1CPub.p12

Для подключения достаточно p12 файла. После его установки стандартными средствами Win/Mac/Android, доступ будет получен в большинстве браузеров. Так же, подходит для использования тонким клиентом:

 

 

Запуск

 

Поместите в каталог conf/certs/ файлы key.pem,cert.pem,ca.crt

Откройте командную строку от имени администратора, перейдите в C:\Apache\bin, установите службу.

cd C:\Apache24\bin
httpd.exe -k install -n "Apache1CPubService"

Проверяем в браузере локально:

https://localhost:4453/post4egor/hs/api/v1/GetTables

 

Проверка

Файл p12 должен находиться в рабочей директории

curl -X POST \
  --cert-type P12 \
  --cert ./Apache1CPub.p12 \
  --pass "" \
  -H "Content-Type: application/json" \
  -d '{"key": "value"}' \
  -k \
  "https://apachehost:4453/post4egor/hs/api/v1/TakeJSON"
curl -X GET \
  --cert-type P12 \
  --cert ./Apache1CPub.p12 \
  --pass "" \
  -k \
  "https://apachehost:4453/post4egor/hs/api/test/"

Буду рад всем комментариям, надеюсь найти ошибки и пробелы в знаниях, в особенности в части составления httpd.conf для 1С, так как нечто цельное пока на глаза не попадалось. Этот файл готовил с помощью ЫЫ.

Вступайте в нашу телеграмм-группу Инфостарт

Apache SSL HTTP p12 JSON Публикация

См. также

Пароли Администрирование веб-серверов Системный администратор Программист Россия Абонемент ($m)

Для запуска базы, опубликованной на вебсервере через тонкий клиент (win/linux) с доменной авторизацией. Подходит для запуска тонкого клиента (база web публикация) с устройств не в домене, например для работы внешних пользователей.

1 стартмани

03.01.2026    3068    1    shooshpanius    0    

7

Администрирование веб-серверов Системный администратор Программист 1С 8.3 1С:Розница 2 Абонемент ($m)

Третий тонкий клиент Розница 2.3 (более двух сеансов) зависает сразу при открытии 3-го сеанса (файловая база + IIS + Тонкие клиенты) и виснут все открытые сессии. Быстрое решение на скриншотах ;)

1 стартмани

03.01.2026    846    vs12345    8    

5

Инструменты администратора БД Администрирование СУБД Администрирование веб-серверов Администрирование 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 1.х 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 1С:Документооборот 1С-КАМИН: Зарплата. Версия 5.0 1С:ТОИР Управление ремонтами и обслуживанием оборудования Платные (руб)

Обработка предназначена для компаний, использующих типовые конфигурации 1С (УТ, УНФ, Розница, ERP и др.), для которых необходим контроль ошибок, для того чтобы избежать поломки.

8540 руб.

23.12.2025    368    0    0    

2

Администрирование веб-серверов Linux Системный администратор Программист 1С:Предприятие 8 Бесплатно (free)

Проблема: При переходе с Windows на Linux многие сталкиваются с затруднениями при настройке аутентификации ОС в веб-клиенте 1С через Apache 2.4 (Debian). Решение: Команда Magnit Tech (Центр экспертизы 1С и Сопровождение 1C) разработала готовую инструкцию по настройке веб-клиента 1С на Debian 12 с поддержкой как Windows, так и Linux-серверов. Экономьте время — внедряйте проверенное!

25.07.2025    9195    biryukmikh    59    

29

Администрирование веб-серверов Сервера Нейросети Программист Платные (руб)

Сервер поиска по метаданным и поиска по коду, Сервер экспорта и поиска по документации, Сервер синтаксической проверки кода

17.06.2025    17039    0    Infostart    20    

113

Администрирование веб-серверов Системный администратор Бесплатно (free)

Как проксировать запросы извне на localhost при помощи IIS.

15.01.2025    3547    Miroshh    1    

4

Администрирование веб-серверов Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Абонемент ($m)

Внешняя обработка, подходит для любых конфигураций. Поддерживает apache и iis! Публикуйте базы легко и просто!

1 стартмани

22.11.2024    4556    46    Rafael-87    36    

35

Администрирование веб-серверов Сервера Системный администратор Программист Абонемент ($m)

WEB приложение для управления сеансами сервера 1С, имеет адаптивный web интерфейс. Возможности: удаление сеансов; завершение rphost процессов; запуск службы 1С сервера (если остановлена). Используется авторизация BasicAuth с защитой от брутфорса. Поддерживает работу по http https протоколам.

1 стартмани

08.11.2024    3353    15    gortrex    2    

4
Для отправки сообщения требуется регистрация/авторизация