Настройка https для PERCo-Web

Версия 1.1 от PROSTO:СКУД на 2026/09/30 09:35

# Подключение ПРОСТО:СКУД к PERCo-Web по HTTPS

Инструкция для администратора PERCo-Web и сервера 1С. Пример ниже использует IP-адрес `192.168.12.22`; перед выполнением замените его на адрес своего сервера.

 1. Определите адрес подключения

Адрес, указанный в настройках интеграции 1С, должен совпадать с адресом в сертификате PERCo-Web:

- Если 1С подключается по IP, сертификат должен содержать этот IP в поле Subject Alternative Name (SAN) как `IP Address`.
- Если 1С подключается по имени, сертификат должен содержать это имя в SAN как `DNS Name`.

Одного поля `CN` недостаточно для надёжной проверки адреса. [Правила проверки HTTPS-сертификата](https://www.rfc-editor.org/rfc/rfc9110.html#section-4.3.5)

Если у вас уже есть подходящий сертификат и закрытый ключ в файлах `.crt` и `.key`, переходите к разделу 3.

 2. Создайте сертификат с помощью OpenSSL

Команды выполняются в PowerShell на Windows. OpenSSL можно запустить на отдельном компьютере администратора. Выполняйте команды по порядку, каждую строку отдельно.

Укажите IP PERCo-Web и создайте новую папку:

```powershell
$PercoIP = "192.168.12.22"
```

```powershell
$CertDir = Join-Path $env:USERPROFILE ("perco-tls-" + (Get-Date -Format "yyyyMMdd-HHmmss"))
```

```powershell
New-Item -ItemType Directory -Path $CertDir
```

```powershell
Set-Location -LiteralPath $CertDir
```

Создайте внутренний удостоверяющий центр (УЦ). OpenSSL запросит пароль для файла `ca.key`:

```powershell
Set-Content -Path .\ca.cnf -Encoding ascii -Value @('[req]','distinguished_name = dn','x509_extensions = v3_ca','[dn]','CN = PERCo Internal Root CA','[v3_ca]','basicConstraints = critical,CA:TRUE,pathlen:0','keyUsage = critical,keyCertSign,cRLSign','subjectKeyIdentifier = hash')
```

```powershell
openssl req -x509 -newkey rsa:3072 -sha256 -days 3650 -keyout ca.key -out ca.crt -config ca.cnf -extensions v3_ca -subj "/CN=PERCo Internal Root CA"
```

Создайте ключ и запрос на сертификат сервера:

```powershell
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out perco.key
```

```powershell
openssl req -new -sha256 -key perco.key -out perco.csr -subj "/CN=$PercoIP"
```

Добавьте IP в SAN и выпустите сертификат. При выпуске снова потребуется пароль от `ca.key`:

```powershell
Set-Content -Path .\server.ext -Encoding ascii -Value @('[v3_server]','basicConstraints = critical,CA:FALSE','keyUsage = critical,digitalSignature,keyEncipherment','extendedKeyUsage = serverAuth',"subjectAltName = IP:$PercoIP",'subjectKeyIdentifier = hash','authorityKeyIdentifier = keyid,issuer')
```

```powershell
openssl x509 -req -in perco.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out perco.crt -days 397 -sha256 -extfile server.ext -extensions v3_server
```

Проверьте сертификат:

```powershell
openssl verify -CAfile ca.crt -purpose sslserver -verify_ip $PercoIP perco.crt
```

Ожидаемый результат — `perco.crt: OK`. Проверка SAN:

```powershell
openssl x509 -in perco.crt -noout -ext subjectAltName -fingerprint -sha256
```

В выводе должен быть нужный `IP Address`. Использованные расширения сертификата описаны в [документации OpenSSL](https://docs.openssl.org/3.0/man5/x509v3_config/).

 3. Установите сертификат в PERCo-Web

Откройте Менеджер PERCo-Web → Настройки → HTTPS и сертификаты:

  1. В поле сертификата выберите `perco.crt`.
    2. В поле ключа выберите соответствующий `perco.key`.
    3. Нажмите Сохранить и включите HTTPS.
    4. Проверьте, что для HTTPS назначен нужный порт, обычно `443`.
    5. На вкладке Мониторинг перезапустите Web-сервер. Если после этого порт 443 продолжает отдавать прежний сертификат, перезагрузите сервер PERCo-Web в согласованное время.

Поля загрузки сертификата и ключа описаны в [руководстве PERCo-Web](https://ru.percoweb.com/help/server_db.htm). Не загружайте в PERCo-Web файл `ca.key`.

 4. Настройте доверие на сервере 1С

Если использован внутренний УЦ из раздела 2, скопируйте только `ca.crt` на компьютер, где выполняется обмен 1С. В клиент-серверной базе это сервер 1С; при наличии кластера выполните шаг на каждом узле, который может выполнять обмен.

Запустите PowerShell от администратора и укажите фактический путь к скопированному файлу:

```powershell
Import-Certificate -FilePath "C:\путь\к\ca.crt" -CertStoreLocation Cert:\LocalMachine\Root
```

Для просмотра хранилища нажмите Win + R и выполните `certlm.msc`. Сертификат УЦ должен появиться в Доверенные корневые центры сертификации → Сертификаты. [Документация Microsoft](https://learn.microsoft.com/en-us/powershell/module/pki/import-certificate?view=windowsserver2025-ps)

Если в PERCo-Web установлен сертификат от уже доверенного УЦ, отдельный импорт может не потребоваться.

 5. Проверьте действующий сертификат и подключение

После перезапуска PERCo-Web проверьте не файл на диске, а сертификат, который реально выдаёт порт 443:

```powershell
'' | openssl s_client -connect "${PercoIP}:443" -noservername -showcerts 2>$null | openssl x509 -noout -subject -issuer -fingerprint -sha256 -ext subjectAltName
```

Сравните его SHA-256 отпечаток с отпечатком `perco.crt`. Они должны совпадать. В нашем случае именно эта проверка обнаружила, что после загрузки нового файла PERCo-Web продолжал выдавать старый сертификат до перезагрузки.

На сервере 1С проверьте HTTPS без отключения проверки сертификата:

```powershell
curl.exe -v noproxy "*" "https://${PercoIP}:443/api/system/auth"
```

Ответ HTTP `401` или `405` для этого тестового `GET` допустим: он означает, что HTTPS-соединение установлено и сервер ответил. После этого в настройках интеграции 1С укажите тот же IP, порт `443`, включите защищённое соединение и повторите подключение.

 Ошибка  Что проверить 
 :  : 
 `SEC_E_WRONG_PRINCIPAL`, «Главное конечное имя неверно»  IP или имя отсутствует в SAN; PERCo-Web выдаёт прежний сертификат 
 «Удаленный узел не прошел проверку»  Доверие к УЦ, срок и цепочку сертификата, доступ к проверке отзыва, настройки прокси 
 HTTP `401`  Учётные данные PERCo-Web 
 HTTP `405` при тесте через `curl.exe`  Для `/api/system/auth` нужен `POST`; проверка HTTPS уже прошла 

Хранение ключей: `perco.key` необходим Web-серверу PERCo-Web. `ca.key` — закрытый ключ внутреннего УЦ; храните его отдельно и не передавайте на сервер 1С или в PERCo-Web.