文章目录
- 自签名
- 生成命令
- 安装
- 安装证书
- 浏览器证书管理器
 
 
自签名
生成命令
使用openssl生成私钥和证书。
openssl req -x509 -newkey rsa:4096 -nodes  -days 365 -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost" -keyout cert.key -out cert.crt
# or
openssl req -x509 -newkey rsa:2048 -nodes -days 365 -sha256 -subj '/CN=localhost'  -addext "subjectAltName=DNS:localhost"   -keyout private-key.pem -out certificate.pem
- -x509:生成自签名证书
- -newkey rsa:4096:生成 4096 位 RSA 密钥
- -keyout:指定私钥输出路径
- -out:指定证书输出路径
- -days 365:证书有效期 365 天
- -nodes:不加密私钥
- -subj "/CN=localhost":设置证书主题为 localhost
- -addext "subjectAltName=DNS:localhost":配置SAN扩展
如果提示subject name格式不正确,就修改-subj "//CN=localhost",多加一个/。
subjectAltName配置很重要,浏览器需要确保访问的 URL 和证书中的CN/SAN完全匹配
配置好之后,应该会在当前目录生成cert.key和cert.crt两个文件或private-key.pem和certificate.pem两个文件。
安装
如果要让浏览器正确识别有两种方法:安装证书和浏览器证书管理器。
安装证书
双击cert.crt后点击安装证书或右击cert.crt选择安装证书。
 
 将证书存储为受信任的根证书颁发机构。
浏览器证书管理器
在浏览器中可以导入自定义证书。
 可以在浏览器设置中直接搜索证书,一般在隐私或安全下面可以找到管理证书。
 下面分别是Chrome和Edge的管理证书。
 
 
 谷歌浏览器还支持自定义导入,不需要安装证书到系统,只需要导入即可识别。
 
 也可以选择管理系统导入的证书。
 
 点击导入,选择证书文件cert.crt,选择证书存储在受信任的根证书颁发机构。
 
 安装完成后开始测试。
导入证书之前:
 
 导入证书之后:
 
 可以看到证书生效了。
使用 node 创建简单的服务器测试代码。
import express from 'express'
import https from 'node:https'
import fs from 'node:fs'
import path from 'node:path'const app = express()// 加载SSL证书,使用`cert.key, cert.crt`或者`private-key.pem, certificate.pem`
const sslOptions = {key: fs.readFileSync(path.resolve('D:/OpenSSL/ca', 'cert.key')),cert: fs.readFileSync(path.resolve('D:/OpenSSL/ca', 'cert.crt'))
}app.use(express.static(import.meta.dirname))// 创建HTTPS服务器
const server = https.createServer(sslOptions, app)server.listen(3000, () => {console.log('HTTPS 服务启动成功,端口: 3000')
})
如果运行报错:ERR_OSSL_X509_KEY_VALUES_MISMATCH,这表明证书秘钥不匹配。
首先确认证书和秘钥是否匹配:
openssl x509 -noout -modulus -in cert.crt | openssl md5 && \
openssl rsa -noout -modulus -in cert.key | openssl md5
如果哈希值不匹配需要重新生成证书和秘钥。如果问题还存在,那可能需要完全删除旧证书并重新生成。