简介
SSH(Secure Shell Protocol),相比于 telnet, ftp等而言是一种安全加密的协议,后者通过明文传输数据,具有安全隐患。
SSH同时支持多种加密算法,目前常用的是RSA,具体加密算法由C-S双方协商决定。
SSH密钥连接建立过程
加密的核心是非对称加密。首先明确一个概念,在非对称加密过程中,原文由公钥加密,再由私钥解密;而签名(signiture),由私钥加密,公钥解密。
加密的目的是保护数据安全,因为只有私钥能够做到解密;而签名的目的是保证数据发送者是私钥拥有者,除了他没有人能做出能用对应公钥解密的签名。
建立过程
网络上众说纷纭,最后我还是去查了RFC 4252,现在做个总结。
客户端发起连接请求,主要说的是使用publickey
的方式建立连接,别的还有password
这种。另一个是给出了使用的公钥加密方式。
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
服务器检查是否拥有公钥后返回,表示同意公钥加密方式,否则就要返回错误,没有公钥也需要拒绝。
byte SSH_MSG_USERAUTH_PK_OK
string public key algorithm name from the request
string public key blob from the request
客户端发送,原文附上签名,
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
签名的内容为,将以下内容使用私钥加密
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_rsa
与id_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
中
Host example # 关键词
HostName ip # 主机地址 ip或者主机名
User root # 用户名
# IdentityFile ~/.ssh/id_rsa # 认证文件 私钥地址
# Port 22 # 指定端口
欢迎来我的博客做客
zhyib.gitee.io
zhyib.github.io