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