Настройка аутентификации по сертификату в OpenConnect VPN Server (ocserv)

В этом руководстве будет показано, как настроить аутентификацию по сертификату на сервере OpenConnect VPN (ocserv) на Ubuntu.

OpenConnect (ocserv) — это реализация протокола VPN AnyConnect VPN с открытым исходным кодом.

В предыдущей статье я объяснил шаги по настройке сервера OpenConnect VPN с сертификатом сервера Let’s Encrypt TLS.

Let’s Encrypt не выдаёт сертификат клиента, поэтому в этой статье мы использовали аутентификацию по паролю.

Ввод имени пользователя и пароля каждый раз может быть проблемой, особенно если клиентское программное обеспечение, такое как приложение AnyConnect для Cisco в iOS, не предлагает возможность запоминать пароль.

Многие клиентские программы OpenConnect могут импортировать сертификат пользователя, который освободит пользователя от ввода имени пользователя и пароля.

Аутентификация по сертификату также более безопасна, чем аутентификация по паролю.

Предпосылки

Чтобы следовать этому руководству, предполагается, что вы уже настроили сервер OpenConnect VPN с сертификатом сервера Let’s Encrypt TLS.

Мы создадим наш собственный центр сертификации (Certificate Authority) для подписывания сертификата клиента.

Демон ocserv должен продолжать использовать сертификат сервера TLS, выпущенный Let’s Encrypt, поэтому клиентское программное обеспечение не будет отображать предупреждение о безопасности.

Настройка собственного центра CA(центра сертификации)

Мы будем использовать аутентификацию по сертификату, но Let’s Encrypt не выдаёт сертификат клиента, поэтому нам нужно создать собственный CA.

Вы можете открыть opensll для выполнения задания, но ocserv рекомендует GnuTLS, поэтому я покажу вам, как использовать GnuTLS. Установите пакет gnutls-bin.

sudo apt install gnutls-bin

Создайте подкаталог в /etc/ocserv/ для хранения секретных ключей и сертификатов.

sudo mkdir /etc/ocserv/ssl/

Измените рабочий каталог.

cd /etc/ocserv/ssl/

Создайте закрытый ключ для CA с помощью команды certtool, которая предоставляется пакетом gnutls-bin.

По умолчанию он генерирует 3072-разрядный RSA-ключ, которого достаточно.

sudo certtool --generate-privkey --outfile ca-privkey.pem

Прежде чем создавать сертификат CA, давайте создадим файл шаблона сертификата CA.

Формат файла шаблона можно найти в руководстве certtool (man certtool).

sudo nano ca-cert.cfg

Добавьте в файл следующие строки.

Замените параметры соответствующими значениями.

# X.509 Certificate options

# The organization of the subject.
organization = "Example Org"

# The common name of the certificate owner.
cn = "Example CA"

# The serial number of the certificate.
serial = 001

# In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date.
expiration_days = -1

# Whether this is a CA certificate or not
ca

# Whether this certificate will be used to sign data
signing_key

# Whether this key will be used to sign other certificates.
cert_signing_key

# Whether this key will be used to sign CRLs.
crl_signing_key

Сохраните и закройте файл. Теперь создайте сертификат CA, используя конфигурации из файла шаблона.

sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem

Теперь у нас есть файл сертификата CA (ca-cert.pem).

Создание клиентского сертификата

Теперь запустите следующую команду для создания закрытого ключа клиента.

sudo certtool --generate-privkey --outfile client-privkey.pem

Создайте файл шаблона сертификата клиента.

sudo nano client-cert.cfg

Добавьте следующие строки в файл. Uid должен быть именем пользователя в файле /etc/ocserv/ocpasswd.

# X.509 Certificate options
# The organization of the subject.
organization = "My Org"

# The common name of the certificate owner.
cn = "John Doe"

# A user id of the certificate owner.
uid = "username"

# In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date.
expiration_days = 3650

# Whether this certificate will be used for a TLS server
tls_www_client

# Whether this certificate will be used to sign data
signing_key

# Whether this certificate will be used to encrypt data (needed
# in TLS RSA ciphersuites). Note that it is preferred to use different
# keys for encryption and signing.
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

Обратите внимание, что приложение Cisco AnyConnect на iOS не поддерживает шифрование AES-256, поэтому, если пользователь использует устройство iOS, вы можете использовать 3des-pkcs12cipher.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile client.p12 --outder

Теперь у нас есть закрытый ключ клиента и сертификат, объединенный в один файл client.p12.

Запрос подписи сертификата

Чтобы секретные ключи конечных пользователей были секретными, пользователи могут генерировать запрос подписи сертификата (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

После этого администратор отправляет пользователю сертификат сертификата cert.pem.

Включение аутентификации сертификата в ocserv демоне

Отредактируйте файл конфигурации ocserv.

sudo nano /etc/ocserv/ocserv.conf

Чтобы включить аутентификацию по сертификату, раскомментируйте следующую строку.

auth = "certificate"

Если следующая строка также незакоментирована, это означает, что пользователь также должен ввести имя пользователя и пароль.

Поэтому, если проверки подлинности сертификата достаточно, чтобы подтвердить личность, закомментируйте следующую строку.

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

Если вы разрешаете пользователям выбирать аутентификацию по сертификату или аутентификацию пароля, добавьте следующую строку.

enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"

Теперь найдите следующую строку.

ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem

Для проверки сертификата клиента нам необходимо использовать наш собственный сертификат ЦС, поэтому измените эту строку на

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

Использование аутентификации по сертификату на Ubuntu

Используйте команду scp для загрузки файла client.p12 на рабочий стол Ubuntu.

scp user@vpn.example.com:/etc/ocserv/ssl/client.p12 ~

Затем установите клиентское программное обеспечение openconnect.

sudo apt install openconnect

Чтобы использовать аутентификацию по сертификату, запустите:

sudo openconnect -b vpn.example.com -c client.p12

Вам будет предложено разблокировать закрытый ключ клиента паролем.

Если пароль введен правильно, вы должны быть подключены к VPN-серверу.

Использование проверки подлинности сертификата в Windows и MacOS

Загрузите клиент GUI OpenConnect для Window или MacOS со страницы OpenConnect GUI Github.

Затем создайте новый профиль подключения VPN и импортируйте файл PKCS # 12 в поле сертификата пользователя.

Нажмите кнопку «Сохранить».

Вам нужно будет ввести PIN-код, чтобы разблокировать закрытый ключ.

После импорта вам больше не нужно вводить имя пользователя и пароль.

Использование аутентификации по сертификату на устройстве iOS

Пользователи iOS могут использовать приложение Cisco AnyConnect.

Чтобы импортировать сертификат клиента в приложение AnyConnect, вы можете сначала отправить файл PKCS # 12 на свой адрес электронной почты в приложении. Затем откройте приложение mail на iOS. Нажмите на приложение несколько секунд и поделитесь им с AnyConnect.

Затем введите PIN-код для импорта файла.

cryptoparty

Cryptography is typically bypassed, not penetrated.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

5e7fa976b0640d40