PKI - 借助Nginx 实现Https_使用CA签发证书

2024-02-12 08:12

本文主要是介绍PKI - 借助Nginx 实现Https_使用CA签发证书,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Pre
  • 概述
  • 操作步骤
    • 1. 生成 CA 密钥对
    • 2. 生成自签名的 CA 证书
    • 3. 生成服务器密钥对和证书签名请求 (CSR)
    • 4. 使用 CA 签署服务器证书
  • Nginx Https 自签证书
    • 1. 生成自签名证书和私钥
    • 2. 配置 Nginx 使用 CA签发的 HTTPS 证书
    • 3. 重启 Nginx 服务
    • 4. 直接访问
    • 5. 不验证证书直接访问
    • 6. 使用ca.crt作为ca证书验证服务端
      • 使用ca根证书,而非签发的server.crt 证书进行访问
    • 7. 使用IP访问

在这里插入图片描述


Pre

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

PKI - 数字签名与数字证书


概述

使用 CA 签发证书的主要原因和作用如下:

  1. 建立信任关系: 使用 CA 签发的证书可以建立信任关系,客户端可以信任由公认的 CA 颁发的证书,从而确保与服务器之间的通信是安全可靠的。

  2. 保证身份验证: CA 对证书申请者进行身份验证,并在验证通过后签发证书。这样,服务器可以通过 CA 签发的证书来证明自己的身份,确保客户端与合法的服务器进行通信,防止中间人攻击。

  3. 保护通信数据: 证书中包含了公钥,可以用于加密通信数据。使用 CA 签发的证书可以保护通信数据的机密性,防止数据被窃取或篡改。

  4. 提供数据完整性: 证书中包含了数字签名,可以用于验证通信数据的完整性。使用 CA 签发的证书可以确保通信数据在传输过程中没有被篡改。

总之,使用 CA 签发证书可以确保通信的安全性、可靠性和完整性,为网络通信提供了重要的保护和信任基础。


操作步骤

如下OpenSSL 命令,用于生成自签名的 CA(Certificate Authority,证书颁发机构)证书以及服务器证书。

在这里插入图片描述

1. 生成 CA 密钥对

openssl genrsa -out ca.key 2048

这个命令生成了一个 2048 位的 RSA 密钥对,私钥保存在 ca.key 文件中。


2. 生成自签名的 CA 证书

openssl req -x509 -new -nodes -key ca.key -subj "/CN=artisan-ca.com" -days 5000 -out ca.crt

这个命令使用生成的 CA 密钥对生成了一个自签名的 CA 证书。
-x509 选项表示生成一个自签名的 X.509 证书,
-subj 选项用于指定证书的主题信息,
-days 选项用于指定证书的有效期,
-out 选项用于指定输出的证书文件名。

查看生成的证书信息,证明这是一个自签的CA证书 。
在这里插入图片描述


3. 生成服务器密钥对和证书签名请求 (CSR)

# 服务器的 RSA 密钥对
openssl genrsa -out server.key 2048# 证书签名请求 (CSR)
openssl req -new -key server.key -subj "/CN=artisan.com" -out server.csr

这两个命令分别生成了服务器的 RSA 密钥对和证书签名请求 (CSR)。

首先使用 genrsa 命令生成了服务器的私钥 server.key,然后使用 req 命令生成了 CSR 文件 server.csr,其中 -subj 选项用于指定证书的主题信息。


4. 使用 CA 签署服务器证书

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000

这个命令使用之前生成的 CA 密钥对和证书 (ca.crtca.key) 对服务器的 CSR (server.csr) 进行签名,生成了服务器的证书 server.crt
-CA 选项用于指定签署证书的 CA 证书,
-CAkey 选项用于指定 CA 的私钥
-CAcreateserial 选项用于生成一个序列号文件以跟踪已签署的证书,
-out 选项用于指定输出的证书文件名。

通过这些 OpenSSL 命令,就可以成功地生成了自签名的 CA 证书和服务器证书,并使用 CA 对服务器证书进行了签名,从而建立了一个简单的证书信任链。

在这里插入图片描述


Nginx Https 自签证书

创建和配置 Nginx 使用 HTTPS 自签名证书的步骤如下:

1. 生成自签名证书和私钥

在这里插入图片描述

openssl genrsa -out server.key 2048

  • 该命令生成一个 RSA 密钥对,并将私钥保存到 server.key 文件中。参数 2048 指定了密钥长度为 2048 位。

openssl req -x509 -new -nodes -key server.key -subj "/CN=artisan.com" -days 10000 -out server.crt

  • 这个命令生成一个自签名的 X.509 证书。解释如下:
    • -x509:表示生成自签名证书。
    • -new:创建一个新的证书请求。
    • -nodes:不加密生成的私钥。
    • -key server.key:指定使用之前生成的私钥文件 server.key
    • -subj "/CN=yandun.com":指定证书的主题(Subject)。在这里,/CN=yandun.com 表示通用名称(Common Name)为 yandun.com
    • -days 10000:指定证书的有效期为 10000 天。
    • -out server.crt:将生成的证书保存到 server.crt 文件中。

openssl x509 -in server.crt -noout -text

  • 该命令用于查看生成的证书的详细信息,包括主题、颁发者、有效期等。解释如下:
    • -in server.crt:指定要查看的证书文件。
    • -noout:不打印证书内容到标准输出。
    • -text:以文本形式显示证书内容。

这些命令可以用来生成自签名的证书并查看证书的详细信息。

在这里插入图片描述

Issuer 和 Subject 是同一个机构, 说明是自签证书。

CA: TRUE 说明它是一个CA签发结构。


2. 配置 Nginx 使用 CA签发的 HTTPS 证书

编辑 Nginx 的配置文件(通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/default),并确保以下配置项已经添加或更新:

 server {..........ss1 on;ss1_certificate /cert/server.crt;ss1_certificate_key /cert/server.key;# 暂不开启#ss1_client_certificate /cert/client.crt;#ssI_verify_client on;ss1_session_cache shared:ssL:1m;ss1_session_timeout 10m;ss1_ciphers HIGH:!aNULL:!MD5;ss1_prefer_server_ciphers on; ..........}

每个指令的含义如下:

  1. ss1 on;

    • 启用 SSL/TLS 加密。这表示流模块将使用 SSL/TLS 加密来保护与客户端的通信。
  2. ss1_certificate /cert/server.crt;

    • 指定用于 SSL/TLS 加密的服务器证书文件路径。在这里,/cert/server.crt 是服务器证书的路径。
  3. ss1_certificate_key /cert/server.key;

    • 指定用于 SSL/TLS 加密的服务器私钥文件路径。在这里,/cert/server.key 是服务器私钥的路径。
  4. #ss1_client_certificate /cert/client.crt;

    • 用于指定客户端证书的文件路径。这是可选的,如果您希望服务器验证客户端的证书,则取消注释并指定客户端证书的路径。
  5. #ss1_verify_client on;

    • 用于指定是否验证客户端证书。取消注释并设置为 on 可以启用客户端证书验证。
  6. ss1_session_cache shared:ssL:1m;

    • 指定用于缓存 SSL/TLS 会话的共享内存区域名称和大小。在这里,会话缓存名称为 ssL,大小为 1MB。
  7. ss1_session_timeout 10m;

    • 指定 SSL/TLS 会话的超时时间。在这里,会话超时时间为 10 分钟。
  8. ss1_ciphers HIGH:!aNULL:!MD5;

    • 指定 SSL/TLS 加密算法的优先级和允许使用的加密套件。在这里,使用了 HIGH 表示使用高强度加密算法,同时禁用了一些不安全的加密套件,如 NULLMD5
  9. ss1_prefer_server_ciphers on;

    • 指定是否优先使用服务器端提供的加密套件。设置为 on 表示优先使用服务器端提供的加密套件。

这些指令配置了 Nginx 流模块的 SSL/TLS 加密功能,包括了服务器证书、私钥、会话缓存等参数。


3. 重启 Nginx 服务

完成配置后,通过以下命令重启 Nginx 服务,以使更改生效:

sudo systemctl restart nginx

现在,Nginx 应该已经配置为使用自签名证书进行 HTTPS 加密通信。请确保防火墙已正确配置以允许流量通过 HTTPS 端口(默认为 443)。


4. 直接访问

在这里插入图片描述

我们可以看到 开启了Https以后,直接使用http的方式访问是行不通的

curl: (60) Peer's certificate issuer has been marked as not trusted by the user
More details here: http;//curl.haxx.se/docs/sslcerts.html  

通过web访问 会弹出警告信息

在这里插入图片描述


5. 不验证证书直接访问

If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure)  option.
curl  https://192.168.3.103 -k 

可以通过在 curl 命令中添加 -k--insecure 选项来关闭 curl 对证书的验证,从而允许直接访问未经验证的 HTTPS 网站。这样做会绕过证书验证过程,可能会存在安全风险,因此建议仅在测试或特殊情况下使用。

可以使用的命令:

curl https://192.168.3.103 -k

这个命令将直接访问 https://192.168.3.103,而不会验证服务器证书的有效性。

请注意,使用 -k 选项会将连接置于不安全的状态,因为它不验证服务器证书的真实性,可能容易受到中间人攻击。因此,在生产环境中应避免使用此选项,以确保通信的安全性。


6. 使用ca.crt作为ca证书验证服务端

不能使用签发的server.crt 进行访问,错误信息如下

curl https:/artisan.com  --resolve  --cacert /cert/server.crt
artisan.com:443:192.168.3.103
cur1: (60) Peer's Certificate issuer is not recognized.

在这里插入图片描述

cur1: (60) Peer's Certificate issuer is not recognized.

错误信息表明 curl 无法验证服务器证书的签发者。这通常是由于未将 CA 证书正确指定给 curl 所致。我们使用 --cacert 选项指定了服务器证书,但似乎没有正确指定 CA 证书。

需要将 CA 证书正确指定给 curl,以便 curl 可以使用它来验证服务器证书的签发者。以下是正确的命令:

curl https://artisan.com --resolve artisan.com:443:192.168.3.103 --cacert /cert/ca.crt

在这个命令中,--cacert 选项被用来指定 CA 证书的路径,这样 curl 就可以使用它来验证服务器证书的签发者。


使用ca根证书,而非签发的server.crt 证书进行访问

curl  https://artisan.com --resolve artisan.com:443:192.168.3.103  --cacert /cert/ca.crt

如上命令,OK


7. 使用IP访问

在这里插入图片描述

会报错如上信息, 因为我们签发的证书的csr中,使用的是域名 artisan.com

openssl req -new -key server.key -subj "/CN=artisan.com" -out server.csr

这个错误通常意味着服务器证书中指定的域名与请求的域名不匹配。这可能是因为正在使用的证书是针对另一个域名签发的,或者服务器配置不正确。

要解决这个问题,您可以采取以下步骤:

  1. 检查证书的域名: 确保服务器证书是针对正在访问的域名签发的。可以使用以下命令检查证书中的主题信息:

    openssl x509 -in /cert/server.crt -noout -subject
    

    如果主题信息中的域名与正在访问的域名不匹配,那么需要获取一个正确匹配的证书。

  2. 检查服务器配置: 确保服务器配置正确,将证书配置为与正在访问的域名匹配。检查服务器配置文件,确保域名和证书的匹配性。

  3. 重新签发证书: 如果服务器证书确实是针对错误的域名签发的,需要重新签发一个正确匹配的证书。使用正确的域名生成证书签名请求 (CSR),并使用 CA 对其进行签名。

  4. 更新 DNS 记录: 如果更改了服务器证书针对的域名,确保更新 DNS 记录,以便域名解析到正确的服务器 IP 地址。

  5. 检查证书链: 确保服务器证书的颁发机构是信任的,并且证书链是完整的。您可以使用以下命令检查证书链的完整性:

    openssl s_client -connect artisan.com:443 -showcerts
    

    如果证书链不完整或不信任,需要安装完整的证书链或信任颁发机构的根证书。

解决办法将证书信息追加到

/etc/pki/t1s/certs/ca-bunde.crt

在这里插入图片描述

在这里插入图片描述

这篇关于PKI - 借助Nginx 实现Https_使用CA签发证书的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702126

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se