当前位置: 首页 > news >正文

使用openssl为localhost创建自签名

文章目录

  • 自签名
    • 生成命令
    • 安装
      • 安装证书
      • 浏览器证书管理器

自签名

生成命令

使用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.keycert.crt两个文件或private-key.pemcertificate.pem两个文件。

安装

如果要让浏览器正确识别有两种方法:安装证书浏览器证书管理器

安装证书

双击cert.crt后点击安装证书或右击cert.crt选择安装证书。
安装证书
将证书存储为受信任的根证书颁发机构

浏览器证书管理器

在浏览器中可以导入自定义证书。
可以在浏览器设置中直接搜索证书,一般在隐私安全下面可以找到管理证书
下面分别是ChromeEdge的管理证书。
管理证书
管理证书
谷歌浏览器还支持自定义导入,不需要安装证书到系统,只需要导入即可识别。
自定义导入
也可以选择管理系统导入的证书。
管理证书
点击导入,选择证书文件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

如果哈希值不匹配需要重新生成证书和秘钥。如果问题还存在,那可能需要完全删除旧证书并重新生成。

相关文章:

  • 大模型AI的运行逻辑与准确性保障机制——以DeepSeek与豆包为例
  • K8s使用LIRA插件更新安全组交互流程
  • MMIO、IOMAP 和 IOMMU 总结
  • 一文了解相位阵列天线中的真时延
  • Vibracostic EDI 需求分析
  • 单例模式的使用场景 以及 饿汉式写法(智能指针)
  • LangChain、LlamaIndex 和 ChatGPT 的详细对比分析及总结表格
  • 【AI News | 20250421】每日AI进展
  • 如何将Qt程序打包成应用程序?
  • visionpro案例: 轴承缺珠检测
  • Java学习手册:Cookie 与 Session 管理
  • HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?
  • web原生API AbortController网络请求取消方法使用介绍:防止按钮重复点击提交得最佳方案
  • 总结设计测试用例的万能公式
  • 基于LLM的响应式流式处理实践:提升用户体验的关键技术
  • 算法 | 鲸鱼优化算法(WOA)原理,公式,应用,算法改进研究综述,完整matlab代码
  • 测试用例书写规范详解:构建高效测试体系的基础
  • STM32H5开发陀螺仪LSM6DSV16X(3)----SFLP获取四元数
  • spring boot使用Scheduling实现动态增删启停定时任务
  • 8051单片机所有Keil C51汇编伪指令和C语言关键字大全
  • 世界读书日丨上图东馆开启残疾人无障碍文化服务
  • 普京签署有关批准俄罗斯与伊朗全面战略伙伴关系条约的联邦法令
  • 商务部:支持“来数加工”等新业态新模式,发展游戏出海业务
  • 上海体彩中心2025年“五一”假期体彩销售及兑奖事宜通告
  • 第一集|《蛮好的人生》蛮好,《悬镜》挺玄
  • 87岁老人花3万多做“血液净化”延年益寿?医院“张主任”:我那是善意的欺骗