Skip to content

SSL/TLS ​

生成ssh密钥对 ​

生成 SSH 密钥对(私钥和公钥)是使用 Git、登录服务器等操作的基础。这个过程很简单,通常在终端(Terminal)或命令行中,用 ssh-keygen 命令就能完成。

标准生成方法 ​

这是最通用的方法,适用于 Windows(PowerShell)、macOS 和 Linux 系统:

  1. 打开终端:在你的电脑上打开命令行工具。

  2. 输入命令:

    bash
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    • -t rsa:指定密钥类型为 RSA。
    • -b 4096:指定密钥长度为 4096 位,安全性更高。
    • -C "your_email@example.com":添加一个注释,通常是你的邮箱,方便标识。
  3. 设置保存路径:系统会提示 Enter file in which to save the key,一般直接按回车,使用默认路径 ~/.ssh/id_rsa 即可。

  4. 设置密码(推荐):系统会提示输入密码(passphrase),可以理解为给私钥再加一道锁。输入后,每次使用私钥都需要验证这个密码。可以按回车跳过,但为安全起见,建议设置一个。

  5. 完成:命令执行完后,公钥和私钥就生成好了。默认位置在用户目录下的 .ssh 文件夹里:

    • 私钥:id_rsa(绝不能泄露!)
    • 公钥:id_rsa.pub(可以安全地分享给任何人或服务器)

更简短的命令 ​

如果你觉得上面的命令参数太多,直接用下面这个也行,它会使用默认参数生成密钥:

bash
ssh-keygen

后续的交互步骤和上面是一样的。

在 Windows 上使用 WSL 生成 ​

如果你在用 Windows 的 WSL(Windows Subsystem for Linux),生成步骤和在原生 Linux 上完全一样:

  1. 打开 WSL 的终端窗口。
  2. 执行 ssh-keygen,根据提示操作。
  3. 密钥文件会保存在 WSL 的 ~/.ssh/ 目录下,可以直接通过 \\wsl$ 路径在 Windows 文件资源管理器中找到。

生成后的常用操作 ​

生成密钥后,你通常会用到以下操作:

  • 查看公钥:这是你要添加到 GitHub/GitLab 或远程服务器 ~/.ssh/authorized_keys 文件里的内容。

    bash
    cat ~/.ssh/id_rsa.pub
  • 复制公钥到剪贴板:方便直接粘贴。

    • macOS: pbcopy < ~/.ssh/id_rsa.pub
    • Windows (WSL): cat ~/.ssh/id_rsa.pub | clip.exe
    • Windows (CMD): type %userprofile%\.ssh\id_rsa.pub | clip
  • 测试连接:生成并配置好后,可以用以下命令测试是否能成功连接服务器。

    bash
    ssh -T git@github.com   # 测试 GitHub
    ssh -T git@gitlab.com   # 测试 GitLab

高级选项与补充 ​

  • 指定不同文件名:如果你需要管理多个密钥,可以在 ssh-keygen 时指定不同的文件名。

    bash
    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_mykey -C "my key"
  • 生成 Ed25519 密钥:这是一种新兴的、更安全且性能更好的密钥类型,越来越多地受到推荐。

    bash
    ssh-keygen -t ed25519 -C "your_email@example.com"

生成自签名证书 ​

linux系统一般有openssl工具, windows系统需要安装openssl工具。windows上如何安装git,也可以直接利用git bash来生成证书。

方式一:一条命令直接生成(最简单) ​

bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/CN=localhost"

实测在windows git bash中执行出现:name is expected to be in the format /type0=value0/type1=value1/type2=... where characters may be escaped by . This name is not in that format: 'C:/Program Files/Git/CN=localhost'problems making Certificate Request 导致只生成了server.key文件,没有生成server.crt文件,原因暂时不详。在ubuntu中测试无问题。

参数说明:

参数含义
req -x509生成自签名证书(X.509 格式)
-nodes私钥不加密(No DES),否则每次启动 nginx 都要输密码
-days 365证书有效期 365 天
-newkey rsa:2048同时生成 2048 位 RSA 私钥
-keyout server.key私钥输出文件
-out server.crt证书输出文件
-subj "/CN=localhost"证书主题,CN 是域名/IP,免去交互式输入

方式二:分步生成(更灵活) ​

1. 生成私钥

bash
openssl genrsa -out server.key 2048

2. 生成证书签名请求(CSR)

方式一:参数指定

bash
openssl req -new -key server.key -out server.csr -subj "/CN=localhost"

如果需要填写更多信息: openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=Dev/CN=localhost" 字段含义:C=国家,ST=省份,L=城市,O=组织,OU=部门,CN=域名/IP 实测在windows git bash中执行出现:name is expected to be in the format /type0=value0/type1=value1/type2=... where characters may be escaped by . This name is not in that format: 'C:/Program Files/Git/CN=localhost'problems making Certificate Request 导致只生成了server.key文件,没有生成server.csr文件, 原因暂时不详。在ubuntu中测试无问题。 解决方法,使用交互式或者采用配置文件的方式

方式二:交互式输入 使用交互式模式(交互方式设置-subj)

bash
openssl req -new -key server.key -out server.csr

然后根据提示输入:

  • Country Name (2 letter code) []: 直接回车或填 CN
  • State or Province Name []: 直接回车
  • Locality Name []: 直接回车
  • Organization Name []: 直接回车
  • Organizational Unit Name []: 直接回车
  • Common Name (eg, fully qualified host name) []: 输入 localhost
  • Email Address []: 直接回车

方式三:配置文件 创建openssl.cnf文件,内容如下:

ini
[req]
distinguished_name = req_distinguished_name
prompt = no

[req_distinguished_name]
CN = localhost

然后运行:

bash
openssl req -new -key server.key -out server.csr -config openssl.cnf

3. 用私钥签发证书

bash
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt