一把绿色的小锁,背后是复杂的加密握手;一次“不安全”的警告,可能源自一个未被信任的证书。本文将带你打通从证书生成到Nginx配置的完整链路,彻底解决HTTPS配置痛点。
一、开篇:为何我们需要关注HTTPS与证书?
在今天的互联网环境中,HTTPS已成为网站安全的标准配置,它通过SSL/TLS协议为客户端和服务器之间的通信提供加密保护,防止数据在传输过程中被窃听或篡改。
实现HTTPS的关键在于SSL证书,它就像网站的“数字身份证”,用于验证服务器身份并建立加密连接。
然而,在开发和测试环境中,获取受信任的证书往往面临两大挑战:
-
开发环境:需要为localhost、127.0.0.1或内网IP快速生成证书
-
测试环境:证书需要被团队所有成员的设备信任
-
成本问题:商业证书费用昂贵,免费证书有数量限制和更新麻烦
传统上,开发人员使用OpenSSL生成自签名证书,但过程繁琐且生成的证书不被浏览器默认信任,每次访问都会出现安全警告。
这引出了本文要介绍的两种解决方案:mkcert——简单高效的本地信任证书生成工具,以及OpenSSL——功能强大的加密工具包。
我们将重点探讨mkcert的使用方法和实战技巧,同时简要介绍OpenSSL的基础操作,最终实现从证书生成到Nginx HTTPS服务器配置的完整流程。
二、mkcert:简单高效的本地SSL证书解决方案
mkcert是一个零配置工具,专门用于制作本地信任的开发证书。它的核心优势在于自动创建并安装本地证书颁发机构(CA)到系统信任库中,然后用这个CA签发受本地信任的证书。
这意味着你可以在本地开发环境中使用 https://localhost,浏览器会显示安全的绿色小锁,而不是烦人的安全警告。
mkcert在GitHub上获得了超过55.1K Star,证明了它是一款经过社区检验的优秀工具。它的设计哲学是“简单至上”,完全规避了传统SSL证书生成过程中的复杂配置。
2.1 什么是mkcert?
mkcert是一个零配置工具,专门用于制作本地信任的开发证书。它的核心优势在于自动创建并安装本地证书颁发机构(CA)到系统信任库中,然后用这个CA签发受本地信任的证书。
这意味着你可以在本地开发环境中使用 https://localhost,浏览器会显示安全的绿色小锁,而不是烦人的安全警告。
mkcert在GitHub上获得了超过55.1K Star,证明了它是一款经过社区检验的优秀工具。它的设计哲学是“简单至上”,完全规避了传统SSL证书生成过程中的复杂配置。
2.2 mkcert的核心特性
mkcert之所以受到开发者青睐,主要归功于以下几个特点:
-
零配置:无需任何复杂配置,几个简单命令即可完成本地HTTPS环境搭建
-
自动信任:自动将本地CA安装到系统和主流浏览器的信任库中,彻底告别“不安全”警告
-
全平台支持:完美支持macOS、Linux和Windows系统
-
灵活性强:支持为localhost、127.0.0.1、自定义本地域名(如*.test)以及IP地址生成证书
-
社区活跃:作为一个开源项目,mkcert有持续的维护和更新
2.3 mkcert下载与安装
mkcert提供了多种安装方式,你可以根据自己的操作系统选择最合适的方法:
官方下载地址
mkcert的官方GitHub仓库发布页面提供了各个平台的预编译版本:mkcert

Linux系统的安装需要先安装一些依赖:
# Debian/Ubuntu系统
sudo apt install libnss3-tools
# Red Hat/CentOS系统
sudo yum install nss-tools
# Arch Linux系统
sudo pacman -S nss
# 然后通过Homebrew或直接下载二进制文件安装mkcert:
# 使用Homebrew on Linux
brew install mkcert
# 或下载二进制文件
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
chmod +x mkcert-v1.4.4-linux-amd64
sudo mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert
2.4 mkcert基本使用详解
1.安装本地CA
安装mkcert后,第一步是安装本地证书颁发机构(CA):mkcert -install
这个命令会在系统中创建一个本地CA,并将其添加到系统的受信任根证书存储中。在Windows系统中,CA文件通常位于 C:\Users<用户名>\AppData\Local\mkcert 目录下,包含两个文件:rootCA.pem(证书)和 rootCA-key.pem(私钥)
你可以使用以下命令查看CA证书的存放路径:mkcert -CAROOT
2.生成证书
安装本地CA后,你就可以为你的项目生成证书了。基本语法如下:
mkcert 域名或IP地址 [更多域名或IP地址...]
例如,为本地开发环境生成证书:
mkcert localhost 127.0.0.1 ::1
这将生成两个文件:localhost+2.pem(证书文件)和 localhost+2-key.pem(私钥文件)。
你还可以为特定IP地址生成证书,这在需要从局域网其他设备访问时特别有用:
mkcert localhost 127.0.0.1 本机ip ::1
3.完整操作流程
以下是在Windows环境下使用mkcert生成证书的完整示例,基于你提供的操作内容:
# 进入SSL目录
cd D:\Java\ssl
# 安装本地CA(这会让系统信任mkcert生成的证书)
mkcert -install
# 为您的域名和IP生成证书
mkcert localhost 127.0.0.1 192.168.1.168 ::1
# 这会生成两个文件:localhost+3.pem 和 localhost+3-key.pem
# 重命名它们以匹配你的Nginx配置
copy localhost+3.pem server.crt
copy localhost+3-key.pem server.key
重要提示:在云服务器上使用mkcert生成的证书后,虽然能访问,但浏览器可能显示HTTPS"不安全"。这通常是因为云服务器上的服务,被未安装你本地CA证书的设备访问了。
你的本地电脑:信任这个本地CA签发的所有证书,所以访问localhost或127.0.0.1时,连接是安全的。
云服务器/其他设备:它们没有安装也不信任你电脑上的这个本地CA。当它们收到一个由这个"未知机构"签发的证书时,浏览器就会果断地标记为"不安全"。
所以,这种情况是完全正常的。mkcert官网也明确说明,它是一个用于制作本地信任的开发证书的工具,不适合生产环境使用。
三、OpenSSL:传统而强大的SSL证书生成工具
3.1 OpenSSL简介
OpenSSL是一个功能强大的开源加密工具包,提供了丰富的密码算法、密钥和证书封装管理功能及SSL协议实现。它是一个跨平台工具,支持Unix/Linux、Windows、Mac OS等多种操作系统。
OpenSSL项目始于1998年,已经成为了互联网安全基础设施的重要组成部分。许多软件的安全部分都使用了OpenSSL的库,如Apache服务器、Linux安全模块等。
虽然mkcert在简单性和易用性方面更胜一筹,但OpenSSL仍然是功能最全面、最灵活的SSL工具,特别适合需要精细控制证书生成过程的高级场景。
3.2 OpenSSL下载与安装
OpenSSL的官方网站是 openssl,你可以在这里找到最新的源代码和文档。
下载地址:OpenSSL

下载后,根据需要 点击【Next】即可

对于Windows用户,最简单的方法是下载预编译的二进制文件:
-
访问OpenSSL官网或可信的第三方下载网站
-
选择适合你Windows系统的版本(32位或64位)
-
下载完成后,双击exe文件并按向导安装
-
安装过程中,建议将OpenSSL添加到系统PATH环境变量中
Linux系统安装
大多数Linux发行版都可以通过包管理器安装OpenSSL:
# Debian/Ubuntu系统
sudo apt update
sudo apt install openssl
# Red Hat/CentOS/Fedora系统
sudo yum install openssl
# 验证安装
openssl version
#如果需要最新版本或特定配置,也可以从源码编译安装
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -xzvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g/
./config
make
sudo make install
3.3 OpenSSL基本使用
创建存储目录
建议创建一个专门的文件夹来存放证书文件,方便管理:
mkdir ssl
cd ssl
生成私钥
使用以下命令生成一个2048位的RSA私钥
openssl genrsa -out server.key 2048
如果需要加密私钥(增加安全性但使用不便):
openssl genrsa -des3 -passout pass:你的密码 -out server.pass.key 2048
openssl rsa -passin pass:你的密码 -in server.pass.key -out server.key
rm server.pass.key
生成证书签名请求(CSR)
使用私钥创建CSR文件,系统会提示你输入一些信息:
openssl req -new -key server.key -out server.csr
填写CSR信息时,需要特别注意以下几点:
Country Name (2 letter code) [AU]: CN ← 只填2个字母!
State or Province Name (full name) [Some-State]: Beijing
Locality Name (eg, city) []: Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]: MyCompany
Organizational Unit Name (eg, section) []: IT
Common Name (e.g. server FQDN or YOUR name) []: ← 这里填IP!
Email Address []: (直接回车跳过)
A challenge password []: ← 直接按回车
An optional company name []: ← 直接按回车
注意:Common Name(通用名称)非常重要,它必须与你要保护的域名或IP地址完全一致。如果证书的CN与实际访问的地址不匹配,浏览器会显示证书错误。
生成自签名证书
最后,使用私钥和CSR文件生成有效期为365天的自签名证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
现在,你的ssl目录下应该有了 server.key(私钥)和 server.crt(证书)这两个关键文件。
3.4 简化的一键生成方法
为了方便使用,你可以创建一个批处理脚本来自动完成上述过程。以下是根据你提供的脚本内容整理的OpenSSL证书生成脚本:
@echo off
chcp 65001 >nul
echo ========================================
echo 重新生成HTTPS SSL证书
echo ========================================
echo.
set OPENSSL_PATH=openssl
set SSL_DIR=D:\Java\ssl
echo [1/4] 备份旧证书...
if exist "%SSL_DIR%\server.crt" (
copy "%SSL_DIR%\server.crt" "%SSL_DIR%\server.crt.backup_%date:~0,4%%date:~5,2%%date:~8,2%"
)
if exist "%SSL_DIR%\server.key" (
copy "%SSL_DIR%\server.key" "%SSL_DIR%\server.key.backup_%date:~0,4%%date:~5,2%%date:~8,2%"
)
echo [2/4] 生成新的RSA私钥...
%OPENSSL_PATH% genrsa -out "%SSL_DIR%\server.key" 2048
if %errorlevel% neq 0 (
echo 错误: 生成私钥失败
pause
exit /b 1
)
echo [3/4] 使用更简单的方法生成自签名证书...
%OPENSSL_PATH% req -new -x509 -key "%SSL_DIR%\server.key" -out "%SSL_DIR%\server.crt" -days 365 -subj "/C=CN/ST=Beijing/L=Beijing/O=Dev/OU=IT/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1,IP:本机ip"
if %errorlevel% neq 0 (
echo 错误: 生成证书失败
pause
exit /b 1
)
echo [4/4] 验证新证书...
%OPENSSL_PATH% x509 -in "%SSL_DIR%\server.crt" -text -noout | find "Subject:"
if %errorlevel% neq 0 (
echo 警告: 证书验证可能有问题
)
echo.
echo ========================================
echo 证书重新生成完成!
echo ========================================
echo.
echo 请执行以下步骤:
echo 1. 将 server.crt 导入到 Windows 受信任的根证书颁发机构
echo 2. 重新启动 Nginx
echo 3. 使用 https://localhost:端口 访问
echo.
pause
这个脚本简化了OpenSSL证书生成过程,自动备份旧证书、生成新证书,并添加了Subject Alternative Name(SAN)扩展,支持多个主机名和IP地址。
四、Nginx HTTPS配置详解
4.1 Nginx SSL模块基础
Nginx通过 ngx_http_ssl_module 模块提供HTTPS支持。该模块默认情况下未构建,需要在编译Nginx时使用 --with-http_ssl_module 配置参数启用
4.2 基本HTTPS配置
最基本的Nginx HTTPS配置只需要指定监听端口、证书和私钥文件的位置:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
...
}
注意:在Nginx 1.15.0版本中,ssl on 指令已被弃用,推荐使用 listen 指令的 ssl 参数
4.3 完整的Nginx HTTPS配置示例
以下是基于你提供的Nginx配置内容,结合最佳实践整理的完整HTTPS配置:
# 程序配置 - HTTPS 配置
server {
# 监听8080端口并启用SSL
listen 8080 ssl;
server_name localhost;
# SSL证书配置 - 修复路径问题
ssl_certificate D:/java/ssl/server.crt;
ssl_certificate_key D:/java/ssl/server.key;
# SSL协议配置
ssl_protocols TLSv1.2 TLSv1.3; # 只启用安全的TLS版本
ssl_ciphers ECDHE-RSA-AES168-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 日志配置
if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
set $tttt $1;
}
access_log logs/yyx/hospital/access-$tttt.log main;
# 根目录配置
root html/yyx/hospital/dist;
index index.html index.htm;
# API代理配置
location ~* ^/(api|auth) {
proxy_pass http://127.0.0.1:8081;
# 代理头信息
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# 超时设置
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
# 文件上传大小
client_max_body_size 1000m;
# 缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
# 安全设置
location ~* \.(php|asp|aspx|jsp|sql|log|jar|war|sh|cmd|bat|py)$ {
return 444;
}
# 静态资源配置
location ~* \.(gif|jpg|png|js|css|otf|eot|svg|ttf|woff|woff2|ico|txt)$ {
log_not_found off;
access_log off;
# 添加缓存控制
expires 1y;
add_header Cache-Control "public, immutable";
}
# 主location - SPA路由支持
location / {
try_files $uri $uri/ /index.html;
}
# 错误页面
error_page 404 /404.html;
location = /404.html {
root html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4.4 关键配置详解
-
SSL协议与密码套件
ssl_protocols:指定启用的SSL/TLS协议版本。建议只启用TLSv1.2和TLSv1.3,禁用不安全的SSLv2、SSLv3和TLSv1.0、TLSv1.1。
ssl_ciphers:指定启用的加密套件。示例配置使用了较安全的ECDHE-RSA-AES168-GCM-SHA256等套件。
ssl_prefer_server_ciphers:启用后,服务器端的密码套件优先于客户端。 -
SSL握手是CPU密集型操作,启用会话缓存可以显著提高性能:
ssl_session_cache:定义SSL会话缓存的类型和大小。shared:SSL:10m 表示创建一个名为"SSL"的10MB共享缓存,可以被所有工作进程共享。
ssl_session_timeout:指定缓存会话的超时时间。默认5分钟,这里延长到10分钟。 -
当Nginx作为反向代理时,正确的代理头设置非常重要:
X-Forwarded-Proto:告诉后端服务器客户端使用的是HTTP还是HTTPS
X-Forwarded-For:传递客户端的真实IP地址
Host:传递原始请求的主机头
代理配置
注意一个情况,就是使用在云端的时候,后台接口使用的是http方式请求,前端使用的是https的是回找不到后台的,浏览器会阻止HTTPS页面向发送HTTP请求,不使用代理,就要把后台接口也配置成为https的方式,才能够保证请求到后台接口代码。
location ~* ^/(api|auth)/ {
proxy_pass http://127.0.0.1:10000;
# 代理头信息
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
...
}
- 前端应用配置
对于Vue、React等单页应用(SPA),需要特别配置以支持前端路由:
location / {
try_files $uri $uri/ /index.html;
}
这个配置确保所有前端路由请求都会返回index.html,由前端框架处理路由。
4.5 性能优化建议
-
设置工作进程数等于CPU核心数:worker_processes auto;
-
启用保持活动连接:keepalive_timeout 70;
-
启用共享会话缓存:如上文所述
-
调整缓冲区大小:根据实际情况调整 ssl_buffer_size,默认为16k,对于小响应可以设置为4k以减少首字节时间
在完成Nginx 配置后、保证html文件下前端程序存在、log日志不报错、ssl路径没有错误、能够成功启动,基本上就可以使用https
五、效果展示



本地与云端HTTPS证书配置指南

1386

被折叠的 条评论
为什么被折叠?



