从本地到云端:mkcert和OpenSSL生成SSL证书及Nginx HTTPS配置全攻略

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

一把绿色的小锁,背后是复杂的加密握手;一次“不安全”的警告,可能源自一个未被信任的证书。本文将带你打通从证书生成到Nginx配置的完整链路,彻底解决HTTPS配置痛点。

一、开篇:为何我们需要关注HTTPS与证书?

在今天的互联网环境中,HTTPS已成为网站安全的标准配置,它通过SSL/TLS协议为客户端和服务器之间的通信提供加密保护,防止数据在传输过程中被窃听或篡改。

实现HTTPS的关键在于SSL证书,它就像网站的“数字身份证”,用于验证服务器身份并建立加密连接。

然而,在开发和测试环境中,获取受信任的证书往往面临两大挑战:

  1. 开发环境:需要为localhost、127.0.0.1或内网IP快速生成证书

  2. 测试环境:证书需要被团队所有成员的设备信任

  3. 成本问题:商业证书费用昂贵,免费证书有数量限制和更新麻烦
    传统上,开发人员使用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之所以受到开发者青睐,主要归功于以下几个特点:

  1. 零配置:无需任何复杂配置,几个简单命令即可完成本地HTTPS环境搭建

  2. 自动信任:自动将本地CA安装到系统和主流浏览器的信任库中,彻底告别“不安全”警告

  3. 全平台支持:完美支持macOS、Linux和Windows系统

  4. 灵活性强:支持为localhost、127.0.0.1、自定义本地域名(如*.test)以及IP地址生成证书

  5. 社区活跃:作为一个开源项目,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用户,最简单的方法是下载预编译的二进制文件:

  1. 访问OpenSSL官网或可信的第三方下载网站

  2. 选择适合你Windows系统的版本(32位或64位)

  3. 下载完成后,双击exe文件并按向导安装

  4. 安装过程中,建议将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 关键配置详解

  1. 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:启用后,服务器端的密码套件优先于客户端。

  2. SSL握手是CPU密集型操作,启用会话缓存可以显著提高性能:
    ssl_session_cache:定义SSL会话缓存的类型和大小。shared:SSL:10m 表示创建一个名为"SSL"的10MB共享缓存,可以被所有工作进程共享。
    ssl_session_timeout:指定缓存会话的超时时间。默认5分钟,这里延长到10分钟。

  3. 当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;
    ...
}
  1. 前端应用配置
    对于Vue、React等单页应用(SPA),需要特别配置以支持前端路由:
location / { 
    try_files $uri $uri/ /index.html;
}

这个配置确保所有前端路由请求都会返回index.html,由前端框架处理路由。

4.5 性能优化建议

  1. 设置工作进程数等于CPU核心数:worker_processes auto;

  2. 启用保持活动连接:keepalive_timeout 70;

  3. 启用共享会话缓存:如上文所述

  4. 调整缓冲区大小:根据实际情况调整 ssl_buffer_size,默认为16k,对于小响应可以设置为4k以减少首字节时间

在完成Nginx 配置后、保证html文件下前端程序存在、log日志不报错、ssl路径没有错误、能够成功启动,基本上就可以使用https

五、效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值