SSH协议与应用
目录
SSH协议简介
公钥与私钥的作用
签名与加密
签名
使用场景一
加密
Git 服务免密登录配置
SSH协议简介
SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络中安全地远程登录及传输文件。它通过加密和认证机制,确保通信内容不被窃听、篡改,常见于服务器管理、代码版本控制等场景;
公钥与私钥的作用
当用户需要远程访问某个具体服务时,若密码需通过网络传输,若加密强度不足,可能被中间人攻击窃取,所以引入了公钥 / 私钥体系(非对称加密);
公钥 / 私钥体系特点:
- 无需传输私钥:认证过程中,客户端仅用私钥对随机数据签名,服务端用公钥验证签名,私钥从未在网络中出现,保障数据传输的安全性;
- 一次配置,永久免密:适用于服务器管理、代码仓库拉取等需要频繁认证的场景;
- 私钥可挂失:若私钥泄露,只需删除服务端对应的公钥,无需修改所有相关系统的密码;
- 私钥签名的唯一性确保身份不可伪造,公钥验签的公开性确保任何人可验证;
SSH 依赖非对称加密技术,通过一对密钥(公钥和私钥)实现安全认证,两者的关系如下:
签名与加密
签名
签名是一种用于验证数据完整性和发送者身份的技术,基于哈希加密算法实现,其核心作用如下:
- 证明数据由合法发送者生成(防冒充);
- 确保数据在传输过程中未被篡改(防篡改);
使用场景一
当用户在ubuntu系统生成私钥
id_rsa
和公钥id_rsa.pub
,且将公钥告知 Git 服务器,当用户采用Git提交原始数据时,详细过程如下所述;签名生成过程:
- Git 会自动对ubuntu系统所提交的内容生成一个哈希值(如
a1b2c3d4
);- 然后用 私钥对哈希值进行加密,得到一个签名(例如
encrypted_hash
)- 当用户提交代码时,Git 会将原始数据和签名一同存储或传输;
签名验证过程:
- Git 服务器首先采用公钥解密签名,从签名中提取出ubuntu系统提交时加密的哈希值
(
a1b2c3d4)
;- 然后Git 服务器直接对原始数据应用相同的哈希函数,重新生成哈希值(
b2假设为a1b2c3d4)
;- 对比两个哈希值,若一致,则证明数据未被篡改(哈希值相同),数据确实由持有私钥的用户生成(只有持有私钥的用户能加密出可被公钥解密的签名);
加密
加密是将明文数据通过密钥转换为密文的过程,确保只有授权方能用对应密钥将密文还原为明文,其核心目标是确保数据在传输或存储过程中不被未授权者读取或篡改。因此SSH协议中只有持有对应私钥的人能解密,确保数据传输安全;
加密流程如下:
- 发送方获取接收方的 公钥;
- 发送方用 公钥 加密数据,得到密文;
- 接收方用自己的 私钥 解密密文,还原原始数据
Git 服务免密登录配置
步骤一:生成 SSH 密钥对并且查看公钥
ubuntu虚拟机打开终端,输入以下命令生成密钥(无需输入密码可直接按回车跳过)
# ssh-keygen: 生成SSH密钥对的工具
# -t rsa: 指定密钥的类型为RSA,RSA是非对称加密算法
# -b 4096: 设置密钥的位数为4096
# -C "email@example.com" : 为密钥添加注释,一般使用邮箱地址作为注释内容ssh-keygen -t rsa -b 4096 -C "email@example.com"
#ubuntu系统查看密钥
cat ~/.ssh/id_rsa.pub
步骤二:将公钥添加到 Git 服务端
登录 Gitee, 点击设置, 下拉点击安全设置中SSH公钥;
自定义标题名称,粘贴公钥内容,点击确定,输入当前账号的密码即可;
步骤三:配置ubuntu系统的 Git 客户端
基本配置
# 设置git客户端的用户名称,自由设置即可
git config --global user.name "shuju"# 设置git客户端的邮箱,本地记录提交作者的标识,可随意设置,建议使用真实邮箱
git config --global user.email "13361241467@163.com"# 查看全局配置
git config --global --list
验证连接
首次连接会提示确认指纹,输入 yes
后回车即可;
# 连接Gitee服务器,使用固定用户名为git(Gitee强制要求)ssh -T git@gitee.com
修改仓库地址为 SSH 协议
打开Gitee的某个仓库页面,复制克隆远程仓库的指令,ubuntu本地客户端执行即可;