使用 OpenSSL 自签 SSL 证书,并配置到 Nginx

一、这篇教程要做什么?

我们要自己生成一套 HTTPS 证书,然后配置到 Nginx,让网站可以通过:

复制代码
https://你的域名或IP

访问。

这种证书叫 自签 SSL 证书

二、先了解几个文件

在生成证书时,经常会看到这些文件:

文件 含义
.key 私钥,自己保存,不能泄露
.csr 证书请求文件,由私钥生成
.crt 证书文件,用来配置 HTTPS

简单理解:

复制代码
私钥 key = 自己生成的钥匙
复制代码
CSR = 用私钥生成的申请表
复制代码
CRT = 最终给 Nginx 使用的证书

三、准备工作

你需要先安装:

复制代码
OpenSSL
复制代码
Nginx

如果你只是本地测试,可以直接继续。

如果是 Linux 上的 Nginx,需要确认 Nginx 编译时支持 SSL 模块:

复制代码
--with-http_ssl_module

四、生成 SSL 证书

建议先新建一个目录保存证书文件,例如:

复制代码
mkdir ssl
复制代码
cd ssl

五、生成带密码的私钥

执行:

复制代码
openssl genrsa -des3-out server.pass.key 2048

执行后会要求输入两次密码。

示例密码:

复制代码
12345678

这个密码可以自己设置,但要记住,下一步会用到。

生成后会得到:

复制代码
server.pass.key

六、生成不带密码的私钥

Nginx 启动时如果私钥带密码,会比较麻烦,所以通常再生成一个不带密码的私钥。

执行:

复制代码
openssl rsa -in server.pass.key -out server.key

这一步会让你输入刚才设置的密码。

生成后会得到:

复制代码
server.key

这个文件就是后面 Nginx 要用的私钥。

七、生成 CSR 证书请求文件

执行:

复制代码
openssl req -new-key server.key -out server.csr -subj"/C=CN/ST=Beijing/L=Beijing/O=dev/OU=dev/CN=127.0.0.1"

生成后会得到:

复制代码
server.csr

这里重点看最后的:

复制代码
CN=127.0.0.1

如果你是本地测试,可以写:

复制代码
127.0.0.1

如果你是给域名用,比如:

复制代码
example.com

那就改成:

复制代码
/C=CN/ST=Beijing/L=Beijing/O=dev/OU=dev/CN=example.com

八、生成证书 CRT 文件

执行:

复制代码
openssl x509 -req-days365-in server.csr -signkey server.key -out server.crt

其中:

复制代码
-days 365

表示证书有效期是 365 天。

生成后会得到:

复制代码
server.crt

到这里,核心证书文件已经生成好了。

九、查看证书信息

可以执行:

复制代码
openssl x509 -in server.crt -noout-text

这个命令可以查看证书详情。

十、最终会得到哪些文件?

你会看到类似这些文件:

复制代码
server.pass.key
复制代码
server.key
复制代码
server.csr
复制代码
server.crt

Nginx 主要用这两个:

复制代码
server.crt
复制代码
server.key

十一、配置 Nginx HTTPS

把下面两个文件复制到 Nginx 的 SSL 目录中:

复制代码
server.crt
复制代码
server.key

例如放到:

复制代码
D:/dev/nginx/ssl/

然后修改 Nginx 配置:

复制代码
server {
复制代码
    listen443 ssl;
复制代码
    ssl_certificate"D:/dev/nginx/ssl/server.crt";
复制代码
    ssl_certificate_key"D:/dev/nginx/ssl/server.key";
复制代码
    location / {
复制代码
    }
复制代码
    error_page 404 /404.html;
复制代码
    location = /40x.html {
复制代码
    }
复制代码
    error_page 500502 503504 /50x.html;
复制代码
    location = /50x.html {
复制代码
    }
复制代码
}

如果你是 Linux,路径可能类似:

复制代码
ssl_certificate /etc/nginx/ssl/server.crt;
复制代码
ssl_certificate_key /etc/nginx/ssl/server.key;

十二、重启 Nginx

修改配置后,先检查配置是否正确:

复制代码
nginx -t

如果没有报错,重启 Nginx:

复制代码
nginx -s reload

或者 Linux 上:

复制代码
systemctl reload nginx

十三、访问测试

打开浏览器访问:

复制代码
https://127.0.0.1

或者:

复制代码
https://你的域名

如果浏览器提示"不安全"或"证书不受信任",这是正常的。

因为这是自签证书,不是正规 CA 机构签发的证书。

十四、字段说明

生成 CSR 时有这些字段:

字段 含义 示例
C 国家 CN
ST 省份 Beijing
L 城市 Beijing
O 组织名称 dev
OU 组织部门 dev
CN 域名或 IP 127.0.0.1

最重要的是:

复制代码
CN

它一般填写你的域名或 IP。

十五、在线生成 CSR 工具

也可以使用在线工具生成 CSR:

复制代码
https://myssl.com/csr_create.html

十六、注意事项

  1. server.key 是私钥,不要泄露。

  2. 自签证书适合本地测试、内网环境。

  3. 如果是公网正式网站,建议使用正规 SSL 证书。

  4. 浏览器不信任自签证书是正常现象。

  5. Nginx 必须支持 SSL 模块才能配置 HTTPS。

十七、完整命令汇总

复制代码
openssl genrsa -des3-out server.pass.key 2048
复制代码
openssl rsa -in server.pass.key -out server.key
复制代码
openssl req -new-key server.key -out server.csr -subj"/C=CN/ST=Beijing/L=Beijing/O=dev/OU=dev/CN=127.0.0.1"
复制代码
openssl x509 -req-days365-in server.csr -signkey server.key -out server.crt
复制代码
openssl x509 -in server.crt -noout-text