SoftEther ServerCertSet: импорт обновлённой цепочки через vpncmd
Обновлённый файл не меняет идентичность сервера SoftEther. Импортируйте цепочку через ServerCertSet, подключите шаг развёртывания и прочитайте слушатель.
Certbot сообщает об успешном обновлении, файлы на диске несут новые даты, а клиенты всё ещё встречают старую идентичность. SoftEther хранит SSL-сертификат сервера в собственной конфигурации на уровне сервера, поэтому новый файл на диске ничего не меняет, пока не импортированы лист и его ключ. Приведённая ниже последовательность охватывает один ручной импорт, обёртку, которая запускается после каждого обновления, и проверку, которая читает, что слушатель действительно предъявляет. Каждый шаг оставляет доказательства, которые можно сравнить после следующего обновления.
Обновлённый файл не меняет идентичность сервера
Выдача и развёртывание — разные события с разными режимами отказа. Клиент ACME записывает файлы в каталог линии и фиксирует успех; SoftEther продолжает использовать сертификат, который последним был загружен в его конфигурацию. Поэтому нулевой код выхода описывает файлы, а не службу, и эти двое могут расходиться, пока никто не смотрит. Считайте импорт шагом развёртывания, а обновление — его входом.
Это различие объясняет и сбивающий с толку половинчатый отказ: старый сертификат работает до истечения срока, поэтому сначала ничего не выглядит сломанным. Когда срок истекает, все клиенты отказывают разом, что выглядит как сбой, а не как пропущенный шаг развёртывания. Проверка предъявляемой идентичности после каждого обновления превращает этот сюрприз в рутинное наблюдение.
Выберите испытание, подходящее слушателю
Сертификат должен называть хост, который проверяют клиенты, поэтому используйте публичное DNS-имя, а не внутреннюю метку или адрес. HTTP-01 требует, чтобы испытание было отвечено на порту 80 на мгновение, что является временным слушателем и никогда не причиной переносить собственный порт SoftEther. DNS-01 доказывает контроль через запись и вовсе не нуждается во входящем HTTP.
Обновление без присмотра означает автоматическую интеграцию DNS с учётными данными, ограниченными одной зоной, а не запись TXT, которую вручную вводят раз в два месяца. Подстановочный знак меняет тип испытания, а не потребность в этой автоматизации. Решите это до появления первого сертификата, потому что смена типа испытания позже означает трогать конфигурацию клиента и брандмауэр одновременно.
Держите артефакты в порядке, пока вы здесь. Лист и промежуточные сертификаты приходят отдельными файлами и одним объединённым файлом цепочки, закрытый ключ снова отдельно, а импорту нужна цепочка с соответствующим ключом, а не публичный сертификат сам по себе.
Импортируйте цепочку на уровне сервера
Сделайте резервную копию конфигурации сервера и убедитесь, что по-прежнему достигаете интерфейса управления, прежде чем трогать сертификат. Подключайтесь как администратор сервера, а не как администратор Virtual Hub, потому что сертификат принадлежит объекту сервера. Затем загрузите цепочку и ключ по абсолютному пути, из файлов, которые может прочитать учётная запись, выполняющая команду. Учтите, что пути абсолютные, потому что команда разрешает их из рабочего каталога того процесса, который запустил vpncmd:
ServerCertSet /LOADCERT:/etc/letsencrypt/live/vpn.example.com/fullchain.pem /LOADKEY:/etc/letsencrypt/live/vpn.example.com/privkey.pemЧитайте вывод команды, а не предполагайте успех, и затем перечитайте цепочку, а не доверяйте переданному файлу. Граница между сборками, которые импортируют весь пакет PEM, и сборками, которые берут только первый сертификат, не задокументирована в одном месте, поэтому именно проверка решает это для сборки перед вами. Посчитайте сертификаты, которые предъявляет слушатель; лист без промежуточных — это подпись импортёра, израсходовавшего только первый блок.
Держите импортированный ключ читаемым только для учётной записи, которая запускает сервер, и держите пароль управления вне истории оболочки. При этом первом импорте введите пароль по запросу, а не передавайте его аргументом команды. Эти две привычки ничего не стоят и убирают самый распространённый способ, которым развёртывание сертификата выдаёт то, что должно было защищать. Сделайте это до первого импорта, а не после.
Подключите развёртывание, а не обновление
Когда ручной импорт работает, поместите именно эти шаги в небольшую обёртку и вызовите её из клиента ACME после успешного обновления. Certbot задаёт для хука RENEWED_LINEAGE и RENEWED_DOMAINS, поэтому обёртка может действовать на один сертификат на машине, которая управляет несколькими. Фильтруйте по линии, а не реагируйте на каждое обновление на хосте. Обёртка — это код развёртывания, который работает с правами сервера, поэтому проверяйте её как любой другой скрипт в такой роли.
certbot renew --deploy-hook /usr/local/sbin/softether-deploy.shХук, работающий без присмотра, нуждается в собственном защищённом хранилище учётных данных и в сигнале об отказе, который доходит до человека. Если выдача удалась, а импорт не удался, повторите импорт, а не запрашивайте другой сертификат, потому что второй запрос скрывает дефект развёртывания за новым файлом. Документация Certbot по обновлению ясно говорит, что запуск, ничего не обновляющий, — нормальный результат, поэтому именно хук различает эти два случая.
Сравните предъявленную цепочку с файлом
Читайте слушатель, а не диск. Подключитесь к порту, обращённому к клиентам, с именем сервера, которое используют клиенты, затем сравните отпечаток и доставленную цепочку с линией, установленной хуком. Две команды покрывают это, и первая также показывает, приходят ли промежуточные вообще:
openssl s_client -connect vpn.example.com:443 -servername vpn.example.com -showcerts </dev/null 2>/dev/null | grep -c 'BEGIN CERTIFICATE'
openssl s_client -connect vpn.example.com:443 -servername vpn.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates -fingerprint -sha256Затем создайте новое клиентское подключение, потому что сеансы, установленные до импорта, были аутентифицированы по прежней идентичности и ничего не доказывают о новой. Если клиенты закрепляют старый лист, им нужна согласованная актуализация даже когда публичная цепочка действительна, и эта задача относится к тому же runbook, что и обновление. Обратный прокси перед службой может предъявлять хороший сертификат, пока слушатель VPN всё ещё держит старый, и поэтому проверка должна называть порт, до которого клиенты действительно доходят. Запишите отпечаток рядом с датой обновления, чтобы следующее сравнение было проверкой, а не актом памяти.