返回

Windows OpenSSH公钥认证失败:原因与解决方案

windows

Windows OpenSSH 公钥认证失败问题分析与解决

在配置 Windows OpenSSH 服务时,一个常见的困扰是,即使配置了 authorized_keys 文件,SSH 仍然要求输入用户密码。本文深入探讨了这个问题,分析可能原因并提供具体解决方案。

公钥认证失效的原因

公钥认证失效通常涉及以下几个方面:

  1. authorized_keys 文件权限问题 : 文件权限不当可能阻止 OpenSSH 读取公钥信息,导致认证失败。
  2. 文件路径错误 : 存放 authorized_keys 文件的位置错误会导致 OpenSSH 无法找到正确的公钥。
  3. 公钥内容格式错误 : 公钥内容的格式不正确,比如额外的空格或换行符,也会导致认证失败。
  4. SSH 服务配置问题 : 某些 OpenSSH 配置参数可能限制了公钥认证,比如 PasswordAuthentication 参数被强制启用。

解决方案

针对以上原因,下面列出具体的解决方案。

1. 检查 authorized_keys 文件权限

原因 : Windows 上的 SSH 服务对文件权限要求严格。 如果 .ssh 目录和 authorized_keys 文件的权限设置不正确,SSH 服务可能无法读取该文件。
操作步骤 :
1. 打开 PowerShell,使用 icacls 命令检查 .ssh 目录和 authorized_keys 文件的权限。

```powershell
    icacls C:\Users\clientssh\.ssh
    icacls C:\Users\clientssh\.ssh\authorized_keys
```
2.  确保 `.ssh` 目录仅允许 `clientssh` 用户拥有完全控制权限,并且禁止其他用户或组的任何访问权限。
3.  `authorized_keys` 文件也应只允许 `clientssh` 用户读取和写入。

    修改权限的命令如下(务必根据你的用户名替换 `clientssh`):
    ```powershell
       icacls C:\Users\clientssh\.ssh /inheritance:r /grant clientssh:F /T
        icacls C:\Users\clientssh\.ssh\authorized_keys /inheritance:r /grant clientssh:RW /T
        ```

**注意** : `F` 代表完全控制权限, `RW` 代表读取和写入权限, `/inheritance:r` 是移除继承的权限。 使用 `/T`参数保证当前文件夹以及子文件权限生效。 运行以上命令需要管理员权限, 需要使用管理员方式打开 powershell。

2. 确认 authorized_keys 文件路径正确

原因 : OpenSSH 默认从 ~/.ssh/authorized_keys 文件读取公钥信息。路径错误会导致 SSH 服务无法找到正确的公钥。
操作步骤 :

  1. 确认 authorized_keys 文件确实位于 C:\Users\clientssh\.ssh\ 下。 如果路径不对,移动该文件到正确位置。
  2. 可以使用以下命令创建并编辑authorized_keys 文件:
    mkdir C:\Users\clientssh\.ssh
    New-Item C:\Users\clientssh\.ssh\authorized_keys

3. 检查 authorized_keys 文件内容

原因 : 公钥内容中的任何错误(如额外空格,不正确的格式)都可能导致认证失败。
操作步骤 :

  1. 使用文本编辑器检查 authorized_keys 文件。
  2. 确认每行只有一个公钥,并且没有任何额外的空格或换行符,如下所示:
 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPWw3g8HqjP8s2j15V/57L3lJ+k2v1j7+7h8j4VdZp7  your_comment_or_user_name
 ```

### 4.  验证 SSH 服务配置

**原因** : 某些 OpenSSH 配置参数可能会影响公钥认证, 例如  `PasswordAuthentication`  配置。
**操作步骤** :
 1.  编辑 SSH 服务配置文件 `sshd_config` 。该文件通常位于 `C:\ProgramData\ssh\`。
     如果配置文件不存在则需要自己创建一个文件 `C:\ProgramData\ssh\sshd_config`.
2.  确认以下配置是否正确:
     -  `PubkeyAuthentication yes`: 确保开启公钥认证。

     -   `PasswordAuthentication no` 或  `PasswordAuthentication yes` : `PasswordAuthentication yes` 同时允许公钥和密码认证,  `PasswordAuthentication no` 只允许公钥认证。如果你需要强制使用公钥认证可以禁用 `PasswordAuthentication`。
  
     -  确保没有 `AuthenticationMethods` 配置。 如果有的话需要调整配置来允许使用公钥认证,例如 `AuthenticationMethods publickey`。

3.  重启 SSH 服务以使更改生效。

 ```powershell
     Restart-Service sshd
 ```

### 5. 检查客户端 SSH 连接的密钥选择

**原因** :  客户端的 SSH 可能没有选择正确的密钥。
**操作步骤** :
1.  使用 `-i` 参数在连接时显式指定私钥文件:

    ```powershell
     ssh -v -i C:\Users\user\.ssh\id_ed25519 [email protected]
    ```
 2. 如果私钥文件使用了 passphrase, 则会在命令行输入 passphrase. 如果仍然连接失败可以根据 `-v` 参数显示的详细信息来确定失败原因。

## 安全建议

*   **私钥安全** :  妥善保管你的私钥。不要将其随意分享。
*   **Passphrase 加密** : 对私钥使用 passphrase 进行加密可以增强安全性,尽管在每次使用时会提示输入密码。

如果执行以上步骤后仍然存在问题,建议使用 `ssh -v` 命令查看详细的连接日志。这些日志能提供更精准的调试信息。

---
通过详细地分析各种可能原因,并提供步骤清晰、可执行的解决方案, 可以有效解决 Windows OpenSSH 公钥认证问题,保障远程访问的安全。