SSH 密钥免密登录备忘

首先明确一点,一对密钥分为私钥和公钥,私钥是你自己留着的,公钥是放在远程主机的。密钥对通过ssh-keygen创建的,在哪台主机创建的无所谓,你可以将公钥放到任意你想登陆的服务器上,也可以把私钥放到任意需要登陆的客户机上。

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

现在使用ssh-keygen生成一对密钥

ssh-keygen -C '注释'
# 得到的私钥格式如下
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
此处略去很多行
e3xx+VmdxnJvEAAAAbcm9vdEB2bS0yMWItMHF1MWsubm92YWxvY2Fs
-----END OPENSSH PRIVATE KEY-----

# 得到的公钥格式如下
ssh-rsa AAAAB3NzaC1 此处略去很多字 l2cdGl5iArE= '注释'

使用ssh-copy-id将公钥发送到指定的主机上

ssh-copy-id [-i '公钥文件'] user@host [-p PORT]

在目标主机的~/.ssh/authorized_keys中会添加刚刚发送来的公钥。 这样就可以实现免密登陆了。

ssh-agent

Linux 使用ssh-agent来管理密钥,使用ssh-keygen生成之后会自动添加到ssh-agent,也可以通过ssh-add 私钥来添加,通过以下命令操作

# 查看所有公钥
ssh-add -L
# 查看所有密钥
ssh-add -l
# 添加私钥
ssh-add id_rsa
# 删除指定的密钥, 删除时如果私钥文件还存在,会拒绝删除,可以用rm先将密钥文件删除。
ssh-add -d
# 删除所有密钥
ssh-add -D

OPENSSH 私钥 和 RSA(PEM)私钥区别

有些程序点名需要-----BEGIN RSA PRIVATE KEY-----

现在使用命令 ssh-keygen -t rsa 生成ssh,高版本OpenSSH默认是以新的OPENSSH格式生成,id_rsa的第一行变成了BEGIN OPENSSH PRIVATE KEY,而不再是BEGIN RSA PRIVATE KEY

生成旧PEM(RSA)格式密钥命令:

ssh-keygen -m PEM -t rsa -b 4096 

SSH服务重启

## ubuntu
service sshd restart
## centos
systemctl restart sshd.service

常见报错

  1. Could not open a connection to your authentication agent.
ssh-agent bash
  1. WARNING: UNPROTECTED PRIVATE KEY FILE!
chmod 700 PATH_TO_YOUR_KEY

一、简单对比

ssh-keygen -t rsa 生成ssh,高版本OpenSSH默认OPENSSH格式,两种格式头部不同。

OPENSSH加密格式
-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
RSA(PEM)加密格式
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxx
-----END RSA PRIVATE KEY-----

二、如何生成RSA(PEM)格式私钥

ssh-keygen指定格式,使用 -m PEM 参数:

ssh-keygen -m PEM -t rsa -b 4096 -f /home/xxx/.ssh/demo

执行结果示例:

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/xxx/.ssh/demo
Your public key has been saved in /home/xxx/.ssh/demo.pub
The key fingerprint is:
SHA256:xxxx xxx@xxx
The key's randomart image is:
+---[RSA 4096]----+
|       . + d =   |
|          ..+ .  |
+----[SHA256]-----+

查看私钥文件格式:

cat ~/.ssh/demo
-----BEGIN RSA PRIVATE KEY-----
DXGGHTRFFDFAsDmHEcSRdAIj0kjdgu65sggsx4dPWaM0grptdn
xxx
xxx
xxx

ssh-keygen 参数说明

  • -m: 参数指定密钥的格式,PEM(也就是RSA旧格式)
  • -b:指定密钥长度;
  • -e:读取openssh的私钥或者公钥文件;
  • -C:添加注释;
  • -f:指定用来保存密钥的文件名;
  • -i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
  • -l:显示公钥文件的指纹数据;
  • -N:提供一个新密语;
  • -P:提供(旧)密语;
  • -q:静默模式;
  • -t:指定要创建的密钥类型

Windows 使用OPENSSH格式密钥兼容配置

如果配置了BEGIN OPENSSH PRIVATE KEY密钥,连接时报算法不支持,在.ssh目录新增config文件配置。

# c:/Users/用户名/.ssh/config
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa