ssh密码改密钥登录

koaker 发布于 2025-06-01 所有文章


将 SSH 的密码登录方式更改为密钥登录是一种更安全、更便捷的做法。下面是详细的步骤:

**核心流程:**

1.  **在客户端生成密钥对**(一个私钥,一个公钥)。
2.  **将公钥复制到服务器**上指定用户的 `~/.ssh/authorized_keys` 文件中。
3.  **配置服务器的 SSH 服务**以允许密钥登录(通常默认开启)。
4.  **(可选但强烈推荐)禁用密码登录**以提高安全性。
5.  **测试密钥登录**。

---

**详细步骤:**

**第一步:在你的本地计算机(客户端)上生成 SSH 密钥对**

1.  打开你的本地计算机的终端(Linux/macOS)或 Git Bash/WSL(Windows)。
2.  运行以下命令来生成密钥对:
    ```bash
    ssh-keygen -t ed25519 -C "[email protected]"
    ```
    *   `-t ed25519`: 指定密钥类型为 Ed25519,这是一种现代且安全的椭圆曲线算法。如果你的系统不支持 Ed25519,可以使用 `rsa` 类型:`ssh-keygen -t rsa -b 4096 -C "[email protected]"`(`-b 4096` 表示密钥长度为 4096 位,更安全)。
    *   `-C "[email protected]"`: 这是一个注释,方便你识别密钥,可以替换成任何你喜欢的内容。

3.  系统会提示你:
    ```
    Enter file in which to save the key (/home/your_user/.ssh/id_ed25519):
    ```
    直接按 Enter 键接受默认路径即可(通常是 `~/.ssh/id_ed25519` 或 `~/.ssh/id_rsa`)。

4.  接下来会提示你设置一个密码短语(passphrase):
    ```
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    ```
    *   **强烈建议设置一个强密码短语!** 这样即使你的私钥文件被盗,没有密码短语也无法使用。
    *   如果留空,则登录时不需要输入密码短语,但安全性会降低。

5.  命令执行完毕后,你会在 `~/.ssh/` 目录下找到两个文件:
    *   `id_ed25519` (或 `id_rsa`):这是你的**私钥**,**必须妥善保管,绝不能泄露给任何人!**
    *   `id_ed25519.pub` (或 `id_rsa.pub`):这是你的**公钥**,可以安全地分享和复制到服务器。

**第二步:将公钥复制到服务器**

你有几种方法可以做到这一点:

**方法一:使用 `ssh-copy-id` (推荐,最简单)**

如果你的本地计算机上有 `ssh-copy-id` 工具(Linux 和 macOS 通常自带),这是最简单的方法。

```bash
ssh-copy-id your_username@your_server_ip_or_hostname
```
替换 `your_username` 为你在服务器上的用户名,`your_server_ip_or_hostname` 为服务器的 IP 地址或域名。

系统会提示你输入服务器上 `your_username` 用户的密码。输入正确密码后,公钥会自动追加到服务器上 `~/.ssh/authorized_keys` 文件中,并且会设置正确的权限。

**方法二:手动复制公钥 (如果 `ssh-copy-id` 不可用)**

1.  在你的本地计算机上,显示公钥内容:
    ```bash
    cat ~/.ssh/id_ed25519.pub
    ```
    复制输出的整行内容(以 `ssh-ed25519` 或 `ssh-rsa` 开头,以你的注释结尾)。

2.  登录到你的服务器(此时仍使用密码登录):
    ```bash
    ssh your_username@your_server_ip_or_hostname
    ```

3.  在服务器上,执行以下命令:
    ```bash
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    ```
    *   `mkdir -p ~/.ssh`: 如果 `~/.ssh` 目录不存在则创建它。
    *   `chmod 700 ~/.ssh`: 设置 `~/.ssh` 目录的权限为 `700` (只有所有者可读写执行)。
    *   `touch ~/.ssh/authorized_keys`: 如果 `authorized_keys` 文件不存在则创建它。
    *   `chmod 600 ~/.ssh/authorized_keys`: 设置 `authorized_keys` 文件的权限为 `600` (只有所有者可读写)。
    **这些权限非常重要,如果权限不正确,SSH 密钥登录可能会失败。**

4.  用你喜欢的编辑器(如 `nano` 或 `vim`)打开 `~/.ssh/authorized_keys` 文件:
    ```bash
    nano ~/.ssh/authorized_keys
    ```
    将你之前复制的公钥内容粘贴到这个文件中,保存并退出。确保公钥内容是完整的一行。

**第三步:测试密钥登录**

1.  在你的本地计算机上,尝试通过 SSH 登录到服务器:
    ```bash
    ssh your_username@your_server_ip_or_hostname
    ```
2.  如果一切配置正确:
    *   如果你为密钥设置了密码短语,系统会提示你输入密码短语。
    *   如果你没有设置密码短语,应该会直接登录成功,不会再要求输入服务器密码。

**第四步:在服务器上禁用密码登录 (可选但强烈推荐)**

一旦你确认密钥登录工作正常,为了提高安全性,应该禁用密码登录。

1.  在服务器上,以 `root` 用户或使用 `sudo` 编辑 SSH 服务器配置文件 `/etc/ssh/sshd_config`:
    ```bash
    sudo nano /etc/ssh/sshd_config
    ```

2.  找到以下几行,并确保它们的值如下(如果某行以 `#` 开头,请去掉 `#`):
    ```ini
    PubkeyAuthentication yes        # 确保开启公钥认证 (通常默认是 yes)
    PasswordAuthentication no       # 禁用密码认证
    ChallengeResponseAuthentication no # 通常也建议设为 no,它也可能允许密码形式的登录
    UsePAM no                       # 如果 PasswordAuthentication no 不起作用,尝试将 UsePAM 设置为 no。
                                    # 但请注意:UsePAM no 可能会禁用其他 PAM 模块提供的功能,如双因素认证。
                                    # 通常 PasswordAuthentication no 就足够了。
    ```

3.  保存文件并退出编辑器。

4.  重启 SSH 服务以使更改生效:
    *   对于使用 systemd 的系统 (如 Ubuntu 16.04+, Debian 8+, CentOS 7+):
        ```bash
        sudo systemctl restart sshd
        ```
    *   对于使用 init.d 的旧系统 (如 Ubuntu 14.04, CentOS 6):
        ```bash
        sudo service ssh restart  # 或者 sudo service sshd restart
        ```

**重要提示:**
*   **在禁用密码登录之前,务必确保你的密钥登录能够正常工作!** 否则,你可能会把自己锁在服务器外面。你可以打开一个新的终端窗口进行测试,保持当前已登录的会话不要关闭,直到确认新会话可以用密钥登录。
*   **备份你的私钥**:将你的私钥 (`~/.ssh/id_ed25519` 或 `~/.ssh/id_rsa`) 备份到一个安全的地方(例如加密的U盘)。如果本地计算机损坏,你将需要它来访问服务器。

**第五步:最终测试**

尝试再次从你的本地计算机 SSH 到服务器:
```bash
ssh your_username@your_server_ip_or_hostname
```
此时,它应该只接受密钥登录(如果设置了密码短语,会提示输入密码短语),而不应再提示输入服务器密码。

**使用 SSH Agent 避免重复输入密码短语 (可选)**

如果你为密钥设置了密码短语,每次使用 SSH 时都需要输入。`ssh-agent` 可以帮助你缓存解密的私钥,这样在一个会话中只需要输入一次密码短语。

1.  启动 `ssh-agent` (通常在你的 `~/.bash_profile`, `~/.zshrc` 或类似启动脚本中自动启动,或者手动运行):
    ```bash
    eval $(ssh-agent -s)
    ```
2.  将你的私钥添加到 `ssh-agent`:
    ```bash
    ssh-add ~/.ssh/id_ed25519  # 或 ~/.ssh/id_rsa
    ```
    此时会提示你输入密码短语。之后,只要 `ssh-agent` 正在运行,你就不需要再次输入该密钥的密码短语了。

现在,你已经成功地将 SSH 登录方式从密码改为了更安全的密钥登录。
此作者没有提供个人介绍。
最后更新于 2025-06-01