AkiraZ's blog

愿键盘的余温传递到更遥远的将来

中文 / English
0%

SSH密钥连接与无密码访问配置

简介

SSH(Secure Shell Protocol),相比于 telnet, ftp等而言是一种安全加密的协议,后者通过明文传输数据,具有安全隐患。

SSH同时支持多种加密算法,目前常用的是RSA,具体加密算法由C-S双方协商决定。

SSH密钥连接建立过程

加密的核心是非对称加密。首先明确一个概念,在非对称加密过程中,原文由公钥加密,再由私钥解密;而签名(signiture),由私钥加密,公钥解密。

加密的目的是保护数据安全,因为只有私钥能够做到解密;而签名的目的是保证数据发送者是私钥拥有者,除了他没有人能做出能用对应公钥解密的签名。

建立过程

网络上众说纷纭,最后我还是去查了RFC 4252,现在做个总结。

客户端发起连接请求,主要说的是使用publickey的方式建立连接,别的还有password这种。另一个是给出了使用的公钥加密方式。

1
2
3
4
5
6
7
byte      SSH_MSG_USERAUTH_REQUEST
string user name in ISO-10646 UTF-8 encoding [RFC3629]
string service name in US-ASCII
string "publickey"
boolean FALSE
string public key algorithm name
string public key blob

服务器检查是否拥有公钥后返回,表示同意公钥加密方式,否则就要返回错误,没有公钥也需要拒绝。

1
2
3
byte      SSH_MSG_USERAUTH_PK_OK
string public key algorithm name from the request
string public key blob from the request

客户端发送,原文附上签名,

1
2
3
4
5
6
7
8
byte      SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication
string signature

签名的内容为,将以下内容使用私钥加密

1
2
3
4
5
6
7
8
string    session identifier
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication

服务端收到后,将签名使用公钥解密,并与原文对比,确认消息的发送者为私钥的拥有者,返回SSH_MSG_USERAUTH_SUCCESS ,连接建立

配置公私钥

以GitHub与Linux服务器为例。

  • 首先在客户端ssh-keygen

  • 会要求输入文件名、密码等信息,文件名默认为id_rsa

  • 最后会在~/.ssh/中生成id_rsaid_rsa.pub,前者为私钥后者公钥

  • 登录服务端,存放公钥

    • Github -> Settings -> SSH and GPG keys

    • New SSH key,输入名称和公钥内容

    • 使用ssh -T git@github.com测试连通性【必须】

    • 登录Linux服务器

    • 进入~/.ssh/

    • authorized_keys中写入公钥,占一行,多个公钥各占一行

    • 使用ssh USER_NAME@IP连接

多密钥环境配置

~/.ssh/config

1
2
3
4
5
Host example                       # 关键词
HostName ip # 主机地址 ip或者主机名
User root # 用户名
# IdentityFile ~/.ssh/id_rsa # 认证文件 私钥地址
# Port 22 # 指定端口