前提:
1. 秘钥的生成需要OpenSSL的支持, 需要自行进行安装
一. 新建用户
在root登陆状态中执行命令:
useradd -m ssh-user # centos
adduser ssh-user # ubuntu
passwd ssh-user // 设置ssh-user密码
切换到ssh-user 用户:
追加用户组:
sudo usermod -a -G sudo xxx
# 将xxx用户加入到sudo组中,具有超级管理员权限
二. 创建.ssh目录并生成秘钥对
创建.ssh目录:
mkdir /home/ssh-user/.ssh
生成秘钥对:
ssh-keygen -t rsa -b 4096
参数说明:
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile] 读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥
ssh-keygen -e [-m key_format] [-f input_keyfile] 读取openssh的私钥或者公钥文件
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
-C 添加注释
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile] 显示公钥文件的指纹数据
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-f known_hosts_file] [-l]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-f input_keyfile] [-g]
ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
[-j start_line] [-K checkpt] [-W generator]
ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]
[-O option] [-V validity_interval] [-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
file ...
ssh-keygen -Q -f krl_file file ...
生成成功之后 ,会在该目录下有两个文件: id_rsa(私钥), id_rsa.pub(公钥)
目录下新建文件authorized_keys:
将公钥追加到authorized.key文件中:
cat id_rsa.pub >> authorized_keys
设置目录权限:
chmod 700 /home/ssh-user/.ssh
设置文件权限:
chmod 600 /home/ssh-user/.ssh/authorized_keys
将私钥下发到本地或需要进行登陆的远端服务器上:
可以使用FTP链接下载或者scp等命令传输过去即可.
scp -P 8932 -i user1/.ssh/id_rsa user2/.ssh/authorized_keys user1@172.160.114.147:/home/user2
三. 远程登录(秘钥对)
远程登录命令:
ssh -i ./id_rsa ssh-user@47.99.180.120
参数说明:
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file]
[-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
四. 禁止密码登陆
编辑文件/etc/ssh/sshd_config
AuthorizedKeysFile .ssh/authorized_keys //公钥公钥认证文件
PubkeyAuthentication yes //可以使用公钥登录
PasswordAuthentication no //不允许使用密码登录
五. 重启sshd服务
1) centos
service sshd restart
systemctl restart sshd.service
2)ubuntu
# 启动
/etc/init.d/ssh start
# 重启
/etc/init.d/ssh restart
其他:
l 使用配置登录别名,进行登陆(在需要进行登陆的服务器上)
vim ~/.ssh/config
Host ssh-user # 别名
HostName aslong.xin # 域名或ip
Port 22 # 端口
User dev # 登录名
IdentityFile ~/.ssh/id_rsa # 本机私钥存放位置
命令:
2. 使用ssh-copy-id实现免密登陆
1) 在本地机器上使用ssh-keygen产生公钥私钥对
2)用ssh-copy-id将公钥复制到远程机器中
$ ssh-copy-id -i .ssh/id_rsa.pub 用户名字@192.168.x.xxx
注意: ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_keys 文件中
3)登录到远程机器不用输入密码
常见问题
1. Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open
使用终端进行连接的时候,报错,这是由于权限过大,需要限制其私钥的访问权限
2. 登录失败WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
![ssh之秘钥登陆_pem](https://s2.51cto.com/images/blog/202205/30101928_629429b080c6347817.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
解决方案:
修改~/.ssh/known_hosts 这该需要登录的ip的相关信息删除掉即可
3.设置密钥登录成功之后, 但是登录的时候还是会提示输入密码,试了好久, 最终找到了问题
我是使用的root权限,也是给root用户添加的密钥, 但是根目录下/root 的所属用户组却是www,于是修改
chown root.root root
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
即可正常使用, 若遇到此问题不知如何下手的时候,可以查看日志文件
tail /var/log/secure -n 20
发现问题的所在:Authentication refused: bad ownership or modes for file
从字面上可以看出是目录的属主和权限配置不当,查找资料得知:SSH不希望home目录和~/.ssh目录对组有写权限