一、引言:为什么需要自签名证书?
在日常开发和测试中,我们经常会遇到这些场景:
- 本地开发:正在开发一个新功能,但某些浏览器 api(如 geolocation、service worker)强制要求 https 环境。
- 内网部署:在公司内部网络部署了一个管理后台或 api 服务,不需要公网访问,但希望有基本的加密。
- 安全测试:需要模拟一个 https 环境来测试应用的安全策略。
向 ca(证书颁发机构)申请正式证书?大可不必!对于这些非生产、非公网的场景,自签名证书是完美的解决方案。它能让你快速启用 https,绕过浏览器的“不安全”警告(需手动信任),极大地提升开发和测试效率。
💡 核心价值:
掌握 nginx 自签名证书配置,是高效进行本地开发和内网测试的必备技能!
二、准备工作:安装 openssl
自签名证书的生成依赖于 openssl 工具包。大多数 linux 发行版默认已安装,如果没有,请先安装:
# ubuntu/debian sudo apt update && sudo apt install -y openssl # centos/rhel/rocky linux sudo yum install -y openssl
你可以通过 openssl version 命令来验证是否安装成功。
三、实战:生成自签名证书
我们将创建一个有效期为 365 天的自签名证书。
步骤 1:创建证书存储目录(可选但推荐)
为了便于管理,我们创建一个专门的目录来存放证书文件。
sudo mkdir -p /etc/nginx/ssl cd /etc/nginx/ssl
步骤 2:使用 openssl 一键生成证书和私钥
执行以下命令,它会同时生成私钥(.key)和证书(.crt)文件。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx-selfsigned.key \
-out /etc/nginx/ssl/nginx-selfsigned.crt命令参数详解
- -x509: 创建一个自签名的证书,而不是证书签名请求(csr)。
- -nodes: 不对私钥进行加密(no des)。如果加密了,每次 nginx 启动都需要输入密码,不适合自动化。
- -days 365: 证书的有效期为 365 天。
- -newkey rsa:2048: 生成一个新的 2048 位 rsa 私钥。
- -keyout: 指定私钥文件的输出路径。
- -out: 指定证书文件的输出路径。
步骤 3:填写证书信息
执行命令后,openssl 会提示你输入一些信息。这些信息会被嵌入到证书中。
country name (2 letter code) [xx]:cn # 国家代码,中国填 cn state or province name (full name) []:beijing # 省/州 locality name (eg, city) [default city]:beijing # 城市 organization name (eg, company) [default company ltd]:mycompany # 组织/公司名 organizational unit name (eg, section) []:it dept # 部门 common name (eg, your name or your server's hostname) []:localhost # 最重要!通常是你的域名或服务器ip email address []:admin@mycompany.com # 邮箱(可选)
关键点:common name (cn) 字段非常重要。如果你是通过 https://localhost 访问,这里就填 localhost。如果是通过 ip https://192.168.1.100 访问,则填 192.168.1.100。否则浏览器会报“域名不匹配”的错误。
四、配置 nginx 启用 https
现在,我们有了证书文件,接下来就是让 nginx 使用它们。
修改 nginx 配置文件
编辑你的站点配置文件(例如 /etc/nginx/sites-available/default 或 /etc/nginx/conf.d/your-site.conf):
server {
# 监听标准的 https 端口,并启用 ssl 和 http/2
listen 443 ssl http2;
server_name localhost; # 这里要和证书的 common name 一致
# 指定证书和私钥的路径
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
# (可选)基础安全加固
ssl_protocols tlsv1.2 tlsv1.3;
ssl_ciphers high:!anull:!md5;
# 网站根目录
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# (最佳实践)将 http 请求重定向到 https
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}重载 nginx 配置
保存文件后,检查配置语法并重载 nginx:
# 检查配置文件语法 sudo nginx -t # 如果语法正确,重载配置 sudo systemctl reload nginx
五、信任你的自签名证书(消除浏览器警告)
当你第一次访问 https://localhost 时,浏览器会显示一个醒目的“您的连接不是私密连接”或“此网站的安全证书存在问题”的警告。这是因为你的证书不是由受信任的 ca 签发的。
解决方法:手动将你的自签名证书添加到操作系统的“受信任的根证书颁发机构”中。
在 windows 上
- 将
nginx-selfsigned.crt文件复制到你的 windows 机器上。 - 双击该文件 -> “安装证书” -> “本地计算机” -> “将所有证书放入下列存储” -> “受信任的根证书颁发机构” -> 完成。
在 macos 上
- 将
.crt文件拖入“钥匙串访问”应用。 - 在“系统”钥匙串中找到该证书,双击打开。
- 展开“信任”部分,将“使用此证书时”设置为“始终信任”。
在 linux (ubuntu) 上
# 复制证书到系统目录 sudo cp /etc/nginx/ssl/nginx-selfsigned.crt /usr/local/share/ca-certificates/ # 更新证书库 sudo update-ca-certificates
完成信任操作后,刷新浏览器页面,那个烦人的警告就会消失,地址栏会出现灰色的锁图标,表示连接已加密。
六、结语
到此这篇关于nginx自签名证书的实现的文章就介绍到这了,更多相关nginx自签名证书内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论