自托管 Gitea 服务器的 SSH 访问问题

Temp mail SuperHeros
自托管 Gitea 服务器的 SSH 访问问题
自托管 Gitea 服务器的 SSH 访问问题

使用 Gitea 解决 SSH 访问问题

最近,我在本地计算机上使用 Docker 容器设置了 Gitea 服务器。为了确保连接安全,我还使用 Certbot 提供的 SSL 配置了 Nginx 反向代理。

尽管遵循了 Gitea 和 GitHub 的 SSH 密钥生成教程,但我在尝试连接到 Gitea 服务器时遇到了权限被拒绝的错误。本文探讨了我为解决 SSH 访问问题所采取的步骤和故障排除方法。

命令 描述
ssh-keygen 生成新的 SSH 密钥对以实现安全连接。
eval "$(ssh-agent -s)" 在后台启动 SSH 代理来管理 SSH 密钥。
ssh-add ~/.ssh/id_rsa 将生成的 SSH 私钥添加到 SSH 代理。
pbcopy < ~/.ssh/id_rsa.pub 将 SSH 公钥复制到 macOS 系统上的剪贴板。
xclip -sel clip < ~/.ssh/id_rsa.pub 使用 xclip 将 SSH 公钥复制到 Linux 系统上的剪贴板。
proxy_pass 将请求定向到 Nginx 配置中指定的后端服务器。
paramiko.RSAKey.from_private_key_file 在 Python 中使用 Paramiko 从文件加载 RSA 私钥。
paramiko.SSHClient().set_missing_host_key_policy 自动添加服务器的主机密钥而不提示用户。
chmod 600 ~/.ssh/config 为 SSH 配置文件设置正确的权限以保护它。

排除 SSH 连接问题

前面的示例中提供的脚本旨在解决 Gitea 服务器的 SSH 密钥身份验证设置和故障排除的各个方面。第一个脚本使用 Bash 脚本生成 SSH 密钥 ssh-keygen,将其添加到 SSH 代理 ssh-add,然后将公钥复制到剪贴板 pbcopy 或者 xclip。这些步骤对于确保 SSH 密钥正确设置并可供使用至关重要。第二个脚本配置 Nginx 将代理请求反向发送到 Gitea 服务器,确保正确处理 SSL 并正确转发请求 proxy_pass

第三个示例中的 Python 脚本使用 Paramiko 库来测试 SSH 连接。该脚本使用以下方式加载私钥 paramiko.RSAKey.from_private_key_file 并尝试连接到 Gitea 服务器。如果连接失败,它会提供错误消息,这有助于诊断问题。第四个脚本涉及更新 SSH 配置文件以确保正确的设置到位。命令如 Host, HostName, User, 和 IdentityFile 用于指定 Gitea 服务器的连接详细信息。最后, chmod 600 ~/.ssh/config 对配置文件设置适当的权限以保护它。

为 Gitea 设置 SSH 密钥身份验证

使用 Bash 脚本进行前端配置

# Step 1: Generate SSH Key
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# Step 2: Start the ssh-agent in the background
eval "$(ssh-agent -s)"
# Step 3: Add your SSH key to the ssh-agent
ssh-add ~/.ssh/id_rsa
# Step 4: Copy the SSH key to clipboard
pbcopy < ~/.ssh/id_rsa.pub
# If using xclip
xclip -sel clip < ~/.ssh/id_rsa.pub

为 Gitea 配置 Nginx 反向代理

使用 Nginx 配置文件

server {
    listen 80;
    server_name your_domain;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name your_domain;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

诊断 SSH 连接问题

使用 Python 脚本测试 SSH 连接

import paramiko
def test_ssh_connection(host, port, username, key_path):
    k = paramiko.RSAKey.from_private_key_file(key_path)
    c = paramiko.SSHClient()
    c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        c.connect(hostname=host, port=port, username=username, pkey=k)
        print("SSH connection successful")
    except Exception as e:
        print(f"Failed to connect: {e}")
    finally:
        c.close()
test_ssh_connection('your_domain', 22, 'your_username', '/path/to/id_rsa')

更新 Gitea 的 SSH 配置

使用 SSH 配置文件

# Open SSH config file
nano ~/.ssh/config
# Add the following configuration
Host gitea_server
    HostName your_domain
    User your_username
    IdentityFile ~/.ssh/id_rsa
# Save and exit
chmod 600 ~/.ssh/config
# Test SSH connection
ssh -T gitea_server

Gitea 的高级 SSH 密钥管理

管理 Gitea 服务器 SSH 密钥的另一个重要方面是密钥的正确处理和轮换。定期轮换 SSH 密钥可以降低无限期使用受损密钥的风险,从而增强安全性。您可以使用创建新的密钥对 ssh-keygen 并更新您的 Gitea 设置以反映新密钥。这种做法对于长期保持对服务器的安全访问至关重要。此外,确保您的 SSH 密钥安全存储并且不会暴露给未经授权的用户也至关重要。使用类似的工具 ssh-agent 安全地管理内存中的密钥,并避免将私钥留在磁盘上处于不受保护的状态。

对 SSH 密钥和配置文件实施严格的权限是另一层安全保护。命令如 chmod 600 ~/.ssh/id_rsachmod 600 ~/.ssh/config 限制对这些文件的访问,使未经授权的用户更难获得访问权限。此外,您可以使用多重身份验证 (MFA) 为 SSH 密钥的使用添加额外的安全层。 Google Authenticator 或硬件令牌等工具可以与您的 SSH 设置集成,以要求第二种形式的验证,从而使未经授权的访问变得更加困难。

SSH 访问问题的常见问题和解决方案

  1. 为什么我收到“权限被拒绝”错误?
  2. 确保您的 SSH 密钥已正确添加到 SSH 代理,并且公钥已添加到 Gitea 服务器的授权密钥。
  3. 如何生成新的 SSH 密钥对?
  4. 使用命令 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 生成新的 SSH 密钥对。
  5. 如何将 SSH 密钥添加到 ssh-agent 中?
  6. 使用命令 eval "$(ssh-agent -s)" 启动代理并 17 号 添加您的密钥。
  7. 如何将 SSH 公钥复制到剪贴板?
  8. 使用 pbcopy < ~/.ssh/id_rsa.pub 在 macOS 或 xclip -sel clip < ~/.ssh/id_rsa.pub 在 Linux 上。
  9. 如果我的 SSH 密钥遭到泄露,我该怎么办?
  10. 生成新的 SSH 密钥对并更新 Gitea 服务器以及使用该密钥的所有其他服务中的密钥。
  11. 如何为 SSH 密钥文件设置正确的权限?
  12. 使用命令 chmod 600 ~/.ssh/id_rsa 对您的私钥文件设置适当的权限。
  13. 为什么我的 SSH 连接超时?
  14. 检查您的网络连接,确保 Gitea 服务器正在运行,并且 SSH 端口已打开且可访问。
  15. 如何测试与服务器的 SSH 连接?
  16. 使用命令 ssh -T your_username@your_domain 测试连接。

确保 SSH 连接安全的最终步骤

总之,建立与 Gitea 服务器的可靠 SSH 连接需要仔细配置 SSH 密钥、Nginx 代理设置和严格的安全实践。通过遵循概述的步骤(包括生成和管理 SSH 密钥、设置适当的权限以及正确配置 Nginx),用户可以确保安全且功能齐全的设置。使用 Paramiko 等工具测试连接并定期轮换密钥,进一步增强安全性和可靠性。全面解决这些要素有助于解决连接问题并维护安全的开发环境。