在Linux系统中,密钥是保障信息安全的核心工具,广泛应用于SSH远程登录、数据加密传输、数字签名等场景,相较于传统密码认证,密钥认证基于非对称加密算法,具有安全性高(私钥本地存储,公钥传输验证)、防暴力破解能力强(无需传输密码)及支持自动化操作(如免密登录)等优势,本文将详细介绍Linux系统中常见密钥的生成方法,涵盖SSH、GPG及SSL/TLS密钥,并说明生成后的配置、管理及常见问题处理。
SSH密钥对生成(最常用场景)
SSH(Secure Shell)密钥对是通过非对称加密算法生成的一对密钥:私钥(存储在本地,需严格保密)和公钥(上传至服务器,用于验证身份),Linux系统默认通过ssh-keygen
工具生成SSH密钥,支持多种加密算法,如RSA、ECDSA、Ed25519等,可根据安全需求选择。
基本生成步骤
打开终端,直接运行ssh-keygen
可生成默认密钥(通常为RSA 2048位),但更推荐通过参数自定义生成,以适配不同场景,核心命令格式为:
ssh-keygen -t 算法类型 -b 密钥长度 -C "注释信息" -f 密钥文件名 -N "密码短语"
参数说明:
-t
:指定密钥类型,可选rsa
(兼容性最好)、ecdsa
(性能与安全性均衡)、ed25519
(安全性最高,性能最优,需OpenSSH 6.5+支持)。-b
:指定密钥长度(单位:位),RSA建议≥2048位,ECDSA建议≥256位,Ed25519无需指定(固定256位)。-C
:添加注释,通常用于标识密钥用途(如邮箱地址,便于管理)。-f
:指定密钥文件保存路径(默认~/.ssh/id_rsa
,自定义时需包含完整路径,如~/.ssh/my_server_key
)。-N
:设置私钥密码短语(可选,但强烈推荐,防止私钥泄露被滥用;若留空则无密码)。
示例:生成Ed25519类型密钥,注释为“work@example.com”,保存在`~/.ssh/work_ed25519”,并设置密码短语“MySecurePass123”:
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/work_ed25519 -N "MySecurePass123"
执行后,~/.ssh/
目录下会生成两个文件:work_ed25519
(私钥,包含BEGIN和END标记)和work_ed25519.pub
(公钥,以ssh-ed25519
开头)。
不同SSH密钥类型对比
为方便选择,以下为常见SSH密钥类型的详细对比:
密钥类型 | 默认长度 | 安全性 | 性能 | 兼容性 | 适用场景 |
---|---|---|---|---|---|
RSA | 2048位 | 高(需≥2048位) | 中等 | 最好(支持所有SSH协议版本) | 传统服务器、兼容性要求高的环境 |
ECDSA | 256位 | 很高 | 较高 | 需OpenSSH 5.7+或现代客户端 | 现代Linux系统、对性能有要求的场景 |
Ed25519 | 256位 | 极高 | 最高 | 需OpenSSH 6.5+或现代客户端 | 新建系统、安全性优先的场景 |
生成后操作
(1)查看密钥内容
- 私钥:
cat ~/.ssh/work_ed25519
需严格保密,勿泄露)。 - 公钥:
cat ~/.ssh/work_ed25519.pub
需上传至服务器)。
(2)上传公钥至服务器
通过ssh-copy-id
命令自动上传(需先通过密码登录服务器一次):
ssh-copy-id -i ~/.ssh/work_ed25519.pub user@server_ip
或手动上传:将公钥内容追加至服务器~/.ssh/authorized_keys
文件:
ssh user@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh" cat ~/.ssh/work_ed25519.pub | ssh user@server_ip "tee -a ~/.ssh/authorized_keys" ssh user@server_ip "chmod 600 ~/.ssh/authorized_keys"
(3)测试免密登录
ssh -i ~/.ssh/work_ed25519 user@server_ip
首次登录需输入私钥密码短语(若生成时设置),之后可通过SSH代理(ssh-agent
)缓存密码,实现免密。
(4)设置文件权限
SSH服务对密钥文件权限敏感,需确保:
- 私钥文件权限:
chmod 600 ~/.ssh/work_ed25519
(仅所有者可读写)。 - 公钥文件权限:
chmod 644 ~/.ssh/work_ed25519.pub
(所有者可读写,其他用户可读)。 .ssh
目录权限:chmod 700 ~/.ssh
(仅所有者可访问)。
GPG密钥生成(用于加密与签名)
GPG(GNU Privacy Guard)密钥常用于加密邮件、签名文件、验证数据完整性等,生成方式与SSH密钥不同,需通过gpg
工具交互式完成。
基本步骤
(1)初始化GPG密钥环(若首次使用):
gpg --full-generate-key
(2)选择密钥类型:推荐“RSA and RSA”(默认,支持加密和签名),或“ECDSA”(更现代)。
(3)设置密钥长度:RSA建议≥4096位,ECDSA建议≥256位。
(4)设置密钥有效期:输入0表示永不过期,或指定时间(如1y、2m)。
(5)输入用户信息(姓名、邮箱、注释),需与身份对应。
(6)生成过程中需移动鼠标或键盘收集熵(确保随机性),完成后显示密钥ID。
导出与管理
- 查看密钥列表:
gpg --list-keys
- 导出公钥:
gpg --armor --export user_email > public_key.pub
- 导出私钥:
gpg --armor --export-secret-keys user_email > private_key.asc
SSL/TLS密钥生成(用于HTTPS服务)
若需搭建HTTPS网站,需生成SSL/TLS私钥和证书,通常通过OpenSSL工具完成。
生成私钥
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
生成RSA 2048位私钥server.key
,可替换为ecdsa
或ed25519
算法。
生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr
按提示输入国家、地区、组织等信息(部分字段可留空)。
自签名证书(测试用)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
生成有效期为365天的自签名证书server.crt
,生产环境需向CA机构申请证书。
密钥管理最佳实践
-
备份私钥:将私钥加密备份至安全介质(如加密U盘、云存储),避免丢失。
-
定期轮换:建议每6-12个月更换一次密钥,尤其是长期使用的SSH或SSL密钥。
-
权限控制:严格限制私钥文件权限,避免其他用户访问。
-
多密钥管理:通过
~/.ssh/config
文件配置不同服务器的密钥路径,Host server1 HostName 192.168.1.100 User root IdentityFile ~/.ssh/work_ed25519 Host server2 HostName 10.0.0.50 User admin IdentityFile ~/.ssh/home_rsa
相关问答FAQs
Q1: SSH密钥生成后无法登录服务器,提示“Permission denied (publickey,password)”怎么办?
A: 可能原因及解决方法:
- 公钥未上传至服务器:检查服务器
~/.ssh/authorized_keys
文件是否包含客户端公钥内容(可通过ssh user@server_ip "cat ~/.ssh/authorized_keys"
查看)。 - 文件权限错误:确保服务器端
.ssh
目录权限为700,authorized_keys
文件权限为600(chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
)。 - 私钥路径错误:登录时使用
-i
参数指定正确私钥路径(如ssh -i ~/.ssh/work_ed25519 user@server_ip
),或检查~/.ssh/config
配置是否正确。 - 服务器SSH服务未启用密钥认证:检查服务器
/etc/ssh/sshd_config
文件中PubkeyAuthentication yes
是否被注释,修改后重启SSH服务(sudo systemctl restart sshd
)。
Q2: 如何在Linux系统中管理多个SSH密钥,避免混淆?
A: 可通过以下方式管理多个SSH密钥:
- 自定义密钥文件名:生成密钥时使用
-f
参数指定唯一文件名(如~/.ssh/github_key
、~/.ssh/server_key
),避免覆盖默认的id_rsa
。 - 配置SSH客户端:在
~/.ssh/config
文件中为每个服务器或服务配置Host
别名,并指定对应的IdentityFile
(如上述“多密钥管理”示例),之后可通过ssh server1
直接登录,无需手动指定密钥。 - 使用SSH代理:通过
ssh-agent
添加多个私钥,并缓存密码,实现“一次输入,多处使用”:eval "$(ssh-agent -s)" # 启动SSH代理 ssh-add ~/.ssh/github_key # 添加私钥到代理(需输入密码短语) ssh-add ~/.ssh/server_key # 添加另一个私钥
之后登录时,SSH代理会自动匹配对应的私钥,无需重复输入密码。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32982.html