Skip to main content

Организовать API с 1С

Apache

Качаем Apache, копируем на диск C

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/ssl/cert.pem
    SSLCertificateKeyFile conf/ssl/key.pem
    SSLCACertificateFile conf/ssl/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>

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>

Сертификат для веб-сервера

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"

CA

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

О том, как выпустить клиентские сертификаты в Apache написано тут:
https://www.opennet.ru/base/sec/ssl_cert.txt.html

Проверка

POST

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"

GET

curl -X GET \
  --cert-type P12 \
  --cert ./Apache1CPub.p12 \
  --pass "" \
  -k \
  "https://192.168.25.193:4453/post4egor/hs/api/test/"