Perl服务器中基于SSH密钥的身份validation

我有一个Perl编写的服务器,客户端连接到执行一些pipe理任务。 没有详细说明,我想实现两件事情:

  1. encryption服务器和客户端之间的连接通道 – 可以使用IO :: Socket :: SSL来完成。
  2. 使用SSH密钥validation客户端 – 我不知道如何去做。

最好的解决scheme是将这两个要求合并为一个,并具有完全像SSH连接/身份validation一样的机制。 那可能吗?

谢谢。

你想使用SSH隧道。 这将encryption您的通信并使用SSH密钥进行身份validation。

如果你想用perl写客户端,那么使用类似Net :: SSH :: Perl模块: http : //search.cpan.org/~turnstep/Net-SSH-Perl-1.34/lib/Net/ SSH / Perl.pm

不知道更多关于你的设置,我真的不能帮你完全实现SSH隧道。

SSH使用密钥,而SSL倾向于使用X.509证书(顺便说一下,SSH不基于SSL)。

(公钥)证书不仅仅是一个公钥,它是公钥,标识符(例如主题DN)和其他属性之间的关联,整个签名(颁发者为X.509证书)。

例如,使用RSA时,可以提取公钥资料(模数和公开指数)并将其转换为证书。 这种模式缺less的是SSH密钥就是这样,它们不像X.509证书那样是“签名”或“发布”的。 您将会忽略模型中常用的SSL中的PKI方面。 一个简单的方法来解决这个问题,就是把一个自签名的证书写出来。 然后你必须在你的客户端中明确地导入它,以使其可信,或者在你第一次连接到它时导入它(这毕竟与第一次连接到SSH服务器时非常相似)。

SSH和X.509的RSA密钥格式是不同的,所以您需要编写一些代码来读取SSH密钥的模数和指数,并以SSL堆栈可用的格式生成X.509证书和私钥。

StackOverflow上的这个问题应该是有趣的(尽pipe它是相反的)。

Chris Ting指出 :除了简单地通过SSH隧道连接之外,

您可以实现一个SSH子系统,这将允许您的程序与SSH无缝集成。 对用户来说,你的程序看起来就像使用SSH密钥和encryption(实际上是使用SSH)。 虽然OpenSSH SFTP客户端和服务器有些自我logging,但这个过程并不完全logging在案。

这将需要相当数量的重写,这取决于客户端如何连接和协议的语法。 显而易见的好处是它会无缝地滑入用户的SSHconfiguration。

我刚才写了类似的服务器/客户端应用程序。 基本devise:

  • 服务器不联网,这是简单的脚本通过标准input/标准输出stream(像守护进程执行的inetd);
  • 所有的networking和身份validation的东西都由ssh / sshd完成,客户端使用ssh和基于密钥的授权,服务器有一个authorized_keys文件,其中包含command =“”选项 – 该密钥总是执行我的服务器,不能用于访问shell或其他程序;

示例.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。

服务器代码可以访问一些有用的环境variables。 如:

  • $ ENV {'SSH_ORIGINAL_COMMAND'} – “命令”(不是真的)作为ssh server_ip that_command
  • $ ENV {'SSH_CLIENT'} – 客户端IP

您可以使用SSH_ORIGINAL_COMMAND在您的服务器中selectpipe理任务。 客户端代码可以用这个任务名称作为参数产生ssh(或者使用Net :: SSH :: Perl),然后向/从服务器发送/接收数据。