Как удалить пароль из приватного ключа при помощи OpenSSL


Как вы наверное знаете, при создании ключей при помощи OpenSSL существует возможность защитить клиентский приватный ключ при помощи пароля, что предоставляет дополнительный уровень защиты. Такой подход что называется "из коробки присутствует" в пакете easy-rsa для генерации ключей и сертификатов OpenVPN.

Как удалить пароль из приватного файла при помощи OpenSSL

Если вы на этапе создания клиентского OpenVPN подключения зададите пароль (для чего скрипту build-key требуется передать опцию --pass):

# ./build-key --pass test
Generating a 2048 bit RSA private key
.......................................................................+++
....................................................................................................................................+++
writing new private key to 'test.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

То при простом подключении клиента OpenVPN у вас будет запрошен пароль который вы передали при генерации приватного ключа:

# openvpn --config ./on-user90.conf
Mon May  6 11:57:11 2019 WARNING: file 'cert_export_user90.key' is group or others accessible
Mon May  6 11:57:11 2019 WARNING: file 'bancon-user90-pwd.txt' is group or others accessible
Mon May  6 11:57:11 2019 OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep  5 2018
Mon May  6 11:57:11 2019 library versions: OpenSSL 1.1.0g  2 Nov 2017, LZO 2.08
Enter Private Key Password: ***
Mon May  6 11:57:14 2019 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Mon May  6 11:57:14 2019 Error: private key password verification failed
Mon May  6 11:57:14 2019 Exiting due to fatal error

При подключении OpenVPN в качестве демона становится непонятно где спрашивать пароль и в старых реализациях init-скриптов пароль запрашивался прямо в нулевой консоли. В современных Linux-дистрибутивах на базе SystemD подключение к VPN-сети будет заморожено и всем администраторам и пользователям системы будет отправлено широковещательное сообщение:

Broadcast message from root@admin-neon (Mon 2019-05-06 12:01:55 +07):

Password entry required for 'Enter Private Key Password:' (PID 32594).
Please enter password with the systemd-tty-ask-password-agent tool!

Если вы выполните соответствующую команду, то вы можете ввести пароль для OpenSSL-ключа, такой подход конечно значительно упрощает работу, но как говориться есть нюансы. Как вы наверное понимаете, если мы делаем простой роутер, то при каждой его перезагрузке придется логиниться и вводить пароль для разблокировки приватного ключа, что не всегда удобно, да и большинство простых роутеров с поддержкой OpenVPN такой тип ключей банально не смогут переварить.

Но не стоит расстраиваться раньше времени и если вам известен пароль от вашего приватного файла, то вы всегда сможете преобразовать приватный ключ защищенный паролем в незащищенный. Для этого вам понадобиться выполнить банально одну команду:

# openssl rsa -in ./cert_export_user90.key -out ./cert_export_user90_no_pass.key

Первым параметром мы указываем путь к ключу защищенному паролем, а второй параметр это результирующий незащищенный паролем ключ. В процессе работы у вас естественно запросят пароль и после расшифровки просто поменяйте в конфигурации OpenVPN путь к новому приватному ключу.