配置RSA key登录ssh

ssh简单的登录就是用户名+口令的认证方式,不过用过github或者国内的gitcafe的同学大概都注意到了,它们习惯使用用户名+RSA key的认证方式。我们可以用这种认证方式来制作不需要输入密码的ssh连接。

 

大致原理

大致的原理是ssh客户端拥有自己的private key,同时把对应的public key经过线下协商申请交给sshd服务器端(所以服务器端一般有很多通过线下认证而接收的public key,用来验证不同的客户端)。当ssh尝试去连接已经接收过自己public key的sshd创建一个会话时,sshd会首先发送一个challenge给ssh,ssh用自己的private key加密发送回来,然后sshd用对应的public key解密,如果跟自己之前发送的一致,说明这个ssh就是当初给自己public key的ssh客户端,所以认证通过。

 

OpenSSH流程

具体到了linux这里OpenSSH的流程,需要细节一些。

先假定机器A上ssh进程是client用户起的,而sshd运行的机器B上,有个用户remote。首先A上/home/client/.ssh中会有id_rsa和id_rsa.pub(一对私钥和公钥),通过线下协商,把id_rsa.pub这个公钥给了机器B,添加到B上/home/remote/.ssh/authorized_keys中。这个协商的意思就是,允许client用户的ssh能够成功创建机器B上的remote用户的ssh session。

现在A上client用户启用ssh进程去尝试创建B上remote用户的ssh session,也就是ssh remote@B这样的调用。B上的sshd发现有人想连接remote用户,就发送一个challenge过去,A上的ssh用/home/client/.ssh/id_rsa加密,然后发送回B。B的sshd就用/home/remote/.ssh/authorized_keys中的公钥解密(细节不清楚,可能是挨个试,可能是有特定的标识能找到对应的公钥)。解密成功,所以认为对方是当初的A上的client用户,然后就创建了remote用户的shell(如果是非shell的ssh应用,例如ssh git,就会创建git连接)。

 

生成密钥对

如果是windows上使用putty想能连接机器B上的remote用户,那么就用putty-gen这个工具来生成私钥和公钥,然后把公钥协商交给机器B,私钥保存成ppk类型的文件,在Conneciton→SSH→Auth中配置好这个私钥文件的路径,就可以使用了。

如果是linux上用户client想给自己的ssh生成私钥公钥对,则可以使用ssh-keygen工具实现。

此外理论上私钥是不能随便给别人看的,所以这两个工具在生成密钥对的时候,都可以可选地设置一个密码来保护私钥。如果用了这种私钥来创建ssh session,则需要客户端输入密码解密私钥后,才能用私钥给challenge解密。

 

调试建议

remote端用root权限自己启动一个打印debug信息的sshd,例如/usr/bin/sshd -p6789 -d;local端用ssh user@remote -p6789 -v来获得详细信息。

常见的错误是,$HOME/.ssh目录本身及其下的大部分文件,都不能给group和other任何权限,否则ssh认为不安全直接跳过这种验证方式。

 

你可能感兴趣的:(ssh)