SSH 证书认证是一种基于公钥基础设施(PKI)的认证方式,相比传统的密钥认证具有更好的可管理性和安全性。
SSH 证书认证原理
SSH 证书认证使用证书颁发机构(CA)对用户密钥进行签名,生成包含身份信息和有效期的证书。
架构组件
- CA 密钥对:用于签发用户证书
- 用户密钥对:用户的公钥/私钥
- 用户证书:由 CA 签名的用户公钥
- 服务器配置:信任 CA 的公钥
证书类型
1. 用户证书(User Certificate)
用于认证用户身份。
bash# 生成 CA 密钥对 ssh-keygen -t ed25519 -f ~/.ssh/ca_user_key # 签发用户证书 ssh-keygen -s ~/.ssh/ca_user_key \ -I "user_john" \ -n "john" \ -V +52w \ -z 1 \ ~/.ssh/user_key.pub # 证书参数说明 # -I: 身份标识 # -n: 用户名(可多个,逗号分隔) # -V: 有效期(+52w 表示52周) # -z: 序列号
2. 主机证书(Host Certificate)
用于认证服务器身份。
bash# 生成 CA 密钥对 ssh-keygen -t ed25519 -f ~/.ssh/ca_host_key # 签发主机证书 ssh-keygen -s ~/.ssh/ca_host_key \ -I "host_server1" \ -h \ -n "server1.example.com,192.168.1.100" \ -V +52w \ -z 1 \ /etc/ssh/ssh_host_ed25519_key.pub # 证书参数说明 # -h: 主机证书标志 # -n: 主机名或 IP(可多个,逗号分隔)
服务器端配置
1. 配置信任 CA
bash# /etc/ssh/sshd_config # 信任用户 CA TrustedUserCAKeys /etc/ssh/ca_user_key.pub # 信任主机 CA(可选,用于主机证书验证) TrustedUserCAKeys /etc/ssh/ca_host_key.pub # 启用证书认证 PubkeyAuthentication yes
2. 部署主机证书
bash# 将主机证书复制到服务器 scp ssh_host_ed25519_key-cert.pub root@server1:/etc/ssh/ # 设置权限 chmod 644 /etc/ssh/ssh_host_ed25519_key-cert.pub # 重启 SSH 服务 systemctl restart sshd
客户端配置
1. 使用证书连接
bash# 直接使用证书连接(无需额外配置) ssh -i ~/.ssh/user_key user@server1 # 或在配置文件中指定 Host server1 HostName server1.example.com User user IdentityFile ~/.ssh/user_key CertificateFile ~/.ssh/user_key-cert.pub
2. 验证主机证书
bash# 配置信任主机 CA # ~/.ssh/known_hosts @cert-authority *.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
证书管理
1. 证书撤销
bash# 创建撤销列表 # /etc/ssh/revoked_keys # 格式:serial:reason 1:compromised 2:terminated # 配置撤销列表 # /etc/ssh/sshd_config RevokedKeys /etc/ssh/revoked_keys
2. 证书续期
bash# 重新签发证书 ssh-keygen -s ~/.ssh/ca_user_key \ -I "user_john" \ -n "john" \ -V +52w \ -z 2 \ ~/.ssh/user_key.pub
3. 批量签发
bash# 脚本批量签发用户证书 #!/bin/bash CA_KEY=~/.ssh/ca_user_key VALIDITY="+52w" for user in alice bob charlie; do ssh-keygen -s $CA_KEY \ -I "user_$user" \ -n "$user" \ -V $VALIDITY \ ~/.ssh/${user}_key.pub done
证书优势
1. 集中管理
- 统一的 CA 管理所有用户
- 无需在每个服务器上添加公钥
- 便于撤销和更新证书
2. 安全性
- 证书包含有效期,自动过期
- 可限制证书使用范围
- 支持撤销机制
3. 可扩展性
- 支持大规模部署
- 便于自动化管理
- 减少运维成本
高级特性
1. 证书扩展
bash# 限制证书用途 ssh-keygen -s ~/.ssh/ca_user_key \ -I "user_deploy" \ -n "deploy" \ -V +4w \ -O clear \ -O no-port-forwarding \ -O no-X11-forwarding \ -O force-command=/usr/local/bin/deploy.sh \ ~/.ssh/deploy_key.pub # 扩展选项 # -O clear: 清除所有默认权限 # -O no-port-forwarding: 禁用端口转发 # -O no-X11-forwarding: 禁用 X11 转发 # -O force-command: 限制只能执行特定命令 # -O source-address: 限制来源 IP
2. 证书模板
bash# 创建不同角色的证书模板 # 管理员证书 ssh-keygen -s $CA_KEY -I "admin" -n "admin" -V +52w -O permit-pty admin_key.pub # 部署证书 ssh-keygen -s $CA_KEY -I "deploy" -n "deploy" -V +4w -O no-port-forwarding deploy_key.pub # 只读证书 ssh-keygen -s $CA_KEY -I "readonly" -n "readonly" -V +52w -O no-pty readonly_key.pub
3. 证书审计
bash# 查看证书信息 ssh-keygen -L -f ~/.ssh/user_key-cert.pub # 输出示例 # Type: ssh-ed25519-cert-v01@openssh.com user certificate # Public key: ED25519-CERT SHA256:... # Signing CA: ED25519 SHA256:... # Key ID: "user_john" # Serial: 1 # Valid: from 2024-01-01T00:00:00 to 2025-01-01T00:00:00 # Principals: john
实际应用场景
场景1:企业级用户管理
bash# 集中管理企业用户 # 1. 创建企业 CA ssh-keygen -t ed25519 -f /etc/ssh/enterprise_ca # 2. 为员工签发证书 ssh-keygen -s /etc/ssh/enterprise_ca \ -I "emp_001" \ -n "john.doe" \ -V +52w \ ~/.ssh/john_key.pub # 3. 员工离职时撤销证书 echo "1:terminated" >> /etc/ssh/revoked_keys
场景2:自动化部署
bash# 为 CI/CD 系统签发短期证书 ssh-keygen -s $CA_KEY \ -I "ci_cd" \ -n "cicd" \ -V +1d \ -O force-command=/usr/local/bin/deploy.sh \ ~/.ssh/cicd_key.pub
场景3:多环境管理
bash# 为不同环境签发不同证书 # 开发环境 ssh-keygen -s $CA_KEY -I "dev" -n "dev" -V +4w dev_key.pub # 测试环境 ssh-keygen -s $CA_KEY -I "test" -n "test" -V +4w test_key.pub # 生产环境 ssh-keygen -s $CA_KEY -I "prod" -n "prod" -V +2w prod_key.pub
最佳实践
- 保护 CA 私钥:使用硬件安全模块(HSM)或离线存储
- 定期轮换:定期更换 CA 密钥
- 限制权限:为不同角色签发不同权限的证书
- 监控使用:记录证书使用情况
- 自动化管理:使用自动化工具管理证书生命周期
- 备份 CA:安全备份 CA 密钥
- 测试流程:在测试环境验证证书配置
- 文档记录:记录证书签发和撤销流程