ssl证书,以 Nginx 为例

文章目录

    • 1 证书概述
      • 1.1 常见证书格式
      • 1.2 证书的几种扩展名
      • 1.3 关于 PKCS#12 格式
    • 2 Nginx 下证书配置
      • 2.1 证书的工作原理
        • 2.1.1 单向认证
        • 2.1.2 双向认证
      • 2.2 CA 机构签发
        • 2.2.1 免费 SSL 证书申请
        • 2.2.2 双向认证
      • 2.3 自签证书
        • 2.3.1 单向认证
        • 2.3.2 双向认证
    • 附录 1:Windows 凭据
      • 1.1 查看 Windows 凭据
      • 1.2 cmdkey 使用
    • 参考文章

1 证书概述

1.1 常见证书格式

  • 1)SSL 数字证书:

    • 在 HTTPS(HTTP over SSL)请求的 SSL 握手阶段,服务端以数字证书的方式将 RSA 公钥传给客户端,以保证公钥在传输过程中不被篡改。随后在通信过程中,该公钥将用于加密一个密钥,这个密钥则会对通信数据进行对称加密。
    • SSL 数字证书的主要目的是用于传递服务端公钥,以及验证服务器信息。
  • 2)X.509 数字证书标准,定义证书文件的结构和内容,详情参考 RFC5280。X.509 标准的证书文件具有不同的编码格式,一般有 PEM 和 DER 两种格式

  • 3)PEM:Privacy Enhanced Mail,以 “-----BEGIN XXX-----” 开头,“-----END XXX-----” 结尾,内容为 Base64 编码的数据。

    • (1)查看 PEM 编码的证书内容:
    openssl x509 -in xxx.pem -text -noout
    
    • (2)可以用来编码存储公钥(RSA PUBLIC KEY)、私钥(RSA PRIVATE KEY)、证书签名请求(CERTIFICATE REQUEST)等数据
    • (3)Apache 和 Nginx 多使用这种编码格式
  • 4)DER:Distinguished Encoding Rules,文件内为二进制编码。

    • (1)查看 DER 编码的证书内容:
    openssl x509 -in xxx.der -inform der -text -noout
    
    • (2)Java 和 Windows 服务器应用偏向于使用这种编码格式
  • 5)PEM 和 DER 之间的互转:

    # PEM 转 DER
    openssl x509 -in xxx.pem -outform der -out xxx.der
    # DER 转 PEM
    openssl x509 -in xxx.der -inform der -outform pem -out xxx.pem# 要转换 KEY 文件也类似,只不过把 x509 换成 rsa ,要转 CSR 的话,把 x509 换成 req
    

1.2 证书的几种扩展名

  • 1)常见的证书编码格式虽然有 PEM 和 DER 格式,但文件扩展名除了 .pem 和 .der 这两种外,还有 .crt、.cer、.key、.csr、.p12 等。

  • 2).crt:常用于 UNIX 系统证书的后缀,可能采用 PEM 或 DER 编码,多数为 PEM 编码。

  • 3).cer:常用于 Windows 系统证书的后缀,可能采用 PEM 或 DER 编码,多数为 DER 编码。

  • 4).key:通常用来存放公钥或私钥,可能是 PEM 或 DER 编码。

  • 5).csr:证书签名请求文件,用于服务器向证书分发机构申请证书。核心内容是公钥,生成该申请文件时,同步也会生成私钥,要自己保管好。

  • 6).pfx/.p12:Predecessor of PKCS#12。UNIX 下,一般 CRT 和 KEY 分开存放到不同文件中。Windows 下则将它们存放在一个 PFX 文件(包含证书及私钥)中,且通常附带一个 “提取密码”。

    # 将 PFX(DER 编码) 转换为 PEM 编码
    openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
    
  • 7).crl:证书吊销列表文件,用于记录已被吊销的证书。

  • 8).jks:Java Key Store,使用 keytool 可以生成,也可以将 PFX 转换为 JKS。

1.3 关于 PKCS#12 格式

  • 1)证书一般和密钥对一起保存,PKCS#12 格式可以将证书和密钥对打包成一个文件,并对文件进行加密保存。

  • 2)PKCS#12 是公开密钥加密学的一种格式,是微软发布的一种格式,后缀一般是 .pkcs12、.pfx、.p12。

  • 3)可以通过 OpenSSL pkcs12 子命令将密钥对(privkey.pem)、服务器实体证书(cert.pem)、中间证书(chain.pem) 转换成一个文件(会使用口令保护):

    # 中间证书如果不存在可以不指定
    openssl pkcs12          \
    -export -out cert.pfx   \
    -inkey privkey.pem -in cert.pem -certfile chain.pem
    
  • 4)需要使用证书时,可以从 cert.pfx 导出密钥对和证书(需要输入口令):

    # 导出密钥对
    openssl pkcs12 -in cert.pfx -nodes -nocerts -out new_privkey.pem
    # 导出服务器实体证书
    openssl pkcs12 -in cert.pfx -nodes -clcerts -out new_cert.pem
    # 导出中间证书
    openssl pkcs12 -in cert.pfx -nodes -cacerts -out new_chain.pem
    

2 Nginx 下证书配置

2.1 证书的工作原理

2.1.1 单向认证
  • 1)单向认证(图源自网络):

  • 2)服务器和 CA 机构各有一套公私钥(实际应用还有中间证书),通信前:

    • (1)服务器将自己的公钥以及国家、省、市、公司、域名、邮箱 等信息发给 CA 机构请求签名。
    • (2)CA 机构使用自己的私钥对服务器的这些信息进行签名,并生成证书返回给服务器。
  • 3)所谓验证证书合法性,即客户端使用内置在 PC 或浏览器的 CA 机构公钥,对证书的签名进行验证(私钥加密,公钥解密),签名一致则表示服务器证书可信,进而表明证书内的服务器公钥可信。

2.1.2 双向认证
  • 1)双向认证(图源自网络):

  • 2)可以发现,服务端需要使用根证书的公钥解密客户端证书,从而拿到客户端公钥。即 CA 机构的根证书需要分别对服务端、客户端的证书加密。

2.2 CA 机构签发

2.2.1 免费 SSL 证书申请
  • 1)由于免费的 CA 机构不会对 IP 地址签发证书,所以我们要整个域名,直接去微信搜索 “1元域名”(1 年)。

    • (1)在腾讯云买到了 luyao.email 域名(可能需要一个模板去审核,耗时 1 小时)
    • (2)在腾讯云的 ssl 免费证书申请页面,没有找到根据 csr(证书签名请求文件,用于服务器向证书分发机构申请证书) 申请证书的地方,所以选择阿里云来申请免费证书
  • 2)生成服务器私钥与证书签名请求文件 csr:

    # 生成服务器私钥
    openssl genrsa -out server_private.key 2048# 生成服务器的证书签名请求文件 server.csr,用于服务器向证书分发机构申请证书。
    MSYS_NO_PATHCONV=1      \
    openssl req -new -key server_private.key -out server.csr \
    -subj "/C=CN/ST=Henan/L=Henan/O=luyao/OU=luyao/CN=luyao.email/emailAddress=luyaocode@outlook.com"
    • 这里的 “MSYS_NO_PATHCONV=1” 用来解决使用 git bash 中 openssl 执行上述命令时,出现的 “/ 默认被认作为 git 的安装目录” 问题
  • 3)把上述生成的 server.csr 文件通过 “CSR管理” 上传到阿里云(同时上传的还有 server_private.key 私钥)

  • 4)在 “免费证书” 中申请证书,“选择已有的 CSR” 为我们上传的 csr 文件:
    在这里插入图片描述

  • 5)在证书申请记录的 “验证” 中按照要求配置域名的 DNS 解析记录(申请成功删除即可),等待 CA 机构审核即可(大概几分钟可接收到签发成功短信)。

  • 6)下载 nginx 服务器证书,其中包括 luyao.email.key 和 luyao.email.pem。配置到 nginx:

    server {listen       443 ssl;server_name  luyao.email;ssl_certificate         ../sslKey/luyao.email.pem;ssl_certificate_key     ../sslKey/luyao.email.key;ssl_session_cache       shared:SSL:1m;ssl_session_timeout     5m;ssl_ciphers             ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols           TLSv1.1 TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers  on;location / {root   html;index  index.html index.htm;}
    }# 自动切换 HTTP 到 HTTPS
    server {listen       80;server_name  luyao.email;#charset koi8-r;#access_log  logs/host.access.log  main;# redirect HTTP to HTTPS by rewriterewrite ^(.*)$ https://$host$1;location / {root   html;index  index.html index.htm;}
    
2.2.2 双向认证
  • 1)没有找到免费可用的证书。

2.3 自签证书

2.3.1 单向认证
  • 1)CA 机构:

    # 生成 CA 机构私钥
    openssl genrsa -out ca_private.key 2048# 使用 CA 机构的私钥生成证书,用来签发服务器证书(“/ ”默认被认作为 git 的安装目录,MSYS_NO_PATHCONV 用来解决该问题)
    MSYS_NO_PATHCONV=1  \
    openssl req -new -x509 -key ca_private.key  -out ca.crt -days 365      \
    -subj "/C=CN/ST=Henan/L=Henan/O=ca/OU=ca/CN=www.ca.com/emailAddress=ca@ca.com"
    • 这里的 ca_private.key 是我们自身作为 CA 机构为所有的服务器签发证书所用的私钥。而生成的 ca.crt 则用于给服务器请求证书签名,即根证书 root.crt 。
  • 2)服务器:

    # 生成服务器私钥
    openssl genrsa -out server_private.key 2048# 生成服务器的证书签名请求文件 server.csr,用于服务器向证书分发机构申请证书。
    MSYS_NO_PATHCONV=1      \
    openssl req -new -key server_private.key -out server.csr \
    -subj "/C=CN/ST=Henan/L=Henan/O=server/OU=server/CN=server.com/emailAddress=server@server.com"
  • 3)将服务器的证书签名请求文件 server.csr 发送给 CA 机构,由其对该证书进行签名:

    # 被 CA 机构签名后的证书文件 server.crt
    openssl x509 -req -days 365 -CA ca.crt -CAkey ca_private.key  -CAcreateserial \
    -in server.csr -out server.crt
  • 4)配置到 Nginx:

    server {listen       443 ssl;server_name  localhost;ssl_certificate         ../sslKey/server.crt;ssl_certificate_key     ../sslKey/server_private.key;......
    }
    
2.3.2 双向认证
  • 1)双向认证
# (1)CA 机构
# CA 私钥
openssl genrsa -out ca_private.key 2048
# CA 根证书
MSYS_NO_PATHCONV=1          \openssl req -new -x509  \-key ca_private.key     \-out ca_root.crt        \-days 365               \-subj /C=CN/ST=Henan/L=Henan/O=ca/OU=ca/CN=ca.com/emailAddress=ca@ca.com# (2)服务器
# 服务器私钥
openssl genrsa -out server_private.key 2048
# 服务器请求证书
MSYS_NO_PATHCONV=1      \openssl req -new    \-key server_private.key     \-out server.csr     \-subj /C=CN/ST=Henan/L=Henan/O=server/OU=server/CN=luyao.email/emailAddress=server@server.com
# CA 机构根据服务器请求证书生成服务器证书
openssl x509 -req   \-days 365           \-CA ca_root.crt     \-CAkey ca_private.key   \-CAcreateserial     \-in server.csr      \-out server.crt# (3)客户端
# 客户端 1 私钥
openssl genrsa -out client1_private.key 2048
# 客户端 1 请求证书
MSYS_NO_PATHCONV=1              \openssl req -new            \-key client1_private.key     \-out client1.csr             \-subj /C=CN/ST=Henan/L=Henan/O=client/OU=client/CN=luyao.email/emailAddress=client@client.com
# CA 机构根据客户端请求证书生成客户端证书
openssl x509 -req   \-days 365       \-CA ca_root.crt \-CAkey ca_private.key   \-CAcreateserial \-in client1.csr  \-out client1.crt# 客户端 2 私钥
openssl genrsa -out client2_private.key 2048
# 客户端 2 请求证书
MSYS_NO_PATHCONV=1  \openssl req -new    \-key client2_private.key     \-out client2.csr     \-subj /C=CN/ST=Henan/L=Henan/O=client/OU=client/CN=luyao.email/emailAddress=client@client.com
# CA 机构根据客户端请求证书生成客户端证书
openssl x509 -req   \-days 365       \-CA ca_root.crt \-CAkey ca_private.key   \-CAcreateserial \-in client2.csr  \-out client2.crt
  • 4)配置到 Nginx:
    server {listen       10443 ssl;server_name  localhost;ssl_certificate         ../sslKey/server.crt;ssl_certificate_key     ../sslKey/server_private.key;ssl_client_certificate  ../sslKey/ca_root.crt;ssl_verify_client       on;ssl_session_cache       shared:SSL:1m;ssl_session_timeout     5m;ssl_ciphers             ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_prefer_server_ciphers  on;location / {root   html;index  index.html index.htm;}}
  • 5)测试:
curl --cert client.crt --key client_private.key --cacert server.crt https://luyao.email:10443

附录 1:Windows 凭据

1.1 查看 Windows 凭据

  • (1) 图形化界面查看:

    • “Win + R” 后输入 “control” 回车,“用户账户” -> “凭据处理器” -> “管理 Windows 凭据”
  • (2) 命令查看:

    cmdkey /list
    

1.2 cmdkey 使用

  • (1) 先看一下使用说明

    PS C:\Windows\system32> cmdkey
    创建,显示和删除保存的用户名和密码。
    此命令的语法为:
    CMDKEY [{/add | /generic}:targetname {/smartcard | /user:username {/pass{:password}}} | /delete{:targetname | /ras} | /list{:targetname}]示例:要列出可用的凭据:cmdkey /listcmdkey /list:targetname要创建域凭据:cmdkey /add:targetname /user:username /pass:passwordcmdkey /add:targetname /user:username /passcmdkey /add:targetname /user:usernamecmdkey /add:targetname /smartcard要创建普通凭据:/add 开关可以由 /generic 替代,来创建普通凭据要删除现有凭据:cmdkey /delete:targetname要删除 RAS 凭据:cmdkey /delete /ras
    
  • (2) 整理:

    # 查看
    cmdkey /list
    cmdkey /list:targetname     # 这里的 targetname 支持正则,如 git* 可以列出所有目标以 git 开头的凭据# 删除
    cmdkey /delete:git:http://xxx.com# 添加
    cmdkey /generic:git:http://xxx.com /user:licong /pass:Passw0rd    
    

参考文章

  • https://www.cnblogs.com/guogangj/p/4118605.html
  • https://blog.csdn.net/u011001084/article/details/54708258
  • https://blog.csdn.net/as3luyuan123/article/details/13709923
  • https://help.aliyun.com/zh/api-gateway/user-guide/mutual-tls-authentication

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

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

相关文章

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中,任务栈(Task)是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

专家PID控制

专家PID控制(Expert PID Control)是一种结合了传统PID控制和专家系统思想的控制方法。它通过引入专家经验、规则和推理机制,以改善PID控制器在面对复杂系统时的性能。专家PID控制不仅仅依赖于固定的PID参数(比例、积分、微分&…

ES分词环境实战

文章目录 安装下载1.1 下载镜像1.2 单节点启动 防火墙设置异常处理【1】iptable链路中断 参考文档 参加完2024年11月软考,对ES的分词进行考查,前期有【 Docker 环境下安装部署 Elasticsearch 和 kibana】和【 Docker 环境下为 Elasticsearch 安装IK 分…

【桌面应用程序】Vue-Electron 环境构建、打包与测试(Windows)

前言 Vue 与 Electron 环境构建、打包与测试。 目录 前言 一、基本环境准备 二、配置npm源 三、创建Vue项目 四、添加Electron支持 五、应用启动 ​六、添加UI框架 ElementUI ​七、打包 一、基本环境准备 npm版本:8.6.0node版本:v18.0.0Vue/…

golang中的init函数

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包,那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到 fmt 包,但 它只会被导入一次&#x…

Paint 学习笔记

目录 ippaint 外扩对象 LCM_inpaint_Outpaint_Comfy: 不支持文字引导 ippaint https://github.com/Sanster/IOPaint 外扩对象 https://www.iopaint.com/models/diffusion/powerpaint_v2 GitHub - open-mmlab/PowerPaint: [ECCV 2024] PowerPaint, a versatile …

【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 📘 基础数据结构【C语言】 💻 C语言编程技巧【C】 🚀 进阶C【OJ题解】 📝 题解精讲 目录 C继承机制详解与代码示例📌1. 继承的基本概念📌 2.…

【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境: MATLAB 2022a 1、算法描述 北方苍鹰优化算法(Northern Goshawk Optimization,简称NGO)是一种新兴的智能优化算法,灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽,广泛分布于北…

C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合

在C#编程中,二维数组(或矩阵)是一种重要的数据结构,它不仅能够高效地存储和组织数据,还能通过其行、列和交叉点(备注:此处相交处通常称为“元素”或“单元格”,代表二维数组中的一个…

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步,就有非常多的坑,一些常见的坑,官网都有介绍,就不再拿出来了,这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法: Windows系统,官…

跨平台WPF框架Avalonia教程 十三

AutoCompleteBox 自动补全输入框 自动补全输入框提供了一个供用户输入的文本框和一个包含可能匹配项的下拉列表。下拉列表会在用户开始输入时显示,并且每输入一个字符,匹配项都会更新。用户可以从下拉列表中选择匹配项。 文本与可能项匹配的方式是可配…

开发中使用UML的流程_02 CIM-1:定义业务流程

CIM-1定义业务流程(业务用例模型)的生成,有下列两项: 1.业务用例图 2.业务用例简述 业务用例图的主要组成元素是业务用例和业务执行者。 图中的一个业务用例代表一条业务流程,业务执行者则代表位于业务组织外但会启动…

Streamlit + AI大模型API实现视频字幕提取

简介 在本文中,我将带你探讨如何使用Streamlit和AI大模型API来实现视频字幕提取的技术。Streamlit是一个开源的Python库,用于快速构建数据应用的Web界面,而AI大模型API,如OpenAI,提供了强大的语言处理能力&#xff0c…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例:2.2: find和erase使⽤样例: 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

计算机网络——路由选择算法

路由算法 路由的计算都是以子网为单位计算的——找到从原子网到目标子网的路径 链路状态算法 序号——(源路由器,序号)——如果发现这个序号重复或者老了——就不扩散 先测量——再泛洪获得路由 路由转发情况 若S——>W是21则不更改——…

同三维T80004EHU 高清HDMI/USB编码器

同三维T80004EHU 高清HDMI/USB编码器 1路HDMI或1路USB输入,带1路3.5音频输入,高清1080P60 同三维T80004EHU 高清HDMI/USB编码器 产品简介: 同三维T80004EHU高清HDMI/USB编码器是一款1路HDMI或1路USB高清编码器。可将 HDMI 或USB视频源编码…

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

子串【Lecode_HOT100】

1.和为K的子数组No.560 前缀和枚举 public int subarraySum(int[] nums, int k) {int count 0;//满足条件的个数//计算前缀和int[] preSum new int[nums.length1];for(int i 1 ; i<preSum.length;i){preSum[i]preSum[i-1]nums[i-1];}//查找满足kfor(int l 0;l<preSum…

13.C++内存管理2(C++ new和delete的使用和原理详解,内存泄漏问题)

⭐本篇重点&#xff1a;new, delete的使用和原理 ⭐本篇代码&#xff1a;c学习/04.c-动态内存管理 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. new和delete的使用 1.1 操作内置类型 1.2 操作自定义类型 二. new, delete与malloc, free的区别 2.1…

vue中动态渲染静态图片资源

不报错且f12查看元素的时候&#xff0c;显示的src说明已经渲染到html的src上&#xff0c;但是就是不显示在页面上 原因 在vue上&#xff0c;动态渲染静态图片资源&#xff08;比如从assets文件夹加载的图片&#xff09;需要注意打包工具对静态资源的解析方式 由于vue2的脚手…