1. 安装OpenSSL并生成密钥对
在要配置免密登录的客户端和服务器上都需要安装OpenSSL工具。如果系统没有安装OpenSSL,可以使用以下命令进行安装:
sudo apt update
sudo apt install openssl
接下来,在客户端上生成密钥对。打开终端并执行以下命令:
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -in client.csr -signkey client.key -out client.crt
这几条命令的作用分别是:
1. 生成2048位的RSA私钥。
2. 生成证书签名请求(CSR),需要填写一些信息,如国家、省份、城市、组织名称等。
3. 使用私钥生成自签名的证书,有效期设置为365天。
生成的文件有client.key(私钥)、client.csr(证书签名请求)和client.crt(证书)。将client.crt文件复制到服务器的authorized_keys目录下。
2. 配置SSH使用证书登录
在服务器上,编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config
找到以下配置项并修改:
1. 将`PubkeyAuthentication`设置为`yes`,允许公钥认证。
2. 将`AuthorizedKeysFile`设置为`.ssh/authorized_keys`,指定存放公钥的文件。
3. 将`PasswordAuthentication`设置为`no`,禁止密码认证。
修改后的配置如下:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
保存并退出编辑器,然后重启SSH服务:
sudo systemctl restart sshd
3. 在客户端配置SSH使用证书
在客户端上,编辑SSH配置文件:
nano ~/.ssh/config
添加以下配置,指定使用证书登录服务器:
Host server
HostName your_server_ip
User your_username
IdentityFile /path/to/client.key
CertificateFile /path/to/client.crt
IdentitiesOnly yes
其中:
1. `Host`是自定义的别名,可以是任何名称。
2. `HostName`是服务器的IP地址或域名。
3. `User`是登录服务器的用户名。
4. `IdentityFile`是客户端的私钥文件路径。
5. `CertificateFile`是客户端的证书文件路径。
6. `IdentitiesOnly`设置为`yes`,表示只使用指定的私钥。
保存并退出编辑器,然后测试连接:
ssh -v server
如果配置正确,应该可以直接登录服务器,无需输入密码。
4. 常见问题及解决方案
在配置过程中,可能会遇到一些问题,以下是常见的几个问题及解决方案:
4.1 连接失败提示“Permission denied (publickey)”
原因:可能是私钥文件权限设置错误或SSH服务配置不正确。
解决方案:
1. 检查私钥文件权限,确保只有用户本人可以读写:
chmod 600 /path/to/client.key
2. 确认SSH配置文件中的`PubkeyAuthentication`和`AuthorizedKeysFile`设置正确。
4.2 无法使用证书登录
原因:可能是证书文件不完整或格式错误。
解决方案:
1. 确认证书文件(.crt)和私钥文件(.key)都在指定路径下。
2. 可以尝试重新生成证书和私钥。
4.3 SSH版本问题
原因:某些旧的SSH版本可能不支持证书登录。
解决方案:
1. 更新SSH服务到最新版本:
sudo apt update
sudo apt install openssh-server
5. 如何验证证书登录是否成功?
验证证书登录是否成功非常简单。在客户端执行以下命令:
ssh -v server
如果登录成功,终端应该会直接进入服务器,无需输入密码。如果出现以下提示,表示登录成功:
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux server 5.4.0-109-generic x86_64)
...
Last login: Mon Oct 16 10:30:45 2023 from your_client_ip
ubuntu@server:~$
如果登录失败,会提示密码错误或其他认证错误,需要根据错误提示进行排查。
6. 如何批量配置多台服务器?
如果需要批量配置多台服务器,可以使用Ansible进行自动化部署。以下是一个简单的Ansible playbook示例:
---
- name: 配置免密登录证书
hosts: all
become: yes
tasks:
- name: 安装OpenSSL
apt:
name: openssl
state: present
- name: 生成密钥对
command: |
openssl genrsa -out /home/{{ ansible_user }}/.ssh/client.key 2048 &&
openssl req -new -key /home/{{ ansible_user }}/.ssh/client.key -out /home/{{ ansible_user }}/.ssh/client.csr &&
openssl x509 -req -days 365 -in /home/{{ ansible_user }}/.ssh/client.csr -signkey /home/{{ ansible_user }}/.ssh/client.key -out /home/{{ ansible_user }}/.ssh/client.crt
- name: 配置SSH
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PubkeyAuthentication'
line: 'PubkeyAuthentication yes'
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^AuthorizedKeysFile'
line: 'AuthorizedKeysFile .ssh/authorized_keys'
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PasswordAuthentication'
line: 'PasswordAuthentication no'
service:
name: sshd
state: restarted
这个playbook会:
1. 在所有目标服务器上安装OpenSSL。
2. 生成密钥对并保存到/home/用户名/.ssh目录下。
3. 修改SSH配置文件并重启SSH服务。
使用前,需要先创建inventory文件,列出所有目标服务器:
[servers]
server1 ansible_user=ubuntu
server2 ansible_user=debian
server3 ansible_user=centos
然后执行以下命令运行playbook:
ansible-playbook -i inventory playbook.yml
7. 有什么安全注意事项?
使用证书登录虽然方便,但也需要注意以下安全事项:
1. 私钥文件(.key)必须保持安全,不要设置错误的权限,确保只有所有者可以读写。
2. 不要将私钥文件添加到版本控制系统中,如Git。
3. 定期更换证书,避免证书过期导致无法登录。
4. 如果证书是自签名的,可以在客户端手动信任证书,避免每次连接都提示证书错误:
ssh-keyscan server_ip >> ~/.ssh/known_hosts
5. 确保SSH服务只监听内网或信任的网络,避免被外部攻击。