2025-09-28
告别密码:使用 SSH 密钥实现更安全、更便捷的服务器登录

前言

在日常的服务器管理和开发工作中,我们每天可能需要无数次地登录远程服务器。传统的密码登录方式不仅繁琐——需要我们记住并输入复杂的密码,更重要的是,它将我们的服务器暴露在被暴力破解的风险之下。

有没有一种方法,既能让我们安全地连接服务器,又能免去重复输入密码的烦恼呢?

答案是肯定的。那就是使用 SSH 密钥对进行身份验证。这篇博客将带你一步步配置 SSH 密钥登录,让你的服务器连接既安全又高效。

核心概念:公钥与私钥

在开始操作之前,我们先花一分钟理解一下核心概念。SSH 密钥认证基于一种名为“非对称加密”的技术,它会生成一对密钥:

  1. 公钥 (Public Key):可以把它想象成一把。你可以把这把锁安装到任何你想要进入的服务器的“门”上。这把锁是公开的,给谁都无所谓。
  2. 私钥 (Private Key):这是唯一能打开这把锁的钥匙。它必须由你本人严格保管,绝不能泄露给任何人

登录过程就像这样:你尝试连接服务器时,服务器会用你之前安装的“锁”(公钥)向你发出一个挑战,只有你本地电脑上持有配对的“钥匙”(私钥)才能正确回应这个挑战,从而证明你的身份,服务器便会允许你登录。

SSH Key Analogy
(一个简单的锁和钥匙比喻)

第一步:在你的本地电脑上生成密钥对

首先,我们需要在自己的电脑上(客户端)生成这对“锁和钥匙”。

打开你的终端(无论是 Windows 的 WSL/Git Bash,还是 macOS/Linux 的 Terminal),输入以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
ssh-keygen -t ed25519 -C "your_email@example.com"
````

> **命令解析:**
>
> * `-t ed25519`: 指定使用 `ed25519` 算法。这是目前最推荐的算法,比传统的 `RSA` 更安全、性能更好。如果你的系统非常老旧,可以换成 `-t rsa -b 4096`。
> * `-C "your_email@example.com"`: 添加一个注释,通常是你的邮箱,方便你识别这个密钥的用途。

执行后,系统会向你提问:

```text
> Enter file in which to save the key (/Users/yourname/.ssh/id_ed25519):

直接按回车,将其保存在默认位置即可。

1
> Enter passphrase (empty for no passphrase):

强烈建议在这里设置一个密码 (passphrase)!这个密码是用来加密你的私钥文件的。即使某天你的电脑文件被盗,没有这个密码,黑客也无法使用你的私钥。

输入密码并确认后,你的密钥对就生成完毕了!它们位于 ~/.ssh/ 目录下:

  • id_ed25519: 你的私钥(钥匙),请妥善保管。
  • id_ed25519.pub: 你的公钥(锁),准备把它安装到服务器上。

第二步:将“锁”(公钥)安装到服务器上

现在,我们需要把公钥上传到目标服务器。这里介绍两种方法。

方法一:使用 ssh-copy-id (强烈推荐)

这是最简单、最不容易出错的方法。它会自动完成所有配置。

假设你的服务器用户名是 root,IP 地址是 123.45.67.89,执行:

1
ssh-copy-id root@123.45.67.89

系统会要求你输入一次服务器的登录密码。输入正确后,你的公钥就被自动添加到了服务器的信任列表 ~/.ssh/authorized_keys 中,并且权限也设置妥当了。

方法二:手动复制粘贴

如果你的本地电脑没有 ssh-copy-id 工具,也可以手动操作。

  1. 在本地电脑,显示并复制你的公钥内容:

    1
    cat ~/.ssh/id_ed25519.pub

    复制终端输出的那一长串 ssh-ed25519 ... 字符。

  2. 用密码登录服务器

    1
    ssh root@123.45.67.89
  3. 在服务器上,将公钥追加到 authorized_keys 文件中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 确保 .ssh 目录存在
    mkdir -p ~/.ssh

    # 将你的公钥粘贴到这里,并追加到文件中
    echo "在这里粘贴你复制的公钥内容" >> ~/.ssh/authorized_keys

    # 修复文件权限(至关重要!)
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

    注意:权限设置错误是导致密钥登录失败最常见的原因。SSH 要求 .ssh 目录和 authorized_keys 文件有严格的权限。

第三步:测试你的新“钥匙”

现在,退出服务器,然后尝试重新登录:

1
ssh root@123.45.67.89

如果一切顺利,系统将不再询问服务器的密码,而是提示你输入私钥的密码(就是你在第一步设置的 passphrase)。输入正确后,你就成功登录了!

第四步:安全加固 - 禁用密码登录

为了让服务器彻底免疫密码暴力破解,当你确认密钥登录工作正常后,就应该禁用传统的密码登录方式。

  1. 登录到你的服务器。
  2. 编辑 SSH 配置文件:
    1
    sudo nano /etc/ssh/sshd_config
  3. 找到并修改以下几项,确保它们的值如下(如果行首有 #,请删除):
    1
    2
    3
    PubkeyAuthentication yes
    PasswordAuthentication no
    ChallengeResponseAuthentication no
  4. 保存文件,然后重启 SSH 服务使配置生效:
    1
    sudo systemctl restart sshd

⚠️ 安全警告: 在执行此操作并断开连接之前,请务必打开一个新的终端窗口,再次测试你的 SSH 密钥登录是否正常。如果配置有误,禁用密码登录可能会导致你被锁在服务器之外!

进阶技巧:管理多个 SSH 密钥

如果你需要管理多个服务器(比如公司的、私人的)或多个 Git 账户,你可能会有多个密钥对。

  • 生成特定密钥:使用 ssh-keygen -f ~/.ssh/work_key 来生成名为 work_key 的新密钥。
  • 上传特定公钥:使用 -i 参数指定要上传的公钥:
    1
    ssh-copy-id -i ~/.ssh/work_key.pub user@work-server.com
  • 使用特定私钥登录:同样使用 -i 参数:
    1
    ssh -i ~/.ssh/work_key user@work-server.com

总结

恭喜你!你已经成功地为你的服务器配置了 SSH 密钥登录。回顾一下,我们完成了:

  1. 生成了专属的公钥和私钥。
  2. 上传了公钥到服务器。
  3. 测试了密钥登录的有效性。
  4. 禁用了密码登录,提升了服务器的安全性。

这是一项一劳永逸的投资。从现在开始,享受更安全、更便捷的服务器管理体验吧!

Read More

2024-12-23
为 Hexo 项目添加 RSS 订阅链接

rss是一种简易的信息发布方式,通过RSS订阅可以及时获取博客的更新信息。本文将介绍如何为 Hexo 项目添加 RSS 订阅链接。

Read More

2024-11-28
Deploy frp on mac and linux

在 Mac 和 Linux 上部署 frp, 来实现内网穿透, 使得外网可以访问内网的服务, 例如家里的 NAS, 服务器等等.

什么是 frp

frp 是一个快速反向代理, 可以帮助您将内部网络服务暴露到公共网络, 例如家庭网络中的 NAS, 服务器等等.

安装 frp

首先从 frp 的 GitHub Releases 页面下载 frp 的客户端和服务端程序.

如下图:

image-20241128162828012

其中frp_0.x.x_darwin_amd64.tar.gz是 Mac 版本的客户端程序, frp_0.x.x_linux_amd64.tar.gz是 Linux 版本的客户端程序.
解压后包含以下文件:

  • frpc 客户端程序
  • frps 服务端程序
  • frps.toml 服务端配置文件
  • frpc.toml 客户端配置文件
  • LICENSE 许可证文件

服务端: 具有公网 IP 的Linux服务器

  1. 下载对应 frp 的服务端程序

  2. 解压缩至任一目录

  3. 修改 frps.toml 配置文件

    1
    2
    # frps.toml
    bindPort = 7000
  4. 运行 ./frps -c frps.toml 启动服务端

客户端: Mac

  1. 下载对应 frp 的客户端程序

  2. 解压缩至任一目录

  3. 修改 frpc.toml 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # frpc.toml
    serverAddr = "x.x.x.x"
    serverPort = 7000

    [[proxies]]
    name = "ssh"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 22
    remotePort = 6000
  4. 运行 ./frpc -c frpc.toml 启动客户端

分别配置守护进程

服务端: Linux

可以完全参考官方文档, 使用systemd方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动

客户端: Mac

MAC上可以使用launchd来配置守护进程, 使得 frpc 客户端程序在后台运行.

  1. 创建一个 plist 文件, 例如 frpc.plist

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
    http://www.apple.com/DTDs/PropertyList-1.0.dtd >
    <plist version="1.0">
    <dict>
    <key>Label</key>
    <string>frpc</string>
    <key>ProgramArguments</key>
    <array>
    <string>/Users/xxxx/frp/frpc</string>
    <string>-c</string>
    <string>/Users/xxxx/frp/frpc.toml</string>
    </array>
    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    </dict>
    </plist>

    其中/Users/xxxx/frp/为 frp 的安装目录, frpc.toml为 frpc 的配置文件

  2. 根据需求该文件存到对应目录

  • ~/Library/LaunchAgents/ 仅当前用户
  • /Library/LaunchAgents/ 所有用户
  • /Library/LaunchDaemons/ 系统级别
  1. 加载配置文件
1
2
sudo chown root ~/Library/LaunchAgents/frpc.plist
launchctl load -w ~/Library/LaunchAgents/frpc.plist
  1. 启动服务
1
launchctl start frpc
  1. 查看服务状态
1
launchctl list | grep frpc

或者打开mac monitor查看是否有frpc进程

image-20241128164327407
  1. 其他命令
1
2
launchctl stop frpc # 停止服务
launchctl unload ~/Library/LaunchAgents/frpc.plist # 卸载服务
Read More

2024-11-20
Use ssh to connect to Google Virtual Machine

谷歌云服务器默认登录方式是browser ssh,但是有时候我们需要第三方客户端使用ssh连接服务器。
本文介绍如何使用ssh连接Google Cloud平台的虚拟机(云服务器)

Read More

2024-10-13
如何将 Font Awesome 从 v4 迁移到 v5 并优化图标加载

在这篇博客中, 我将讨论如何将Font Awesome从v4迁移到v5, 并选择合适的方式加载图标库, 帮助你优化图标加载性

Read More

2024-10-06
Style your Terminal & IDEs

Style your Terminal

In this article, I will show you how to style your terminal and IDEs.
We will use iTerm2 as the terminal and Oh My Zsh as the shell.

Read More

2024-09-25
FAQ

1. VSCode User Settings vs Workspace Settings

See the difference between User Settings and Workspace Settings in:https://code.visualstudio.com/docs/getstarted/settings

Read More

2024-09-17
Deploy RssHub on Vercel(部署 RssHub 在 Vercel 上)

Deploy RssHub on Vercel(部署 RssHub 在 Vercel 上)

背景

官方推荐使用docker-compose部署RssHub,但是需要个人服务器,而且需要一定的技术水平,而在Vercel上部署RssHub更加简单.

Vercel 介绍

Vercel 是一个现代化的部署应用程序平台, 有以下优点:

  • 部署速度快
  • 部署简单
  • 支持多种语言

问题

安装RssHub官方文档进行部署:https://docs.rsshub.app/deploy/#deploy-to-vercel


部署步骤

1. fork原仓库

https://github.com/DIYgod/RSSHub/fork

注意: 在此处取消勾选: Copy the master branch only

image-20240917165721730

2. 部署到vercel

  • 访问https://vercel.com/, 注册账号, 选择Hobby plan

  • 进入主页, 点击Add New...

    image-20240917170024094
  • 选择Project

    image-20240917170315369
  • Import 我们刚刚fork的仓库

    image-20240917170457356
  • 系统会默认生成一个项目名称,也可以自定义修改

  • 其他配置不动,点击Deploy

  • 这里就会遇到开头提到的Error: 当前的环境版本是 node.js 20,而package.json的要求的 node.js版本要≥22

  • 这里我们的解决方案是使用仓库的legacy分支, 该分支设定的node.js版本为≥16, 满足我们的需求

  • 如下图, 进入项目设置, 选择Git, 修改Production Branch中的Branch namelegacy, 然后点击save保存

    image-20240917171024074
  • 接下来, 在下面的Deploy Hooks中创建legacy on legacy, 如下图:

    image-20240917171239697

  • 访问生成的url, 创建新的deployment, 等待一段时间之后, 就已经部署好了

3. 配置域名

  • 进入项目设置, 点击Domains, 添加域名, 配置DNS解析

    image-20240917171630093
  • 访问配置好的域名, 出现下图, 说明部署完成!

    image-20240917171718131

总结

  • 通过Vercel部署RssHub, 可以省去自己搭建服务器的麻烦, 也不用担心服务器的维护问题
  • 部署过程中遇到的问题, 通过修改仓库的legacy分支, 解决了node.js版本不匹配的问题
  • 部署完成后, 可以配置域名, 使得访问更加方便
  • 通过这次部署, 也学到了如何在Vercel上部署项目, 以及如何配置域名


reference: https://cloud.tencent.com/developer/article/2432561

Read More

2024-09-16
NVM 使用指南

NVM(Node Version Manager)是一个 Node.js 版本管理工具,可以让你在同一台服务器上安装和切换不同版本的 Node.js。本文将介绍如何安装和使用 NVM。

1. 安装 NVM

1.1 使用 cURL 安装 NVM

首先,你需要使用 cURL 下载 NVM 安装脚本。在终端中执行以下命令:

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

1.2 使用 Wget 安装 NVM

如果你没有安装 cURL,也可以使用 Wget 下载 NVM 安装脚本:

1
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

1.3 使用 homebrew 安装 NVM

如果你使用 macOS,并且安装了 homebrew,你可以使用以下命令安装 NVM:

1
brew install nvm

1.4 验证安装

安装完成后,你需要重新加载终端配置文件(如 .bashrc.bash_profile.zshrc 等)或重启终端。然后执行以下命令验证 NVM 是否安装成功:

1
command -v nvm

如果输出 nvm,则表示 NVM 安装成功。

2. 使用 NVM 安装 Node.js

2.1 查看可用 Node.js 版本

你可以使用以下命令查看 NVM 支持的所有 Node.js 版本:

1
nvm ls-remote

2.2 安装 Node.js

安装 Node.js 的命令格式为:

1
nvm install <version>

例如,安装 Node.js 14.17.0:

1
nvm install 14.17.0

2.3 切换 Node.js 版本

安装多个 Node.js 版本后,你可以使用以下命令切换版本:

1
nvm use <version>

例如,切换到 Node.js 14.17.0:

1
nvm use 14.17.0

2.4 设置默认 Node.js 版本

你可以使用以下命令设置默认 Node.js 版本:

1
nvm alias default <version>

例如,设置默认 Node.js 版本为 14.17.0:

1
nvm alias default 14.17.0

3. 卸载 NVM

如果你想卸载 NVM,可以执行以下命令:

1
rm -rf ~/.nvm

4. 安装pnpm

1
npm install -g pnpm
Read More

2024-09-10
使用 Nginx 和 Apache2 配置反向代理

反向代理是一种服务器配置方式,用来代理和转发客户端的请求到后端服务器上。它可以在负载均衡、缓存、加速、安全性等方面提供帮助。常见的反向代理服务器有 Nginx 和 Apache2。本文将详细讲解如何使用 Nginx 和 Apache2 来配置反向代理,将请求代理到不同的端口或服务器上。


1. 什么是反向代理

反向代理(Reverse Proxy)是代理服务器的一种形式,客户端并不知道其实际请求的是哪一台服务器,而是通过代理服务器将请求转发到后端的不同服务器或服务上。反向代理的主要用途包括:

  • 隐藏后端服务器的 IP 和端口,增强安全性。
  • 负载均衡,分发请求到多台后端服务器。
  • SSL/TLS 卸载,在代理服务器处理 SSL 连接,减少后端服务器的计算负担。
  • 缓存,提升性能,减少后端服务器压力。

例如,假设你有一个后端应用运行在 http://MY_IP_ADDRESS:1200,你希望通过你的域名 example.com 访问该服务,而无需用户输入端口号 1200。这时就可以使用反向代理。


2. 使用 Nginx 配置反向代理

2.1 安装 Nginx

首先,你需要在服务器上安装 Nginx。如果还未安装,可以通过以下命令进行安装:

Debian/Ubuntu:

1
2
sudo apt update
sudo apt install nginx

CentOS:

1
2
sudo yum install epel-release
sudo yum install nginx

2.2 配置 Nginx 反向代理

安装完成后,你需要编辑 Nginx 的配置文件,通常位于 /etc/nginx/sites-available//etc/nginx/conf.d/

  1. 创建或编辑配置文件(例如 /etc/nginx/sites-available/example.com):
1
sudo nano /etc/nginx/sites-available/example.com
  1. 添加如下配置,将流量从域名 example.com 代理到 http://MY_IP_ADDRESS:1200
1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name example.com;

location / {
proxy_pass http://MY_IP_ADDRESS:1200;
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;
}
}
  1. 启用站点配置(适用于 Debian/Ubuntu):
1
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  1. 检查 Nginx 配置语法是否正确:
1
sudo nginx -t
  1. 重启 Nginx 使配置生效:
1
sudo systemctl restart nginx

2.3 配置 HTTPS (可选)

如果你希望通过 HTTPS 访问,可以使用 Let’s Encrypt 免费获取 SSL 证书。

  1. 安装 certbot
1
sudo apt install certbot python3-certbot-nginx
  1. 获取并配置 SSL 证书:
1
sudo certbot --nginx -d example.com
  1. 按照提示操作完成 HTTPS 配置。

3. 使用 Apache2 配置反向代理

3.1 安装 Apache2

如果你的服务器上还没有安装 Apache2,首先需要安装:

Debian/Ubuntu:

1
2
sudo apt update
sudo apt install apache2

CentOS:

1
sudo yum install httpd

3.2 启用必要的 Apache 模块

在 Apache 中,反向代理功能通过模块来实现。你需要启用以下模块:

1
2
3
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers

3.3 配置 Apache2 反向代理

  1. 编辑 Apache2 配置文件(例如 /etc/apache2/sites-available/example.com.conf):
1
sudo nano /etc/apache2/sites-available/example.com.conf
  1. 添加如下配置:
1
2
3
4
5
6
7
8
9
10
<VirtualHost *:80>
ServerName example.com

ProxyPreserveHost On
ProxyPass / http://MY_IP_ADDRESS:1200/
ProxyPassReverse / http://MY_IP_ADDRESS:1200/

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. 启用站点配置:
1
sudo a2ensite example.com.conf
  1. 检查配置是否正确:
1
sudo apachectl configtest
  1. 重启 Apache 使配置生效:
1
sudo systemctl restart apache2

3.4 配置 HTTPS (可选)

与 Nginx 类似,你也可以通过 certbot 获取 SSL 证书。

  1. 安装 certbot
1
sudo apt install certbot python3-certbot-apache
  1. 获取并配置 SSL 证书:
1
sudo certbot --apache -d example.com
  1. 按照提示操作完成 HTTPS 配置。

4. 常见问题排查

4.1 检查代理设置是否生效

通过浏览器访问你的域名(http://example.com),如果显示正确的后端内容,说明反向代理配置成功。如果出现问题,检查以下内容:

  • 端口问题:确保后端服务器监听的端口是正确的。
  • 防火墙设置:确认服务器的防火墙允许访问相关端口(80、443 和 1200)。
  • Nginx/Apache 配置错误:使用 nginx -tapachectl configtest 检查配置文件是否正确。

4.2 日志排查

如果代理未生效,可以查看 Nginx 或 Apache 的日志,通常位于:

  • Nginx/var/log/nginx/error.log
  • Apache/var/log/apache2/error.log

5. 总结

配置反向代理能够极大提升你服务器的灵活性与安全性。Nginx 和 Apache2 都提供了强大的反向代理功能,适合在各种场景下使用。Nginx 通常适用于高性能、低资源的环境,而 Apache 则提供了丰富的模块和配置选项。

通过本文的详细步骤,你应该能够成功配置反向代理,让你的域名能够代理和转发流量到不同的服务器和端口上。如果你希望进一步提升安全性,还可以添加 HTTPS 支持并启用缓存和负载均衡功能。

Read More