В данном руководстве описан процесс настройки аутентификации с использованием сертификатов на VPN-сервере OpenConnect (ocserv) для операционных систем Debian, Ubuntu, CentOS и RHEL. OpenConnect (ocserv) представляет собой открытую реализацию VPN-протокола Cisco AnyConnect.
В предыдущем материале я описал процесс настройки VPN-сервера OpenConnect с использованием TLS-сертификата от Let’s Encrypt. Поскольку Let’s Encrypt не предоставляет клиентские сертификаты, мы прибегли к аутентификации с помощью пароля. Постоянный ввод логина и пароля может быть неудобным, особенно если используемое клиентское программное обеспечение, например, Cisco AnyConnect для iOS, не поддерживает сохранение паролей. Однако многие клиенты OpenConnect позволяют импортировать пользовательские сертификаты, что исключает необходимость ввода учетных данных. Кроме того, аутентификация через сертификаты обеспечивает более высокий уровень безопасности по сравнению с использованием паролей.
В данном руководстве предполагается, что вы уже настроили VPN-сервер OpenConnect с TLS-сертификатом, полученным от Let’s Encrypt.
sudo certtool --generate-privkey --outfile client-privkey. pem
Подготовьте образец файла сертификата для клиента.
sudo nano client-cert.cfg
Вставьте указанные строки в документ. UID следует использовать в качестве имени пользователя из файла.
/etc/ocserv/ocpasswd
# Параметры сертификата X.509
Организация, обладающая сертификатом.
vpn.example.com
Полное наименование владельца сертификата.
Идентификатор пользователя, которому принадлежит сертификат.
uid = "username"
Срок действия сертификата указывается в днях, начиная с текущей даты. Введите -1, если сертификат не имеет ограничений по времени.
Использование сертификата для клиента TLS.
tls_www_client
Применение сертификата для подписи информации.
signing_key
Применение сертификата для защиты данных с использованием шифрования (требуется для шифров TLS RSA).
Лучше применять разные ключи для шифрования и подписи.
encryption_key
Сохраните файл и закройте его. После этого выполните команду для создания клиентского сертификата, который будет подписан закрытым ключом центра сертификации (CA).
sudo certtool --generate-certificate --load-privkey client-privkey. pem --load-ca-certificate ca-cert. pem --load-ca-privkey ca-privkey. pem --template client-cert.cfg --outfile client-cert. pem
Скомбинируйте клиентский закрытый ключ с сертификатом в файл формата PKCS #12, зашифрованный PIN-кодом.
sudo certtool --to-p12 --load-privkey client-privkey. pem --load-certificate client-cert. pem --pkcs-cipher aes-256 --outfile client. p12 --outder
Теперь у нас есть клиентский закрытый ключ и сертификат, собранные в едином файле.
client. p12
Имейте в виду, что приложение Cisco AnyConnect для iOS не поддерживает шифрование AES-256 и не сможет использовать сертификат клиента. Для устройств на iOS рекомендуется применять другой шифр.
3des-pkcs12
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outder
Закрытый ключ клиента и сертификат находятся в одном файле.
ios-client.p12
Этот этап важен, когда в сети VPN подключается несколько пользователей, и каждый из них желает применять свой уникальный закрытый ключ.
Для обеспечения конфиденциальности закрытых ключей пользователей им следует создать запрос на подписание сертификата (CSR), используя свои ключи, и направить его администратору, который осуществит выдачу сертификата. В первую очередь пользователям необходимо создать закрытый ключ и шаблон сертификата с помощью указанных команд. После этого они могут сгенерировать CSR, используя следующую команду. Файл…
request.pem
будет удостоверен с использованием закрытого ключа владельца.
certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pem
Пользователь загружает документы.
request.pem
и
client-cert.cfg
администратору, который осуществляет следующую команду для создания клиентского сертификата.
sudo certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --load-request request.pem --template client-cert.cfg --outfile client-cert.pem
После этого администратор передает файл.
client-cert.pem
Измените файл конфигурации ocserv.
sudo nano /etc/ocserv/ocserv.conf
В предыдущем руководстве мы ввели строку, которая позволяет активировать аутентификацию с использованием пароля.
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
Для активации аутентификации с помощью сертификата, уберите комментарий с указанной строки.
auth = "certificate"
Если обе строки, упомянутые выше, активированы, это означает, что пользователю необходимо пройти как аутентификацию по паролю, так и по сертификату. Если для проверки личности достаточно только аутентификации по сертификату, следует закомментировать первую строку.
Чтобы предоставить пользователям возможность выбирать между аутентификацией с помощью сертификата и пароля, включите следующие строки:
enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]" auth = "certificate"
Теперь определите параметр.
ca-cert
В системах Debian/Ubuntu его устанавливают как
ca-cert = /etc/ssl/certs/ssl-cert-snakeoil. pem
В CentOS 8 и RHEL 8 он установлен в качестве
ca-cert = /etc/ocserv/ca. pem
Необходимо использовать наш собственный сертификат CA для верификации клиентского сертификата, поэтому измените данную строку на
ca-cert = /etc/ocserv/ssl/ca-cert. pem
Затем обнаружьте следующий ряд.
cert-user-oid = 0.9.2342.19200300.100.1.1
Эту строку трогать не следует. Просто имейте в виду, что
0.9.2342.19200300.100.1.1
представляет собой поле UID в сертификате клиента. Эта строка информирует демон о…
ocserv
Имя пользователя нужно находить в поле UID клиентского сертификата. При условии успешной проверки клиентского сертификата центром сертификации и демоном…
ocserv
выискивает подходящее имя пользователя в документе
/etc/ocserv/ocpasswd
Таким образом, клиент получит возможность зайти в систему.
Сохраните изменения и закройте документ. После этого выполните перезапуск.
ocserv
sudo systemctl restart ocserv
Применение сертификатной аутентификации на настольных системах Debian, Ubuntu, CentOS и RHEL.
scp
для загрузки файла
client. p12
на вашем рабочем столе Debian/Ubuntu/CentOS/RHEL.
scp :/etc/ocserv/ssl/client. p12 ~
После этого установите клиентское программное обеспечение.
openconnect
sudo apt install openconnect
sudo dnf install epel-release sudo dnf install openconnect
Для применения аутентификации с помощью сертификата, выполните следующую команду.
sudo openconnect - b vpn. example.com - c client. p12
Вам будет предложено активировать приватный ключ клиента, используя пароль, установленный ранее в данном руководстве.

При корректном вводе парольной фразы вы сможете подключиться к VPN-серверу.
Применение сертификационной аутентификации на системах Windows и MacOS. Загрузите клиент OpenConnect GUI для Windows или MacOS с официальной страницы OpenConnect GUI на GitHub. После этого создайте новый профиль VPN-соединения и загрузите файл PKCS #12 в раздел пользовательского сертификата. Нажмите «Сохранить». Вам потребуется ввести PIN-код для разблокировки закрытого ключа, после чего имя пользователя и пароль вводить не понадобится.

Применение сертификатной аутентификации на устройствах iOS. Пользователи iOS имеют возможность воспользоваться приложением Cisco AnyConnect. Для того чтобы импортировать клиентский сертификат в это приложение, сначала отправьте файл PKCS #12 себе на электронную почту в виде вложения. Затем откройте почтовое приложение на вашем устройстве iOS. Нажмите на вложение и удерживайте его несколько секунд, после чего выберите опцию поделиться через AnyConnect. Введите PIN-код для завершения импорта файла.

После импорта отредактируйте ваше VPN-подключение в AnyConnect. Перейдите в Дополнительно ->Выберите клиентский сертификат и сохраните изменения в настройках. Теперь вводить имя пользователя и пароль на вашем iOS-устройстве больше не потребуется. Приложение Cisco AnyConnect не сохраняет учетные данные, поэтому при аутентификации с помощью пароля VPN-соединение будет разрываться при бездействии телефона. При использовании аутентификации по сертификату приложение автоматически восстановит соединение с VPN-сервером в случае его потери.
В обновленной версии клиента AnyConnect для iOS наблюдается неисправность при аутентификации с использованием сертификата в протоколе TLS 1.3. Если в журнале ocserv (sudo journalctl — eu ocserv) появляется аналогичное сообщение об ошибке, значит, вы столкнулись с той же проблемой.
GnuTLS error (at worker-vpn. c:795): A TLS fatal alert has been received.
Для работы с клиентом AnyConnect на iOS вам следует либо применить аутентификацию по паролю, либо отключить TLS 1.3 в конфигурации ocserv. Для этого откройте файл /etc/ocserv/ocserv.conf, найдите параметр tls-priorities и добавьте в конец строку :-VERS-TLS1.3, чтобы деактивировать TLS 1.3.
tls-priorities
Сохраните файл и закройте его. После этого перезапустите ocserv.
sudo systemctl restart ocserv
Обратите внимание: если в логах ocserv встречается упоминание SSL 3.3, не стоит паниковать. SSL 3.3 — это альтернатива для TLS 1.2. Ваше соединение является безопасным с использованием TLS.

