【笔记】使用 openssl 生成服务器证书

CSR 即证书签名申请(Certificate Signing Request),获取 SSL 证书,需要先生成 CSR 文件并提交给证书颁发机构(CA)。CSR 包含了用于签发证书的公钥、用于辨识的名称信息(Distinguished Name)(例如域名)、真实性和完整性保护(例如数字签名),通常从 Web 服务器生成 CSR,同时创建加解密的公钥私钥对。

CSR 文件中包含的内容:

名称说明
CN(通用名称)服务器端证书验证时这里为域名(FQDN) 以 https://www.baidu.com 的证书这里填写的内容为 baidu.com
Email(邮箱)证书申请主体的联系邮箱
O (组织/公司)证书主体所在的公司
OU (部门/单位)证书主体所在的部门
L (城市)证书主体所在的城市
ST (省份)证书主体所在的省份
C (国家)证书主体所在的国家
哈希签名以上内容在填写完成后,会生成一个 哈希签名,以防止篡改
公钥证书公钥

在生成 CSR(证书签名请求文件) 后,就可以将这个文件提交到 CA 机构,由 CA 机构生成对应的证书,CA 机构会验证 CSR 中的信息,在确认信息可信后,会使用自己的私钥对其中的信息进行数字签名后生成实际的服务器证书。

如果是自签名证书,也就是不需要通过CA进行认证,或者自身就是一个 CA证书,则不需要由 CA 机构去颁发证书。

首先生成一个 CA 的自签名证书:

# 创建一个 私钥PEM文件和对应的私钥签名CSR文件
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout ca.key -out ca.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Cloud/CN=ghimi.top"
# -nodes no des 的缩写,表示私钥PEM不需要设置密码
# -sha256 表示签名使用的算法为 sha256,256位共 32字节长度
# -newkey 表示会创建新的私钥 PEM 文件
# rsa:2048 表示非对称加密算法使用 rsa 算法,密钥长度 2048 位,256 字节长度
# -keyout 指定输出密钥文件名称,当前为 ca.key
# -out 指定输出签名文件名称,当前未 ca.csr
# -subj 用于设置 csr 签名文件中包含的信息# 基于私钥签名创建证书
openssl x509 -req -in ca.csr -key ca.key -out ca.crt -days 3650
# -days 3650 有效期10年
# 查看证书信息
openssl x509 -text -noout -in ca.crt

然后基于上面的 ca 证书生成一个服务器证书:

# 创建一个 私钥PEM文件和对应的私钥签名CSR文件
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout server.key -out server.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Blog/CN=blog.ghimi.top"
# -nodes no des 的缩写,表示私钥PEM不需要设置密码
# -sha256 表示签名使用的算法为 sha256,256位共 32字节长度
# -newkey 表示会创建新的私钥 PEM 文件
# rsa:2048 表示非对称加密算法使用 rsa 算法,密钥长度 2048 位,256 字节长度
# -keyout 指定输出密钥文件名称
# -out 指定输出签名文件名称
# -subj 用于设置 csr 签名文件中包含的信息# 基于私钥签名创建证书
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 \
-extensions SAN \
-extfile <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:dns.ghimi.top,IP:127.0.0.1"))
# -days 3650 有效期10年
# -CA 用于指定 ca 证书
# -CAkey 用于指定 ca 证书私钥
# -CAcreateserial 如果 ca 序列号文件不存在,则创建一个
# 查看证书信息
openssl x509 -text -noout -in server.crt

我们在请求 https 网址的时候,服务器会将自己的服务器证书发送到客户端以客户端去验证,客户端会拿自己本地的 CA 证书去验证服务器证书是通过该CA颁发的,如果是则身份认证通过。如果本地的CA无法验证服务器发来的证书时则会提示不安全或者拒绝连接。
一下为请求百度主页后返回的服务器证书信息:

[root]# curl -kv https://www.baidu.com
* Host www.baidu.com:443 was resolved. # 域名解析完成
* IPv6: 240e:e9:6002:15a:0:ff:b05c:1278, 240e:e9:6002:15c:0:ff:b015:146f # 域名解析到 ipv6 地址
* IPv4: 180.101.50.242, 180.101.50.188 # 域名解析到 ipv4 地址
*   Trying 180.101.50.242:443... # 尝试用第一个 ipv4 地址建立连接
* Connected to www.baidu.com (180.101.50.242) port 443 # 与百度服务器建立连接
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1): # tlsv1.3 客户端发起握手请求,包含一个随机数
* TLSv1.3 (IN), TLS handshake, Server hello (2): # tlsv1.2 服务器返回握手请求,包含一个服务器随机数,不兼容 tlsv1.3 协议降级为 tlsv1.2
* TLSv1.2 (IN), TLS handshake, Certificate (11): # tlsv1.2 服务器返回证书信息
* TLSv1.2 (IN), TLS handshake, Server key exchange (12): # tlsv1.2 服务器进行密钥交换
* TLSv1.2 (IN), TLS handshake, Server finished (14): # 服务器前期通信结束
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16): # 客户端交换密钥
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): # 客户端修改加密算法
* TLSv1.2 (OUT), TLS handshake, Finished (20): # 客户端发起握手结束信息
* TLSv1.2 (IN), TLS handshake, Finished (20): # 服务器端发起握手结束信息
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 / prime256v1 / RSASSA-PSS
# 加密连接建立,使用 tlsv1.2 通信 / 密钥交换协议:ECDHE 非对称加密协议:RSA 对称加密协议:AES128 哈希散列算法:SHA256(SHA-2)
* ALPN: server accepted http/1.1
* Server certificate:
# 服务器证书信息 C(国家):CN中国; ST(省份): beijing(北京);L(城市):北京 O(组织/公司): 北京百度网络科技有限公司 CN(域名): baidu.com
*  subject: C=CN; ST=beijing; L=beijing; O=Beijing Baidu Netcom Science Technology Co., Ltd; CN=baidu.com
*  start date: Jul  6 01:51:06 2023 GMT # 证书创建时间
*  expire date: Aug  6 01:51:05 2024 GMT # 证书过期时间
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018 # 证书颁发机构(CA)
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption

加密版本

上面的命令生成的私钥都是没有加密的,如果需要可以设置密码,这里设置密码为: 123456

# 生成 ca 私钥和自签名证书请求
openssl req -new -passout pass:123456 -sha256 -newkey rsa:2048 -keyout ca.key -out ca.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Cloud/CN=ghimi.top"
# -passout pass:123456 , 指定私钥密码为 123456
# 生成 ca 自签名根证书
openssl x509 -req -in ca.csr -passin pass:123456 -key ca.key -out ca.crt -days 3650
# -passin pass:123456 , 指定ca 私钥密码为 123456
# 生成服务器私钥和服务器证书请求
openssl req -new -passout pass:123456 -nodes -sha256 -newkey rsa:2048 -keyout server.key -out server.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Blog/CN=blog.ghimi.top"
# 使用 ca 自签名根证书和 服务器证书请求文件 生成服务器证书
openssl x509 -req -in server.csr -out server.crt \
-CA ca.crt -CAkey ca.key -passin pass:123456 -CAcreateserial -days 3650 \
-extensions SAN \
-extfile <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:dns.ghimi.top,IP:127.0.0.1"))

参考资料

  • Openssl生成自签名证书,简单步骤
  • openssl自签名证书
  • OpenSSL生成CA自签名根证书和颁发证书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器之工具栏构件演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

[Qt]Qt框架解析:从入门到精通,探索平台开发的无限可能

一、Qt的概述 Qt是一个跨平台的C图形用户界面应用程序框架&#xff08;GUI&#xff09;。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。开发环境为Qt creator5.8.0&#xff0c;下载…

项目经验——交通行业数据可视化大屏、HMI设计

交通行业数据大屏、HMI设计时要的注意点&#xff1a;清晰可读、简洁直观、适配性强。颜色对比度满足WCAG标准&#xff0c;深色背景减少干扰&#xff0c;实时展示交通数据&#xff0c;支持有线网络控制内容更新&#xff0c;保障驾驶安全与决策效率。

通过“BOSS”精通比特币,深入认识私钥、账户和钱包

来源:币界原创 作者:636Marx 无论当今数字货币技术如何发展&#xff0c;认识区块链技术幕后的关键机制至关重要。无论您是新手还是经验丰富的数字货币从业者&#xff0c;掌握钱包地址、公钥和私钥的复杂性都有无可替代重要性。进入 BOSS Wallet&#xff0c;这是一款尖端的 Web…

ICMAN触摸芯片——防水触摸

ICMAN触摸芯片之防水触摸触摸按键控制开关和调节挡位和切换不同模式 淋水状态下&#xff0c;触摸按键反应灵敏&#xff0c;不误触发&#xff0c; ICMAN触摸芯片稳定性与抗干扰能力强&#xff0c; 可以轻松解决家电触摸感应不灵敏和有水误触发的问题&#xff0c; 从而有效实…

鸿蒙开发学习随记(1)——ArkTS基础语言学习

目录 变量与常量 数组 函数 常规函数 箭头函数 接口与对象 联合体 枚举类型 变量与常量 在ArkTS语言中有三种常见的数据类型&#xff1a;number,string,boolean。 变量这样声明定义&#xff1a; //变量命名let name:string "zhangsan"//let是一个关键字声明…

Ubuntu系统docker gpu环境搭建

Ubuntu系统dockergpu环境搭建 安装步骤前置安装安装指定版本的依赖包用docker官方脚本安装Docker-ce添加稳定仓库和GPG秘钥更新源 安装docker安装nvidia-docker2重启docker服务阿里云镜像加速 相关命令网络 docker常用命令镜像容器 docker相关问题解决方案使用wsl时docker的容器…

Linux_文件IO

目录 一、库函数进行文件操作 1、fopen/fclose 2、fwrite 3、追加方式-“a” 4、fread 5、三个默认文件流 二、系统函数进行文件操作 1、open/close 2、write 3、追加方式-“O_APPEND” 4、read 5、struct file结构体 6、文件描述符 6.1 struct file的引用…

c++:C++标准库学习iostream

基础介绍 C程序可以通过__cplusplus符号是否预定义来判断当前是gcc还是g编译 __cplusplus的值是long int类型的&#xff0c;值表示当前编译程序的C编译器的版本号。 cout << "__cpulspuls :" << __cplusplus << endl;C文件名的常用后缀&#xff1…

中学理化生实验室建设及配置要求

在中学物理、化学、生物等学科教学中&#xff0c;实验占据了非常重要的地位&#xff0c;是整个教学过程中不可或缺的部分。很多理科教学需要在实验室完成演示和学习任务&#xff0c;实验室也是保证教学计划得以实施的物质基础。因此&#xff0c;中学理化生实验室建设标准与否&a…

【C++ | const成员】类的 const数据成员、const成员函数、const对象、mutable 数据成员

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-14 2…

win10修改远程桌面端口号,在Windows 10中修改远程桌面端口号的步骤

在Windows 10中&#xff0c;远程桌面服务&#xff08;Remote Desktop Services, RDS&#xff09;允许用户从远程位置访问和操作计算机。默认情况下&#xff0c;远程桌面协议&#xff08;RDP&#xff09;使用端口3389进行通信。然而&#xff0c;出于安全考虑&#xff0c;管理员可…

VScode创建ROS项目 ROS集成开发环境

ROS使用VScode创建项目步骤 1.创建ROS工作空间2.启动VScode3.VScode编译ROS4.创建ROS功能包C语言开发Python语言开发 本文章介绍了如何在Ubuntu18.04系统下搭建VScode 的ROS项目 搭建项目分为一下几个步骤&#xff1a; 1.创建ROS工作空间 创建一个demo的ROS工作空间&#xff0…

微服务架构中间件安装部署

微服务架构中间件安装部署 jdk安装 安装包jdk-8u144-linux-x64.tar.gz 先检查系统原版本的jdk并卸载 rpm -qa | grep java 显示信息如下&#xff1a; tzdata-java-2014g-1.el6.noarch java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64 java-1.7.0-openjdk-1.7.0.65-2.5.1.2.…

大数据学习-Hadoop

介绍 是 Apache 的顶级开源项目&#xff0c;一个分布式框架&#xff0c;主要功能&#xff1a; 分布式大数据存储——HDFS 组件分布式大数据计算——MapReduce 组件分布式资源调度——YARN 组件 可以通过它来构建集群&#xff0c;完成大数据的存储和计算 学习起来相对简单&…

怎么看电脑实时充电功率

因为我想测试不同的充电器给电脑充电的速度&#xff0c;所以就想找一款软件可以看电脑当前充电功率的软件&#xff0c;我给一个图 直接搜索就可以下载了&#xff0c;charge rate就是功率&#xff0c;这里是毫瓦&#xff0c;换算单位是 1000mw1w 所以我这里充电功率是65w&…

6.21 移动语义与智能指针

//先构造&#xff0c;再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 "hello"; 背景需求&#xff1a; 这个隐式创建的字符串出了该行就直接销毁掉&#xff0c;效率比较低 可以让_pstr指向这个空间…

EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式)

EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式) 0 QT-SOEM及STM32F767-SOEM视频欣赏及源代码链接:0.1 Linux--Ubuntu系统之 QT-SOEM博客、视频欣赏及源代码链接0.2 STM32F767-SOEM 博客、视频欣赏及源代码链接0.3 wi…

python从入门到精通2:缩进

在Python中&#xff0c;缩进&#xff08;Indentation&#xff09;是一个非常重要的语法元素&#xff0c;它用于表示代码块的结构。与其他许多编程语言使用大括号 {} 来定义代码块不同&#xff0c;Python使用缩进来确定代码块的开始和结束。这种简洁的语法使得Python代码更加清晰…

squareline studio浅尝(1)在对话框添加键盘

因项目需要&#xff0c;需要修改IP地址等参数&#xff0c;需要编辑文本对话框内容&#xff0c;这时候就需要调用键盘&#xff0c;操作如下。主要为了做笔记。如有误导请及时留言。 1&#xff09;拖一个键盘到对话框页面。默认把它隐藏&#xff08;flag:hidden&#xff09; 2&…