openssl 正确生成v3带SAN的证书
初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
目录
为什么一定要v3和SAN
如何生成v3和SAN
如何确认是v3带SAN的证书
完整脚本参考
为什么一定要v3和SAN
为什么要v3版本呢?因为v3才能包含扩展。
为什么一定要包含扩展呢?因为没有扩展就没有SAN。
为什么一定要SAN呢?因为没有SAN把域名和证书绑定在一起,新版浏览器永远认为不安全。
如果查看证书详情可能会看到如下信息:
net::ERR_CERT_COMMON_NAME_INVALID此服务器无法证明它是 www.test.com;它的安全证书不指定使用者可选名称。这可能是由错误配置或者有攻击者截获你的连接而导致的。
你可能以为这个“common name”不就是CN吗?或许以前如此,现在这个错误实际上指的是SAN,CN已经被废弃了。
如果证书正确地包含了SAN而访问的域名与SAN不一致,仍然会提示证书问题:

注意证书的“扩展部分”,对于v1证书是没有这部分的。“证书使用者可选名称”就是SAN,名义上是可选的,事实上是必选的。
上图中由于SAN只包含两个域名,而访问是用IP地址的,因此不一致,所以浏览器认为服务器证书无效。
改用域名访问(我已经修改了hosts文件):
这下浏览器没话说了。
如何生成v3和SAN
openssl默认情况下生成的证书是v1的,要生成v3证书需要在命令行指示使用配置文件的哪个节。
例如“-extfile $OPEN_SSL_CONFIG_FILE -extensions v3_ca”表示使用$OPEN_SSL_CONFIG_FILE的v3_ca节。
$OPEN_SSL_CONFIG_FILE代表openssl.cnf文件,可以搜索一下,查看文件,里面应该有v3_ca节,这一节的配置用来生成CA证书。因为这个文件不同安装不一样,而且后面要用好几次,所以设置成变量比较方便。
v3_req节用来生成普通证书。
为了生成SAN需要一个独立的节,内容为subjectAltName=域名列表,通过这个把证书和域名绑定在一起(测试的时候可以通过修改hosts文件来把域名解析到自己的IP地址)。最后的完整脚本参考里面用了一点技巧直接在命令行里完成了。
如何确认是v3带SAN的证书
查看证书文件“openssl x509 -text -noout -in server.cer”:
$ openssl x509 -text -noout -in server.cer
Certificate:Data:Version: 3 (0x2)======================这是版本,3表示是v3,1表示是v1Serial Number:35:20:b5:ef:38:32:33:b1:48:30:c5:6d:b0:e5:66:c0:93:3c:2a:24Signature Algorithm: sha256WithRSAEncryptionIssuer: C = CN, ST = SD, L = JN, O = QDZY, OU = www.test.com, CN = CA, emailAddress = admin@test.comValidityNot Before: Jan 17 09:19:43 2025 GMTNot After : Dec 24 09:19:43 2124 GMTSubject: C = CN, ST = SD, L = JN, O = QDZY, OU = www.test.com, CN = SERVER, emailAddress = admin@test.comSubject Public Key Info:Public Key Algorithm: rsaEncryptionRSA Public-Key: (2048 bit)Modulus:00:9f:eb:d2:fe:9b:3c:c5:81:b6:5d:ca:5c:02:73:e4:b4:64:8b:7c:0e:be:de:6d:29:6a:5a:47:01:27:(略去)Exponent: 65537 (0x10001)X509v3 extensions:X509v3 Subject Alternative Name:==========================这就是SANDNS:www.test.com, DNS:www.test2.comSignature Algorithm: sha256WithRSAEncryption13:4d:64:21:b6:16:11:62:94:2f:c9:69:df:5c:a1:9a:a4:1e:de:ba:72:e9:12:5b:85:cc:37:65:27:a0:39:79:ca:5c:00:f9:(略去)
完整脚本参考
#请求证书 openssl.cnf位置可以通过“openssl version -a”查看(OPENSSLDIR) 必须有SAN,否则新版浏览器不认
#为了生成v3证书需要通过-extfile传入配置文件,-extensions指示使用配置文件的哪个节
#注意SAN配置的是域名,可能需要修改hosts文件以便通过域名访问本地服务
export OPEN_SSL_CONFIG_FILE=/usr/lib/ssl/openssl.cnf #根据实际情况修改这个环境变量#创建CA证书私钥
openssl genrsa -aes256 -out ca.key 2048
#请求证书
openssl req -new -sha256 -key ca.key -out ca.csr -subj "/C=CN/ST=SD/L=JN/O=QDZY/OU=www.test.com/CN=CA/emailAddress=admin@test.com"
#自签署证书
openssl x509 -req -days 36500 -sha256 -extfile $OPEN_SSL_CONFIG_FILE -extensions v3_ca -signkey ca.key -in ca.csr -out ca.cer
openssl x509 -text -noout -in ca.cer#创建服务器私钥
openssl genrsa -aes256 -out server.key 2048
#请求证书
openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CN/ST=SD/L=JN/O=QDZY/OU=www.test.com/CN=SERVER/emailAddress=admin@test.com" \-reqexts SAN \-config <(cat $OPEN_SSL_CONFIG_FILE <(printf "[SAN]\nsubjectAltName=DNS:www.test.com,DNS:www.test2.com\n"))
#查看请求
openssl req -noout -text -subject -in server.csr#使用CA证书签署服务器证书
openssl x509 -req -days 36500 -sha256 -extensions v3_req -CA ca.cer -CAkey ca.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.cer \-extensions SAN \-extfile <(cat $OPEN_SSL_CONFIG_FILE \<(printf "[SAN]\nsubjectAltName=DNS:www.test.com,DNS:www.test2.com\n"))
#查看证书
openssl x509 -text -noout -in server.cer#生成客户端私钥
openssl genrsa -aes256 -out client.key 2048
#申请证书
openssl req -new -sha256 -key client.key -out client.csr -subj "/C=CN/ST=SD/L=JN/O=QDZY/OU=www.test.com/CN=CLIENT/emailAddress=admin@test.com"
#使用CA证书签署客户端证书
openssl x509 -req -days 36500 -sha256 -extfile $OPEN_SSL_CONFIG_FILE -extensions v3_req -CA ca.cer -CAkey ca.key -CAserial ca.srl -CAcreateserial -in client.csr -out client.cer
openssl x509 -text -noout -in client.cer#生成用于windows的pfx证书(pem格式无法导入私钥 注意有些pem里面只有一个证书或key,等价于这里的.key和.cer)
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.cer#去掉私钥密码
openssl rsa -in ca.key -out ca.key
openssl rsa -in server.key -out server.key
openssl rsa -in client.key -out client.key#如果提示Can't load /home/user/.rnd into RNG
openssl rand -writerand /home/user/.rnd
(这里是文档结束)
相关文章:
openssl 正确生成v3带SAN的证书
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Golang Gin系列-5:数据模型和数据库
在这篇Gin教程的博客中,我们将探索如何将模型和数据库与Gin框架无缝集成,使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践,你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性…...
比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 工厂方法模式(Factory Method Pattern)工厂方法模式(Factory Method Pattern)概述工厂方法模式(Factory Method Pattern)结构图工厂方法模式&…...
分布式搜索引擎02
1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,…...
阿里云安装mikrotik7配置内网互通
阿里云近期推出了200M不限量机器,对于没有公网接入的中小企业可以借助这个机器对多地分支机构进行内网互通。目前已经有很多机构用这个搞跨云k8s,跨云集群了。 mikrotik作为一个商用的软件,操作性比一些开源的软件好用不少。 本文使用的网段为172.16.1…...
Docker网段和服务器ip冲突导致无法访问网络的解决方法
若宿主机所在网络的网段为172.[17-31].xx.xx,则会与Docker本身内部网络间出现冲突,此时需要重新配置Docker默认地址池 一:查看docker的默认网段 route 二:修改docker的默认网段 etc/docker/daemon.json文件增加修改网段信息 {…...
Kubernetes 集群中安装和配置 Kubernetes Dashboard
前言 上篇成功部署Kubernetes集群后,为了方便管理和监控集群资源,安装Kubernetes Dashboard显得尤为重要。Kubernetes Dashboard 是一个通用的、基于 Web 的 UI,旨在让用户轻松地部署容器化应用到 Kubernetes 集群,并对这些应用进…...
Android开发之Spinner
Android开发之Spinner 1. 概述2. Spinner3. 适配器3.1 ArrayAdapter3.2 SimpleAdapter 1. 概述 Android开发学习笔记。学习下拉框控件Spinner和适配器(数组适配器ArrayAdapter、简单适配器SimpleAdapter)的使用。 2. Spinner 下拉框控件,用…...
【c++继承篇】--继承之道:在C++的世界中编织血脉与传承
目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序:**5.2**析构函数调用顺序:**5.3调…...
分布式系统通信解决方案:Netty 与 Protobuf 高效应用
分布式系统通信解决方案:Netty 与 Protobuf 高效应用 一、引言 在现代网络编程中,数据的编解码是系统设计的一个核心问题,特别是在高并发和低延迟的应用场景中,如何高效地序列化和传输数据对于系统的性能至关重要。随着分布式系…...
计算机网络 (54)系统安全:防火墙与入侵检测
前言 计算机网络系统安全是确保网络通信和数据不受未经授权访问、泄露、破坏或篡改的关键。防火墙和入侵检测系统(IDS)是维护网络系统安全的两大核心组件。 一、防火墙 定义与功能 防火墙是一种用来加强网络之间访问控制的特殊网络互联设备,它…...
stack底层实现细节
一、stack 和 queue 在 STL 中 stack 和 queue 已经不算是容器了,而是容器适配器,适配器模式也是常用的模式之一,体现在 stack 和 queue 中就是他们两个的实现不是单独写的,而是复用了前面合适的优秀的STL 容器的代码而实现的具有…...
工业相机 SDK 二次开发-Halcon 插件
本文介绍了 Halcon 连接相机时插件的使用。通过本套插件可连接海康 的工业相机。 一. 环境配置 1. 拷贝动态库 在 用 户 安 装 MVS 目 录 下 按 照 如 下 路 径 Development\ThirdPartyPlatformAdapter 找到目录为 HalconHDevelop 的文 件夹,根据 Halcon 版本找到对…...
map和set的使用(一)详解
文章目录 序列式容器和关联式容器map和set的介绍set构造和迭代器遍历和insertfinderaseswapclearcountlower_bound和upper_boundmultiset和set的对比 set的二个题目题目解析算法原理代码介绍一个找差集的算法同步算法题目解析算法原理代码 map构造遍历initiaizer_list 序列式容…...
ARP 表、MAC 表、路由表、跨网段 ARP
文章目录 一、ARP 表1、PC2、路由器 - AR22203、交换机 - S57004、什么样的设备会有 ARP 表? 二、MAC 表什么样的设备会有 MAC 表? 三、路由表什么样的设备会有路由表? 四、抓取跨网段 ARP 包 所谓 “透明” 就是指不用做任何配置 一、ARP 表…...
37.构造回文字符串问题|Marscode AI刷题
1.题目 问题描述 小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件: t 由小写字母组成,且长度与 s 相同。t 是回文字符串,即从左到右与从右到左读取相同。t 的字典序要小…...
ssm-mybatisPlus学习笔记
注意!mybatisPlus只能够进行单表操作,其他的仍需要mybatis 1.快速入门 编写启动类 MapperScan("com.atguigu.mapper") SpringBootApplication public class MainApplication {public static void main(String[] args) {SpringApplication.r…...
【算法学习笔记】35:扩展欧几里得算法求解线性同余方程
线性同余方程问题 线程同余方程问题是指 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m),给定 a a a、 b b b和 m m m,找到一个整数 x x x使得该方程成立,即使得 a x m o d m b ax~mod~mb ax mod mb,随便返回任何一个…...
线性规划:机器学习中的优化利器
一、线性规划的基本概念 线性规划(Linear Programming, LP)是运筹学中数学规划的一个重要分支,用于在一组线性不等式的约束条件下,找到线性目标函数的最大值或最小值。其问题可以表述为: 在一组线性约束条件 s.t.&am…...
Ubuntu开发中的问题
1.退出anaconda指令:conda deactivate 2.Linux系列:一打开终端就默认进入conda的base环境,取消方法 在终端输入conda config --show,会显示所有的配置信息,然后利用conda config --set来修改此配置: conda config --se…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
