У меня есть сервер, написанный на Perl, к которому клиенты подключаются для выполнения некоторых задач управления. Не вдаваясь в подробности, хотелось бы добиться двух вещей:
Лучшим решением было бы объединить эти два требования в одно и получить механизм, который работает точно так же, как соединение / аутентификация SSH. Это возможно?
Спасибо.
Вы хотите использовать SSH-туннель. Это зашифрует ваше общение и аутентифицируется с помощью ключей SSH.
Если вы хотите, чтобы клиент был написан на perl, используйте что-то вроде модуля Net :: SSH :: Perl: http://search.cpan.org/~turnstep/Net-SSH-Perl-1.34/lib/Net/SSH/Perl.pm
Не зная больше о вашей настройке, я действительно не могу помочь вам полностью реализовать туннель SSH.
Некоторое время назад я написал подобное серверное / клиентское приложение. Основной дизайн:
Образец .ssh/authorized_keys
файл:
no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding,from="10.0.0.1",command="/usr/local/bin/fsdumps-receiver" ssh-rsa AAAA.... key_comment
Обратите внимание на параметр from = "<ip>" - доступ в этом примере ограничен только одним IP.
Код сервера имеет доступ к некоторым полезным переменным среды. Такие как:
ssh server_ip that_command
Вы можете использовать SSH_ORIGINAL_COMMAND для выбора задачи управления на вашем сервере. Клиентский код может порождать ssh (или использовать Net :: SSH :: Perl) с этим именем задачи в качестве аргумента, а затем отправлять / получать данные на / с сервера.
Помимо простого туннелирования соединения через SSH, поскольку Крис Тинг указывает:
Вы можете реализовать подсистему SSH, которая позволит вашей программе легко интегрироваться с SSH. Для пользователя это будет выглядеть так, как будто ваша программа просто использует ключи SSH и шифрование (что на самом деле связано с фактическим использованием SSH). Этот процесс не так хорошо документирован, хотя клиент и сервер OpenSSH SFTP в некоторой степени самодокументируются.
Это потребует значительного количества перезаписи, в зависимости от того, как подключаются клиенты и синтаксис протокола. Очевидное преимущество состоит в том, что тогда он будет легко интегрирован в конфигурацию SSH пользователя.
SSH использует ключи, тогда как SSL обычно использует сертификаты X.509 (кстати, SSH не основан на SSL).
Сертификат (открытый ключ) - это больше, чем просто открытый ключ: это связь между открытым ключом, идентификатором (например, Subject DN) и другими атрибутами, причем все это подписывается (эмитентом сертификатов X.509).
Например, при использовании RSA можно извлечь материал открытого ключа (модуль и открытую экспоненту) и превратить его в сертификат. Чего не хватает в этой модели, так это того, что ключи SSH не «подписаны» и не «выпущены», как сертификаты X.509. Вам будет не хватать аспекта PKI, который часто используется в SSL в вашей модели. Легкий способ обойти это - сделать из него самозаверяющий сертификат. Затем вам придется явно импортировать его в свой клиент, чтобы сделать его доверенным, или импортировать его при первом подключении к нему (что, в конце концов, очень похоже на то, что происходит при первом подключении к серверу SSH).
Форматы ключей RSA для SSH и X.509 различаются, поэтому вам нужно будет написать код для чтения модуля и показателей из ключей SSH и создания сертификата X.509 и закрытого ключа в формате, пригодном для стеков SSL.
это вопрос по StackOverflow должен представлять интерес (хотя это делается наоборот).