Windows 下使用 OpenSSL 命令行创建包含 subjectAltName 扩展项的数字证书

HTTPS自签名证书全流程解析:从原理到OpenSSL自动化脚本实践 HTTPS作为保障网络通信安全的核心协议,其基础在于数字证书与加密技术构建的信任体系。其工作原理依赖于非对称加密(如RSA/ECC)进行身份认证和密钥交换,以及对称加密(如AES)实现高效的数据传输,形成混合加密机制。这套机制的技术价值在于,它解决了互联网上身份可信与数据机密性的根本问题,是Web安全、API通信及微服务架构的基石。在开发测试、内网部署等应用场景中,直接使用受信任的公共CA证书可能成本高昂或不必要,此时自签名证书成为关键技术实践。通过OpenSSL工具链,开发者可以扮演CA角色,自行签发和管 阅读详情

1. CA 的基本原理简介(了解相关背景知识的读者请跳过这一部分)
        我们回想一下在生活中,两个以前从未谋面的人如何核实对方的身份。由于每一个公民都有派出所颁发的身份证,两个人只要通过查看对方的身份证,就可以大体上知道对方是谁。这个验证身份的过程如下图:

        在互联网上,识别陌生实体的思路与上述过程类似。首先建立一个有公信力的认证机构 CA(即Certificate Authority),用户向 CA 提交申请,请求 CA 为自己颁发数字证书。用户可以是个人、企业、组织、网站等,数字证书可以被视为一个特殊的数据结构,最常用的数字证书格式规范是 X.509,它由 RFC 5280《Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile》定义。CA 检查用户的实际身份、用户提交申请材料中所宣称的身份这二者是否一致,如果一致,就使用数字签名技术,为用户签署数字证书。有了 CA 这样一个可信第三方作为信任基础,两个用户无需见面,就能通过验证对方的数字证书,在互联网上识别对方的身份。大体过程如下图所示:

        如果整个互联网上只有一个 CA,那么一旦这个 CA 被攻击者攻破,则整个依赖这个 CA 颁发证书建立起来的信任体系就会崩溃。为了提高安全性,可以使用多个不同层级的 CA,如下图所示:

        在这张图中使用了两级 CA,根 CA 为它自己和下级 CA 颁发数字证书,底层 CA 为用户颁发数字证书。根 CA 只为少量的下级 CA 颁发证书,不需要一直提供在线服务,这就减轻了根 CA 长期暴露在网络上遭受攻击的可能性,也不用考虑服务性能问题。不受服务性能羁绊,根 CA 可以使用长度更长的私钥,这样安全性更强。在多层 CA 服务体系中,上一级的 CA 为下一级 CA 颁发证书,只通过底层 CA 为普通用户颁发证书。如果某一个底层 CA 出故障无法工作或被攻击者攻破,则最多只需要吊销该 CA 颁发的数字证书,其他 CA 及其下属用户不受影响。可以很容易地再创建一个底层 CA、或者由其他底层 CA 来替代它。通过采用层次 CA 体系结构,能够有效提高整个 CA 信任体系的生存能力和抗攻击能力。

2. 使用 OpenSSL 命令行创建包含 subAltName 扩展项的证书
        开源软件 OpenSSL 在编译以后,将会生成一个名为 openssl 的可执行文件。可以使用它来生成非对称密钥对、创建数字证书。为了辅助用户设置证书中某些项的值,OpenSSL 中包含了一个名为 openssl.cnf 的配置文件。使用这个默认的配置文件,可以使用 OpenSSL 命令行创建数字证书,但是在生成的数字证书中不包含 subAltName 扩展项。接下来本文将介绍如何修改配置文件,再使用 OpenSSL 命令行程序创建包含 subAltName 扩展项的数字证书。

       本文使用的 OpenSSL 版本是 1.0.2d,操作系统是 64 位Windows 7,编译 OpenSSL 的过程可以参考:https://blog.csdn.net/henter/article/details/8364532 。将 OpenSSL 编译为 32 位库或 64 位库均可,在创建证书文件时并没有差别。
        编译完 OpenSSL 之后,为了后续操作的方便,建议新建一个目录,这里假定目录名为 ca_test,将 OpenSSL 目录下 apps 子目录下的 openssl.cnf 文件拷贝到 ca_test 目录下。接下来以下操作二选一:
A) 拷贝 out32 子目录下的 openssl.exe,libeay32.lib,ssleay32.lib 到 ca_test 目录;
B) 拷贝 out32dll 子目录下的 openssl.exe,libeay32.dll,ssleay32.dll 到 ca_test 目录。
        进入命令行界面,执行命令 openssl.exe,将会出现 OpenSSL 提示符,接下来就可以输入 OpenSSL 特有的命令,进行创建证书的操作了。如下图:

        可以使用 OpenSSL 命令行直接创建一张供终端用户使用的 X.509 证书,但是一般在做测试时,经常会用到多张不同的用户证书。为了方便,在本文中先创建一张 CA 证书,接下来用这张 CA 证书对应的非对称密钥对,为一个终端用户签发证书。这里仅使用一个 CA,未使用多级 CA。

第一阶段:创建 CA 的证书(注意 这个 CA 的证书是自签名证书);
        这里使用 RSA 公钥密码算法,首先创建一个名为 root-key.pem 的文件,里面包含供 CA 使用的 RSA 私钥,私钥长度设为 2048 比特,命令如下:

genrsa -out .\root-key.pem 2048

        执行过程如下图:

        

        可以用文本编辑器查看 root-key.pem 文件,内容如下:

        创建证书请求文件 root-req.csr,命令如下:

req -new -out .\root-req.csr -key .\root-key.pem -config .\openssl.cnf

        命令在执行时,会提示用户依次输入国家、省、市、公司名、部门名等信息。如果对于某一项不想输入具体的值,可以通过输入 . 跳过该项。在本例中,依次输入的值如下:
CN
Shanghai
Shanghai
TestCorp
CA
RootCA
.
.
.

        以上执行过程如下图:

        对于具体命令的用法,可以到 OpenSSL 官网上查看文档,本文中不再做解释。比如对于 req 命令的介绍链接在:https://www.openssl.org/docs/man1.0.2/man1/req.html

        使用 CA 的密钥文件 root-cert.pem 和证书请求文件 root-req.csr,创建 CA 的数字证书 root-cert.pem。命令如下:

x509 -req -in .\root-req.csr -out .\root-cert.pem -signkey .\root-key.pem -CAcreateserial -days 3650 -extfile .\openssl.cnf -extensions v3_ca

        执行过程如下:

        可以使用文本编辑器查看证书文件 root-cert.pem,内容如下:

       在 Windows 7 下不能直接通过双击文件图标打开以 pem 为后缀的证书文件,但是可以打开以 cer 为后缀的证书文件。为了方便在 Windows 下查看证书内容,可以用以下命令对证书的格式做转换,生成一个以 cer 为后缀的证书文件:

x509 -inform PEM -outform DER -in .\root-cert.pem -out .\root-cert.cer

        在 Windows 中双击 root-cert.cer 文件图标,将弹出操作系统自带的证书查看程序,显示证书内容如下:

 

第二阶段:使用 CA 证书对应的非对称密钥对,为用户签发证书。
        首先为用户生成包含 RSA 私钥的 pem 文件,这里假定文件名为 client-key.pem,私钥长度设为 2048 比特。命令如下:

genrsa -out .\client-key.pem 2048

        先备份一下 openssl.cnf 文件,然后使用文本编辑器打开它,在其中找到 [ v3_req ] ,在该段内容的末尾另起一行加入以下内容:

subjectAltName = @alternate_names

[ alternate_names ]
IP.1 = 192.168.15.1
DNS.1 = 127.0.0.1
DNS.2 = www.mytestweb.com

        注意这里设置的值仅作为示例,用户应根据实际设置自己需要的值。在 = 前后都有一个空格,在 alternate_names 的前后也各有一个空格。 IP.1 的值是是一个 IP 地址,DNS.1 的值可以是 IP 地址也可以是一个域名。具体的取值根据实际需要自行设置,可以添加形式如下的任意多个项:
IP.2 = ...
IP.3 = ...
...
DNS.3 = ...
DNS.4 = ...
...

       编辑完成后保存文件。修改部分的内容如下图:

        为用户创建证书请求文件,假定文件名为 client-req.csr。命令如下:

req -new -out .\client-req.csr -key .\client-key.pem -config .\openssl.cnf

         命令在执行时,会提示用户依次输入国家、省(或州)、市、公司名、部门名等信息。如果对于某一项不想输入具体的值,可以通过输入 . 跳过该项。在本例中,依次输入的值如下:
CN
Shanghai
Shanghai
TestCorp
DEV
127.0.0.1
.
.
.

        命令执行过程如下:

        注意生成用户证书时,用户证书中的国家名、省名要与 CA 证书中的对应项相同。即使用 OpenSSL 命令行时, CA 只能为一定地理范围之内(即在同一国家、同一个省或州的范围之内)的用户签发证书。并且对于输入的 Common Name 这一项,其取值必须与 openssl.cnf 中 DNS.1 项的值相同。
        接下来使用 CA 证书对应的非对称密钥对,根据用户的证书申请文件为用户创建证书。这里假定生成的证书文件名为 client-cert.pem,命令如下:

x509 -req -in .\client-req.csr -out .\client-cert.pem -CA root-cert.pem  -CAkey root-key.pem -CAcreateserial -days 3650 -extfile .\openssl.cnf -extensions v3_req

        命令执行过程如下图:

        为了方便在 Windows 下查看证书,将以 pem 为后缀的证书文件 client-cert.pem 转换为以 cer 为后缀的证书文件,命令如下:

x509 -inform PEM -outform DER -in .\client-cert.pem -out .\client-cert.cer

        使用 CA 的证书校验一下客户的证书是否有效,命令如下:

verify -CAfile .\root-cert.pem .\client-cert.pem

        命令执行过程如下:

        双击 client-cert.cer 文件图标查看证书文件,显示如下:

        可以看到在生成的证书中,包含“使用者备用名称”(即subjectAltName)这一项,其值就是在 openssl.cnf 文件中设置的值。

        OpenSSL 只提供了一个配置文件 openssl.cnf,这个文件在为 CA 生成证书及为普通用户生成证书时都会被用到,这种处理方式是不妥的。在不同应用场景下,该文件的内容应该有所不同。为了防止混淆,在修改 openssl.cnf 之前最好先备份它。更为合理的处理方式是编写两个配置文件,一个用于生成 CA 证书,另一个用于生成一般的用户证书,将两套不同的配置区分开,可惜目前 OpenSSL 并没有采用这种方式。

        如果想让浏览器能够识别证书,需要向网上的专业数字证书服务提供商购买证书。如果只是在很小范围内使用数字证书,可以自己创建证书,然后将证书手动添加到浏览器能识别的证书列表中。这里以 IE 浏览器为例,过程如下:

        在 IE 菜单中点击“工具”,在下列列表中点击“Internet选项”,如下图:

        在弹出小窗体中点击“证书”按钮,如下图:

        根据具体的证书,在选项卡中选择“个人”、“其他人”,点击“导入”按钮,就可以导入这个用户对应的以 cer 为后缀的证书文件,比如前面生成的用户证书 client-cert.cer。如下图:

        如果在选项卡中选择“受信任的根证书颁发机构”,点击“导入”按钮,就可以导入 CA 的证书,比如前面生成的 CA 证书 root-cert.cer。如下图:

        在导入根证书颁发机构的证书之后,IE 浏览器会自动信任所有由该 CA 颁发的用户证书。在做测试时这样做可以带来很大的便利,只需要做一次导入 CA 证书的操作,后续就不再需要手动添加多张用于测试、临时生成的用户证书了。

【HTTPS】使用OpenSSL生成带有SubjectAltName的自签名证书 操作步骤 首先新建一个配置文件 ssl.conf如下: [ req ] default_bits = 4096 distinguished_name = req_distinguished_name req_extensions = req_ext [ req_distinguished_name ] countryName = Country... 阅读详情

相关推荐

使用openssl创建并签署SSL/TLS证书

希望在生成 SSL/TLS 证书之前,您已经安装有 openssl 以及对 SSL/TLS 有了初步的了解。 概述 本文主要讲述CA的私钥和x509自签名证书的生成,服务器/客户端的私钥和CSR的生成,以及CA对服务器/客户端的CSR签名操作。初始文件包括server-ext.cnf、client-ext.cnf以及gen.sh,相关内容如下: server-ext.cnf subjectAltName=DNS:*.study.com,DNS:*.study.org,IP:0.0.0.0 client-e

走在成长的路上 2879

x509-subjectAltName

x509

liudong200618的博客 1609

openssl学习笔记】SSL Server Cert制作

openssl req -new -x509 -keyout ca.pem -out ca.crt -config openssl.cfg openssl req -new -key server.pem -config openssl.cfg -out server.csr openssl ca -in server.csr -out server.crt -config openssl

千里之堤 1393

介绍一下 X.509 数字证书中的扩展 subjectAltName

在 RFC 5280《Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile》中定义了 X.509 公钥数字证书和证书撤销列表的内容和格式。 在 X.509 编码格式的数字证书中,使用 Issuer 子标明证书的颁发者,I...

henter的专栏 1万+

openssl 生成多域名 多IP 的数字证书

工具是用的:windows平台 Win64OpenSSL-3_2_0.exe 或 Win64OpenSSL_Light-3_2_0.exe (建议用:Win64OpenSSL-3_2_0.exe )// 设置遗嘱消息 qos 默认为 1 retained 默认为 false。* (消费者) mqtt消息入站通道,订阅消息后消息进入的通道。* (消费者) mqtt消息入站通道,订阅消息后消息进入的通道。* (生产者) mqtt消息出站通道,用于发送出站消息。// 设置异步不阻塞。

xichji的专栏 1433

从零构建数字证书体系:OpenSSL实战签发与API安全调试指南

数字证书是公钥基础设施(PKI)的核心组件,它基于非对称加密原理,将实体身份与公钥进行可信绑定。其技术价值在于为网络通信提供了身份认证、数据加密和完整性验证的基石,广泛应用于HTTPS、API安全、微服务间通信等场景。在工程实践中,开发者常需处理证书签发、链式验证及双向TLS(mTLS)配置。本文聚焦于使用OpenSSL命令行工具,从创建自签名根证书、签发中间证书到生成终端证书的全流程,并深入探讨如何将证书应用于API调用的安全加固与调试。通过解析证书结构、信任链构建及常见错误排查,帮助读者掌握从原理到落地

weixin_34405354的博客 354

数字证书全解析:从原理到实战,运维安全必备指南

数字证书是网络通信中实现身份认证与数据加密的核心技术,它基于公钥基础设施(PKI)构建信任链,确保通信双方的身份可信与数据安全。其技术价值在于为HTTPS、API安全、微服务间通信等场景提供了基础的安全保障。在工程实践中,证书的生成、部署、续期与监控是运维工作的关键环节,尤其涉及证书链完整性与SAN扩展字段的正确配置。本文聚焦于证书生命周期管理,针对证书链、SAN扩展等常见问题提供解决方案,并探讨自动化工具与监控策略,帮助开发者与运维人员构建稳固的证书管理体系。

diaogan4202的博客 339

Windows 11下OpenSSL 3.x环境配置与自签名证书生成实战指南

SSL/TLS协议是现代网络通信安全的基石,它通过非对称加密、数字证书和公钥基础设施(PKI)等密码学原理,为数据传输提供了身份认证、加密和完整性保护。在工程实践中,开发者常需在本地或测试环境快速部署HTTPS服务、加密API通信或搭建内部安全通道,而无需依赖昂贵的商业证书。OpenSSL作为功能强大的开源密码学工具包,是实现这些需求的核心技术组件。本文聚焦于**Windows 11平台**,详细解析如何高效部署**OpenSSL 3.x**环境,并手把手指导生成适用于本地开发与测试的**自签名证书**,涵

weixin_30596165的博客 354

C++ X509证书解析实战:从ASN.1编码到OpenSSL封装

在网络安全与加密通信领域,数字证书是构建信任体系的核心组件,它基于X.509标准,采用ASN.1(抽象语法标记一)进行描述,并通过DER(可辨别编码规则)进行二进制编码。其原理是通过公钥基础设施(PKI)将实体身份与公钥绑定,并由可信的证书颁发机构(CA)进行数字签名,从而确保通信双方身份的真实性和数据的完整性。这技术的价值在于为HTTPS、TLS/SSL等安全协议提供了身份认证的基石,是保障网络交易、API通信和数据传输安全的关键。在工程实践中,开发者常需深入证书内部,解析其复杂的嵌套结构,以排查如客户

weixin_33875564的博客 451

OpenSSL实战:从零构建企业级自签名PKI证书链

公钥基础设施(PKI)是保障网络通信安全的核心机制,它通过数字证书实现身份认证与数据加密。其基本原理是利用非对称加密技术,由受信的证书颁发机构(CA)对实体的公钥和身份信息进行签名绑定,形成可验证的信任链。这技术的核心价值在于为HTTPS、服务间认证、VPN等场景提供了可靠的身份凭证,确保通信的机密性、完整性与不可否认性。在企业内网、开发测试或物联网等封闭环境中,依赖外部商业CA既不经济也缺乏灵活性,因此自建PKI成为掌握主动权、实现零成本证书管理的工程实践关键。本文将聚焦于使用OpenSSL这一开源工具

weixin_30727835的博客 356

OpenSSL.cnf配置文件详解:从原理到实战,构建安全证书体系

在网络安全与加密通信领域,数字证书是实现身份认证与数据加密的核心组件,其背后依赖公钥基础设施(PKI)体系。OpenSSL作为广泛使用的开源工具集,其配置文件openssl.cnf是定义证书生成、签名与管理行为的关键。理解该文件的结构与配置逻辑,是掌握自签名证书、搭建私有CA以及定制符合特定安全策略证书的基础。配置文件通过全局节、策略节与扩展节的分层设计,精确控制证书的主题信息、密钥用途、有效期及主题备用名称等关键属性。从工程实践角度,合理配置openssl.cnf能显著提升证书管理的标准化与自动化水平,避

cnvdkx2837的博客 460

C++ OpenSSL双向认证实战:从TCP Socket到mTLS安全通信

SSL/TLS协议是构建网络通信安全基石的通用技术,通过在TCP传输层之上建立加密通道,确保数据机密性、完整性和身份验证。其核心原理基于非对称加密、数字证书和密钥交换,为HTTP、微服务、物联网等应用场景提供端到端的安全保障。双向认证(mTLS)作为TLS的高级模式,要求通信双方均验证对方证书,是实现零信任架构和内部服务间强身份验证的关键技术。本文聚焦于C++网络编程,深入解析如何基于原生Socket,使用OpenSSL库从零实现完整的双向认证流程,涵盖证书体系构建、SSL上下文配置、握手协议集成等工程实践

weixin_30421809的博客 400

X.509证书扩展字段安全探秘:从EV验证到隐蔽通道攻防实战

在网络安全领域,X.509证书作为PKI体系的核心,是建立TLS/SSL加密通信、实现身份认证的基石。其工作原理基于公钥密码学,通过可信的证书颁发机构对实体身份进行数字签名,从而在客户端与服务器之间建立信任链。这技术的核心价值在于为互联网通信提供了机密性、完整性和身份验证保障,广泛应用于HTTPS网站、电子邮件加密、代码签名等场景。然而,证书的扩展字段,特别是主题备用名称和证书策略等部分,因其设计的灵活性,在提供强大功能的同时也可能成为安全盲点。攻击者可能利用这些字段构建隐蔽通道,在看似合法的证书中隐藏恶

weixin_34326179的博客 442

私有CA搭建与Dovecot TLS证书配置实战指南

在网络安全领域,TLS/SSL证书是实现加密通信与身份验证的核心组件,其背后依赖PKI(公钥基础设施)体系来建立信任链。通过理解非对称加密、数字签名与证书颁发机构(CA)的工作原理,可以构建私有、可控的加密环境,尤其适用于内部服务、开发测试等场景。OpenSSL作为行业标准的密码学工具包,提供了从密钥生成、证书签名到验证的完整能力。本文将结合Dovecot邮件服务器的具体配置,演示如何从零搭建私有CA,并为其签发服务器证书,实现端到端的加密通信。通过实践,读者不仅能掌握证书生命周期的管理,还能深入理解信任链

weixin_33868027的博客 368

CER证书安装与卸载全平台指南:从原理到实战

在网络安全与加密通信领域,数字证书是建立客户端与服务器之间信任关系的核心机制。其工作原理基于非对称加密和公钥基础设施(PKI),通过权威机构(CA)的数字签名来验证身份,从而确保数据传输的机密性与完整性。这技术的核心价值在于为HTTPS、API接口、内网服务等场景提供身份认证和加密通道,是构建现代安全网络应用的基石。无论是开发调试、企业内网部署,还是移动应用集成,正确处理证书的安装与卸载都是保障服务可用性和安全性的关键环节。本文将围绕**自签名证书**和**信任链**这两个核心概念,详细解析在Window

cuxiong8996的博客 399

CentOS 7自签名证书全流程:从生成到客户端信任的实战指南

HTTPS加密通信依赖于SSL/TLS证书,其核心原理是通过公钥基础设施(PKI)建立可信的身份验证与数据加密通道。在内部开发测试环境中,自签名证书提供了一种经济高效的解决方案,能够实现与商业证书相同的加密功能,尤其适用于内网服务、微服务间通信等封闭场景。本文聚焦CentOS 7平台,深入解析使用OpenSSL工具生成自签名证书、配置Web服务器(如Nginx/Apache)以及解决客户端信任问题的完整流程。针对常见的“NET::ERR_CERT_AUTHORITY_INVALID”和“证书名称不匹配”等错

weixin_34127717的博客 437

数字签名与CA证书:从原理到实战的完整指南

数字签名和CA证书是现代网络安全的核心技术,它们基于非对称加密算法构建信任体系。非对称加密通过公钥和私钥配对,实现身份认证和数据完整性验证。数字签名利用私钥对数据摘要加密,接收方用公钥解密验证,确保信息未被篡改且来源可信。CA证书则解决了公钥信任问题,由受信任的证书颁发机构对实体身份进行核实并签发证书,形成从根证书到终端证书的信任链。这套体系在HTTPS网站、软件分发、企业内网通信等场景中广泛应用,保障了数据传输的安全性和可靠性。本文结合OpenSSL工具,深入解析证书结构、签名算法和信任链构建,并针对自建

java2000.net 490

SSL/TLS握手与CA证书详解:从原理到实战解决连接与认证问题

SSL/TLS协议是保障网络通信安全的基石,它通过在客户端与服务器之间建立加密通道,确保数据传输的机密性和完整性。其核心机制基于非对称加密与对称加密的结合,在握手阶段完成身份认证和密钥协商。这一技术对于实现HTTPS、API安全调用等场景至关重要,能有效防止中间人攻击和数据窃听。在实际应用中,常会遇到如“无法建立安全连接”或“证书验证失败”等问题,这些问题往往源于证书链不完整、域名不匹配或协议版本不兼容。通过深入理解证书结构、信任链验证过程以及使用OpenSSL等工具进行诊断,可以快速定位并解决TLS连接中

weixin_30329623的博客 324
上一篇: 介绍一下 X.509 数字证书中的扩展项 subjectAltName
下一篇: 使用 OpenSSL 时一定要注意不同版本之间的差异
henter
博客等级 码龄24年 283粉丝 132原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值