Исходный код вики Настройка https для PERCo-Web
Версия 1.1 от PROSTO:СКУД на 2026/09/30 09:35
Последние авторы
| author | version | line-number | content |
|---|---|---|---|
| 1 | # Подключение ПРОСТО:СКУД к PERCo-Web по HTTPS | ||
| 2 | |||
| 3 | Инструкция для администратора PERCo-Web и сервера 1С. Пример ниже использует IP-адрес `192.168.12.22`; перед выполнением замените его на адрес своего сервера. | ||
| 4 | |||
| 5 | ## 1. Определите адрес подключения | ||
| 6 | |||
| 7 | Адрес, указанный в настройках интеграции 1С, должен совпадать с адресом в сертификате PERCo-Web: | ||
| 8 | |||
| 9 | - Если 1С подключается по IP, сертификат должен содержать этот IP в поле **Subject Alternative Name (SAN)** как `IP Address`. | ||
| 10 | - Если 1С подключается по имени, сертификат должен содержать это имя в SAN как `DNS Name`. | ||
| 11 | |||
| 12 | Одного поля `CN` недостаточно для надёжной проверки адреса. [Правила проверки HTTPS-сертификата](https://www.rfc-editor.org/rfc/rfc9110.html#section-4.3.5) | ||
| 13 | |||
| 14 | Если у вас уже есть подходящий сертификат и закрытый ключ в файлах `.crt` и `.key`, переходите к разделу 3. | ||
| 15 | |||
| 16 | ## 2. Создайте сертификат с помощью OpenSSL | ||
| 17 | |||
| 18 | Команды выполняются в **PowerShell на Windows**. OpenSSL можно запустить на отдельном компьютере администратора. Выполняйте команды по порядку, **каждую строку отдельно**. | ||
| 19 | |||
| 20 | Укажите IP PERCo-Web и создайте новую папку: | ||
| 21 | |||
| 22 | ```powershell | ||
| 23 | $PercoIP = "192.168.12.22" | ||
| 24 | ``` | ||
| 25 | |||
| 26 | ```powershell | ||
| 27 | $CertDir = Join-Path $env:USERPROFILE ("perco-tls-" + (Get-Date -Format "yyyyMMdd-HHmmss")) | ||
| 28 | ``` | ||
| 29 | |||
| 30 | ```powershell | ||
| 31 | New-Item -ItemType Directory -Path $CertDir | ||
| 32 | ``` | ||
| 33 | |||
| 34 | ```powershell | ||
| 35 | Set-Location -LiteralPath $CertDir | ||
| 36 | ``` | ||
| 37 | |||
| 38 | Создайте внутренний удостоверяющий центр (УЦ). OpenSSL запросит пароль для файла `ca.key`: | ||
| 39 | |||
| 40 | ```powershell | ||
| 41 | 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') | ||
| 42 | ``` | ||
| 43 | |||
| 44 | ```powershell | ||
| 45 | 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" | ||
| 46 | ``` | ||
| 47 | |||
| 48 | Создайте ключ и запрос на сертификат сервера: | ||
| 49 | |||
| 50 | ```powershell | ||
| 51 | openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out perco.key | ||
| 52 | ``` | ||
| 53 | |||
| 54 | ```powershell | ||
| 55 | openssl req -new -sha256 -key perco.key -out perco.csr -subj "/CN=$PercoIP" | ||
| 56 | ``` | ||
| 57 | |||
| 58 | Добавьте IP в SAN и выпустите сертификат. При выпуске снова потребуется пароль от `ca.key`: | ||
| 59 | |||
| 60 | ```powershell | ||
| 61 | 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') | ||
| 62 | ``` | ||
| 63 | |||
| 64 | ```powershell | ||
| 65 | 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 | ||
| 66 | ``` | ||
| 67 | |||
| 68 | Проверьте сертификат: | ||
| 69 | |||
| 70 | ```powershell | ||
| 71 | openssl verify -CAfile ca.crt -purpose sslserver -verify_ip $PercoIP perco.crt | ||
| 72 | ``` | ||
| 73 | |||
| 74 | Ожидаемый результат — `perco.crt: OK`. Проверка SAN: | ||
| 75 | |||
| 76 | ```powershell | ||
| 77 | openssl x509 -in perco.crt -noout -ext subjectAltName -fingerprint -sha256 | ||
| 78 | ``` | ||
| 79 | |||
| 80 | В выводе должен быть нужный `IP Address`. Использованные расширения сертификата описаны в [документации OpenSSL](https://docs.openssl.org/3.0/man5/x509v3_config/). | ||
| 81 | |||
| 82 | ## 3. Установите сертификат в PERCo-Web | ||
| 83 | |||
| 84 | Откройте **Менеджер PERCo-Web → Настройки → HTTPS и сертификаты**: | ||
| 85 | |||
| 86 | 1. В поле сертификата выберите `perco.crt`. | ||
| 87 | 2. В поле ключа выберите соответствующий `perco.key`. | ||
| 88 | 3. Нажмите **Сохранить** и включите **HTTPS**. | ||
| 89 | 4. Проверьте, что для HTTPS назначен нужный порт, обычно `443`. | ||
| 90 | 5. На вкладке **Мониторинг** перезапустите **Web-сервер**. Если после этого порт 443 продолжает отдавать прежний сертификат, перезагрузите сервер PERCo-Web в согласованное время. | ||
| 91 | |||
| 92 | Поля загрузки сертификата и ключа описаны в [руководстве PERCo-Web](https://ru.percoweb.com/help/server_db.htm). **Не загружайте в PERCo-Web файл `ca.key`.** | ||
| 93 | |||
| 94 | ## 4. Настройте доверие на сервере 1С | ||
| 95 | |||
| 96 | Если использован внутренний УЦ из раздела 2, скопируйте **только `ca.crt`** на компьютер, где выполняется обмен 1С. В клиент-серверной базе это сервер 1С; при наличии кластера выполните шаг на каждом узле, который может выполнять обмен. | ||
| 97 | |||
| 98 | Запустите PowerShell от администратора и укажите фактический путь к скопированному файлу: | ||
| 99 | |||
| 100 | ```powershell | ||
| 101 | Import-Certificate -FilePath "C:\путь\к\ca.crt" -CertStoreLocation Cert:\LocalMachine\Root | ||
| 102 | ``` | ||
| 103 | |||
| 104 | Для просмотра хранилища нажмите **Win + R** и выполните `certlm.msc`. Сертификат УЦ должен появиться в **Доверенные корневые центры сертификации → Сертификаты**. [Документация Microsoft](https://learn.microsoft.com/en-us/powershell/module/pki/import-certificate?view=windowsserver2025-ps) | ||
| 105 | |||
| 106 | Если в PERCo-Web установлен сертификат от уже доверенного УЦ, отдельный импорт может не потребоваться. | ||
| 107 | |||
| 108 | ## 5. Проверьте действующий сертификат и подключение | ||
| 109 | |||
| 110 | После перезапуска PERCo-Web проверьте **не файл на диске, а сертификат, который реально выдаёт порт 443**: | ||
| 111 | |||
| 112 | ```powershell | ||
| 113 | '' | openssl s_client -connect "${PercoIP}:443" -noservername -showcerts 2>$null | openssl x509 -noout -subject -issuer -fingerprint -sha256 -ext subjectAltName | ||
| 114 | ``` | ||
| 115 | |||
| 116 | Сравните его SHA-256 отпечаток с отпечатком `perco.crt`. Они должны совпадать. В нашем случае именно эта проверка обнаружила, что после загрузки нового файла PERCo-Web продолжал выдавать старый сертификат до перезагрузки. | ||
| 117 | |||
| 118 | На сервере 1С проверьте HTTPS без отключения проверки сертификата: | ||
| 119 | |||
| 120 | ```powershell | ||
| 121 | curl.exe -v --noproxy "*" "https://${PercoIP}:443/api/system/auth" | ||
| 122 | ``` | ||
| 123 | |||
| 124 | Ответ HTTP `401` или `405` для этого тестового `GET` допустим: он означает, что HTTPS-соединение установлено и сервер ответил. После этого в настройках интеграции 1С укажите тот же IP, порт `443`, включите защищённое соединение и повторите подключение. | ||
| 125 | |||
| 126 | | Ошибка | Что проверить | | ||
| 127 | | :-- | :-- | | ||
| 128 | | `SEC_E_WRONG_PRINCIPAL`, «Главное конечное имя неверно» | IP или имя отсутствует в SAN; PERCo-Web выдаёт прежний сертификат | | ||
| 129 | | «Удаленный узел не прошел проверку» | Доверие к УЦ, срок и цепочку сертификата, доступ к проверке отзыва, настройки прокси | | ||
| 130 | | HTTP `401` | Учётные данные PERCo-Web | | ||
| 131 | | HTTP `405` при тесте через `curl.exe` | Для `/api/system/auth` нужен `POST`; проверка HTTPS уже прошла | | ||
| 132 | |||
| 133 | **Хранение ключей:** `perco.key` необходим Web-серверу PERCo-Web. `ca.key` — закрытый ключ внутреннего УЦ; храните его отдельно и не передавайте на сервер 1С или в PERCo-Web. |