Настраивая сервер OpenVPN, я могу включить либо аутентификацию на основе сертификатов, либо аутентификацию по имени пользователя и паролю, используя openvpn-plugin-auth-pam
плагин, но не оба одновременно.
Я включаю аутентификацию по имени пользователя и паролю следующим образом:
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login
client-cert-not-required
username-as-common-name
Но как только я добавлю следующие строки, мои клиенты, настроенные для проверки подлинности сертификата, перестают работать со следующими сообщениями в журнале:
TLS Error: Auth Username/Password was not provided by peer
TLS Error: TLS handshake failed
Есть ли способ не требовать имя пользователя / пароль от клиентов, использующих аутентификацию по сертификату?
OpenVPN не поддерживает несколько методов одновременной аутентификации. Лучшее решение для этого, как упоминалось в комментариях, - запустить два экземпляра OpenVPN. Его сложнее запустить на одном компьютере, но оно определенно выполнимо.
Однако, похоже, есть некоторые обходные пути, которые могут подойти для вашей ситуации.
если вы знаете, для каких сертификатов требуется пароль, а для каких - нет, тогда ответ - да. используйте сценарий auth-user-pass-verify на стороне сервера, чтобы сначала проверить DN сертификата (если вы также установите --username-as-common-name, тогда вы автоматически узнаете общее имя сертификата внутри сценария проверки ). если это сертификат, для которого вы знаете, что был введен пароль, используйте pam для проверки имени пользователя / пароля. если вы знаете, что в сертификате не указан пароль, пусть скрипт вернет «0», чтобы разрешить доступ.
Обратите внимание, что нет способа автоматически определить, ввел ли пользователь пароль сертификата или нет - это вне рукопожатия openssl и, следовательно, не известно серверу OpenVPN.
Источник: https://openvpn.net/archive/openvpn-users/2007-12/msg00179.html
Вы также можете интегрировать ваши пары ключей, созданные OpenVPN, в локальный сервер LDAP и использовать вышеупомянутый сценарий для аутентификации по LDAP с помощью предоставленного сертификата или использовать предоставленные учетные данные при условии, что сертификат не был представлен.