Что такое ключ для OpenVPN и зачем он нужен
OpenVPN — это технология для создания защищённых частных сетей (VPN), которая использует аутентификацию и шифрование на основе протокола SSL/TLS. Ключи и сертификаты — это основа безопасности OpenVPN: они подтверждают личность клиента и сервера, а также шифруют передаваемые данные.
В типичной настройке OpenVPN используется инфраструктура открытых ключей (PKI), где есть центр сертификации (CA), который выпускает сертификаты для сервера и каждого клиента. Каждый клиент получает набор файлов: сертификат клиента (client.crt), закрытый ключ клиента (client.key), сертификат CA (ca.crt) и, опционально, ключ TLS-аутентификации (ta.key). Эти файлы вместе образуют «ключ для VPN OpenVPN».
Без правильно настроенных ключей невозможно установить соединение. Сервер проверяет сертификат клиента, а клиент — сертификат сервера. Если хотя бы один элемент отсутствует или не совпадает, соединение не будет установлено. Поэтому понимание того, как создаются и используются ключи, критически важно для администрирования OpenVPN.
Основные компоненты ключа OpenVPN
Чтобы понять, как работает ключ для OpenVPN, нужно разобраться в каждом файле, входящем в его состав.
Сертификат CA (ca.crt) — это публичный сертификат центра сертификации. Он используется для проверки подлинности всех остальных сертификатов. Клиент и сервер должны доверять этому сертификату, поэтому он распространяется на все устройства.
Сертификат клиента (client.crt) — выдаётся центром сертификации конкретному пользователю или устройству. Он содержит информацию о владельце и публичный ключ.
Закрытый ключ клиента (client.key) — секретный файл, который хранится только на устройстве клиента. Он используется для расшифровки данных и создания цифровой подписи. Никогда не передавайте его по открытым каналам.
Ключ TLS-аутентификации (ta.key) — дополнительный статический ключ, который используется для защиты от DoS-атак и сканирования портов. Он добавляет дополнительный уровень аутентификации до начала TLS-рукопожатия.
Файл параметров Диффи-Хеллмана (dh.pem) — используется на сервере для обеспечения совершенной прямой секретности (PFS). Он генерируется один раз и не является секретным.
Все эти компоненты вместе обеспечивают многоуровневую защиту: аутентификацию, шифрование и целостность данных.
Создание ключей с помощью Easy-RSA 3
Easy-RSA — это утилита для управления PKI, которая входит в состав большинства дистрибутивов Linux. Версия 3 значительно отличается от второй по синтаксису, но сохраняет ту же логику работы.
Установка и подготовка
Установите Easy-RSA командой apt install easy-rsa (для Debian/Ubuntu). Затем скопируйте директорию в удобное место, например, в /etc/easy-rsa:
cp -r /usr/share/easy-rsa /etc
cd /etc/easy-rsaПеред созданием ключей рекомендуется настроить файл vars, скопировав шаблон vars.example. В нём можно задать страну, город, организацию и другие данные, которые будут вшиты в сертификаты. Также можно изменить размер ключа (по умолчанию 2048 бит) и срок действия сертификатов.
Инициализация PKI и создание CA
Выполните:
./easyrsa init-pki
./easyrsa build-caПервая команда создаёт структуру директорий. Вторая — генерирует корневой сертификат и закрытый ключ CA. При этом будет запрошен пароль для защиты закрытого ключа CA. Этот пароль нужно запомнить — он потребуется для подписания сертификатов.
Создание серверного ключа
Для сервера создайте запрос на сертификат и подпишите его:
./easyrsa gen-req ovpn-server nopass
./easyrsa sign-req server ovpn-serverОпция nopass означает, что закрытый ключ сервера будет без пароля, что необходимо для автоматического запуска сервера. После подписания сертификат появится в pki/issued, а ключ — в pki/private.
Создание клиентского ключа
Аналогично создаётся ключ для каждого клиента:
./easyrsa gen-req ivanov_ivan nopass
./easyrsa sign-req client ivanov_ivanИмя клиента должно быть уникальным и осмысленным, чтобы потом легко определить владельца.
Настройка сервера OpenVPN
После создания ключей необходимо настроить сервер. Обычно файлы ключей копируются в директорию /etc/openvpn/keys:
mkdir /etc/openvpn/keys
cp pki/ca.crt pki/dh.pem /etc/openvpn/keys
cp pki/private/ovpn-server.key pki/issued/ovpn-server.crt /etc/openvpn/keysЗатем создаётся конфигурационный файл сервера, например, /etc/openvpn/server.conf. В нём указываются:
ca keys/ca.crt— сертификат CAcert keys/ovpn-server.crt— сертификат сервераkey keys/ovpn-server.key— закрытый ключ сервераdh keys/dh.pem— параметры Диффи-Хеллманаtls-auth keys/ta.key 0— ключ TLS-аутентификации (0 для сервера)crl-verify keys/crl.pem— список отозванных сертификатов (если используется)
Также настраиваются сетевые параметры: порт, протокол, диапазон IP-адресов для клиентов, маршруты и т.д.
После сохранения конфигурации сервер запускается, и он готов принимать подключения от клиентов, у которых есть действительные ключи.
Настройка клиента OpenVPN
Для подключения к серверу клиенту нужны следующие файлы: ca.crt, client.crt, client.key, ta.key и конфигурационный файл client.ovpn. Обычно эти файлы передаются пользователю в виде архива.
Конфигурационный файл клиента может выглядеть так:
client
dev tun
proto udp
remote your-server.com 1194
cipher AES-256-CBC
tls-client
remote-cert-tls server
comp-lzo
auth-user-pass
key-direction 1
... содержимое ca.crt ...
... содержимое ta.key ...
... содержимое client.crt ...
... содержимое client.key ...
Вместо указания путей к файлам можно встроить их содержимое прямо в конфигурацию, используя блоки `, , , . Это удобно, когда нужно передать один файл .ovpn` вместо нескольких.
Важно: если используется tls-auth, то в клиентском конфиге нужно указать key-direction 1, а в серверном — key-direction 0.
Объединение ключей в один файл .ovpn
Часто возникает необходимость передать клиенту один файл конфигурации, в котором уже содержатся все ключи и сертификаты. Это упрощает развёртывание и снижает риск потери отдельных файлов.
Процесс объединения можно автоматизировать с помощью скрипта. Например, на сервере можно выполнить:
client_conf=$(cat ~/User.ovpn)
client_cert=$(cat ~/easy-rsa/pki/issued/User.crt)
client_key=$(cat ~/easy-rsa/pki/private/User.key)
ca=$(cat ~/easy-rsa/pki/ca.crt)
ta=$(cat /etc/openvpn/keys/ta.key)
cat < clients.ovpn
$client_conf
EOF
cat <> clients.ovpn
$ca
EOF
cat <> clients.ovpn
$ta
EOF
cat <> clients.ovpn
$client_cert
EOF
cat <> clients.ovpn
$client_key
EOFПосле этого из исходного конфига нужно удалить строки, ссылающиеся на внешние файлы (ca, cert, key, tls-auth), и заменить tls-auth "ta.key" 1 на key-direction 1.
В результате получается один файл clients.ovpn, который можно передать пользователю. При импорте в клиентское приложение все данные будут загружены автоматически.
Управление отзывом сертификатов
В корпоративной среде часто возникает необходимость отозвать доступ для конкретного сотрудника или устройства. Для этого используется список отозванных сертификатов (CRL).
Сначала создайте CRL:
./easyrsa gen-crlЗатем скопируйте или создайте символьную ссылку на файл crl.pem в директорию ключей OpenVPN и добавьте в конфигурацию сервера строку:
crl-verify keys/crl.pemПосле этого перезапустите сервер. Теперь, чтобы отозвать сертификат, выполните:
./easyrsa revoke имя_клиента
./easyrsa gen-crlСервер автоматически проверит CRL при подключении и отклонит клиента с отозванным сертификатом.
Просмотреть статус сертификатов можно командой cat pki/index.txt. Строки, начинающиеся с V, означают действительный сертификат, R — отозванный.
Использование единого ключа для всех клиентов
В некоторых случаях, например, когда OpenVPN настроен на внешнюю авторизацию через Active Directory или облачный LDAP, нет необходимости генерировать отдельные ключи для каждого пользователя. Можно использовать один общий ключ для всех клиентов, а доступ контролировать на стороне LDAP-сервера через членство в группах.
Такой подход упрощает администрирование: не нужно создавать и распространять множество сертификатов. Достаточно один раз создать ключ и включить его в конфигурацию, которая используется всеми клиентами.
Однако при этом снижается безопасность: если ключ скомпрометирован, злоумышленник получит доступ к VPN, если только не настроена дополнительная аутентификация (например, по паролю). Поэтому такой метод рекомендуется использовать только в связке с внешней системой аутентификации, которая проверяет учётные данные пользователя.
Для объединения всех ключей в один файл можно использовать тот же скрипт, что описан выше, но с одним набором файлов для всех клиентов.
Безопасность ключей OpenVPN: лучшие практики
Ключи и сертификаты — это критически важные элементы безопасности. Их компрометация может привести к несанкционированному доступу к вашей сети.
Защита закрытых ключей
- Закрытый ключ CA должен храниться в безопасном месте, желательно на отдельном компьютере без доступа в интернет.
- Закрытые ключи клиентов и сервера должны быть доступны только соответствующим пользователям и процессам.
- Никогда не передавайте закрытые ключи по открытым каналам (email, мессенджеры). Используйте защищённые методы передачи.
Использование паролей
- Для ключа CA обязательно установите пароль. Это защитит от использования ключа без вашего ведома.
- Для клиентских ключей можно использовать пароль, но это потребует ввода пароля при каждом подключении. Для автоматических подключений используйте
nopass.
Регулярное обновление
- Следите за сроком действия сертификатов. Настраивайте напоминания о необходимости продления.
- При увольнении сотрудника или компрометации ключа немедленно отзывайте сертификат.
Дополнительные меры
- Используйте
tls-authдля защиты от DoS-атак. - Ограничьте доступ к конфигурационным файлам и ключам на сервере.
- Регулярно обновляйте OpenVPN и Easy-RSA до актуальных версий.
Частые ошибки и способы их решения
При работе с ключами OpenVPN пользователи часто сталкиваются с типичными проблемами.
Ошибка «TLS key negotiation failed»
Эта ошибка возникает, когда клиент и сервер не могут согласовать параметры TLS. Причины могут быть разными: несовпадение tls-auth ключа, неправильное направление (key-direction), неверный порт или протокол. Проверьте, что на сервере указано key-direction 0, а на клиенте — key-direction 1.
Ошибка «VERIFY ERROR: depth=0, error=unable to get local issuer certificate»
Это означает, что клиент не доверяет сертификату CA. Убедитесь, что файл ca.crt на клиенте совпадает с сертификатом CA на сервере.
Проблемы с правами доступа
OpenVPN может отказаться запускаться, если файлы ключей имеют слишком открытые права. Убедитесь, что закрытые ключи доступны только владельцу (например, chmod 600).
Истёкшие сертификаты
Если сертификат истёк, соединение не установится. Проверьте даты в сертификатах и при необходимости перевыпустите их.
Несовпадение cipher
Если на сервере и клиенте указаны разные шифры, соединение может не установиться. Убедитесь, что параметр cipher совпадает в обоих конфигах.
Вопросы и ответы
Можно ли использовать один ключ для всех клиентов OpenVPN?
Да, можно. Это удобно, когда доступ контролируется внешней системой аутентификации (например, Active Directory). В этом случае все клиенты используют один и тот же сертификат и ключ, а доступ ограничивается на уровне LDAP-групп. Однако такой подход снижает безопасность, так как при компрометации ключа злоумышленник получит доступ к VPN. Рекомендуется использовать его только в связке с дополнительной аутентификацией по паролю.
Как объединить все ключи и сертификаты в один файл .ovpn?
Для этого нужно вставить содержимое файлов ca.crt, client.crt, client.key и ta.key в конфигурационный файл в соответствующих блоках `, , , . Также необходимо удалить строки, ссылающиеся на внешние файлы, и заменить tls-auth "ta.key" 1 на key-direction 1`. Это можно сделать вручную или с помощью скрипта, который автоматически собирает файл.
Что делать, если я потерял закрытый ключ клиента?
Если закрытый ключ клиента утерян или скомпрометирован, необходимо отозвать соответствующий сертификат на сервере с помощью ./easyrsa revoke имя_клиента и затем сгенерировать новый ключ и сертификат для этого клиента. После этого обновите CRL и передайте новый ключ пользователю.
Как часто нужно обновлять ключи OpenVPN?
Срок действия сертификатов задаётся при их создании. По умолчанию в Easy-RSA сертификаты CA действуют 10 лет, а сертификаты клиентов и сервера — 5 лет. Рекомендуется обновлять ключи до истечения срока, а также при увольнении сотрудников или подозрении на компрометацию. Регулярное обновление повышает безопасность.
Можно ли использовать OpenVPN без сертификатов, только с паролем?
Да, OpenVPN поддерживает аутентификацию по паролю (auth-user-pass), но для шифрования всё равно необходимы ключи и сертификаты. Можно использовать статический ключ (режим --secret), но он не обеспечивает масштабируемость и безопасность, как полноценная PKI. Для большинства сценариев рекомендуется использовать сертификаты.
Что такое tls-auth и зачем он нужен?
tls-auth — это дополнительный статический ключ, который используется для аутентификации пакетов до начала TLS-рукопожатия. Он защищает сервер от DoS-атак и сканирования портов, так как злоумышленник не сможет даже начать обмен данными без этого ключа. Ключ должен быть одинаковым на сервере и клиенте, а направление задаётся параметром key-direction (0 на сервере, 1 на клиенте).