我有一个Perl编写的服务器,客户端连接到执行一些pipe理任务。 没有详细说明,我想实现两件事情:
最好的解决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:
示例.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。 如:
ssh server_ip that_command 您可以使用SSH_ORIGINAL_COMMAND在您的服务器中selectpipe理任务。 客户端代码可以用这个任务名称作为参数产生ssh(或者使用Net :: SSH :: Perl),然后向/从服务器发送/接收数据。