当前位置: 首页 > article >正文

TLS与自签名证书的创建、作用、用到的工具等知识的介绍

一、OpenSSL 与KeyTool

1.1、OpenSSL

        1.1、是什么

        OpenSSL 是一个跨平台密码学工具套件,它实现了安全套接层(SSL)和传输层安全(TLS)的协议栈,还提供了各种加密算法(如对称加密(如 AES、DES)、非对称加密(如 RSA、DSA)和哈希函数(如 SHA-256))和数字证书管理功能,同时它提供了用于安全通信的协议。

        HTTPS 协议依赖于 SSL/TLS 加密来确保数据传输的安全性。

        1.1.2、能做什么

        通过OpenSSL命令,可以生成 .crt(证书)、.key(私钥)、.pem(证书私钥合并文件)、.crl(证书吊销列表)这些类型的文件

        1.1.3、Centos7 系统安装 OpenSSL 

        首先参考这里 更新yum源 。然后如下面所示, 安装 OpenSSL。

## 使用 yum方式安装OpenSSL
[root@keycloak2 ~]# yum install openssl -y
        1.1.4、证书生成命令(此处命令仅供参考,可靠的操作方法见2.1.2小节)
## 生成CA证书
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650   -keyout ca.key -out ca.crt -subj "/CN=Root CA"

## 签发终端证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key   -CAcreateserial -out server.crt -days 825 -sha256   -extfile <(printf "subjectAltName=DNS:example.com")
        1.1.5、加密方式(见2.1.2小节) 

1.2、KeyTool 

        1.2.1、是什么

        它是Java密钥库管理工具,集成于JDK安全体系,专注JKS/PKCS12密钥库管理,依赖Java Cryptography Architecture实现。

        1.2.2、能做什么

        它可以生成密钥对,创建和管理密钥库,导入和导出证书,查看密钥库内容

        1.2.3、证书生成命令(此处命令仅供参考,可靠的操作方法见3.2.2小节)
## 生成自签名证书
keytool -genkeypair -alias server -keyalg RSA -keysize 2048   -validity 365 -keystore keystore.jks   -dname "CN=example.com" -ext SAN=dns:example.com
        1.2.4、加密方式(见3.2.2小节) 

1.3、二者信任链机制对比

        

二、证书分类与对比

2.1、TLS证书

        2.1.1、TLS证书是什么

        TLS(Transport Layer Security)以前也被称为 SSL(Secure Sockets Layer)证书,它是采用X.509标准生成的数字证书。包含服务器公钥、主体标识信息和CA签名。主要用于在传输层建立加密通信通道,并验证服务器或客户端的身份,支持ECDSA、RSA等加密算法对数据进行加密,以确保数据传输的安全性和完整性。

        2.1.2、生成步骤与方式
## 1、生成CA密钥。
## 私钥由证书申请者保留,用于对数据进行签名等操作。公钥则会包含在 TLS 证书中,用于验证签名和加密数据。
[root@keycloak2 bin]# openssl genrsa -aes256 -out ca.key 2048

## 2、通过私钥创建CA证书
[root@keycloak2 bin]# openssl req -new -x509 -days 365 -key ca.key -out ca.crt

## 3、生成签名请求(CSR)。使用 openssl 命令将公钥生成CSR,这个CSR会发送到证书颁发机构CA。
[root@keycloak2 bin]# openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr

## 4、CA验证与签名。CA收到CSR后进行验证,通过后CA使用自己的私钥对CSR中的信息进行签名,生成TLS证书。
[root@keycloak2 bin]# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256

## 生产环境的私钥应加密存储,推荐 AES-256-CBC: 加密算法
[root@keycloak2 bin]# openssl rsa -aes256 -in server.key -out server.encrypted.key


       2.1.3、TLS目录体系
        “/etc/pki/tls/certs/”为TLS的证书中央存储库位置,包含

        服务器证书:如Apache、Nginx等服务的server.crt,包含公钥、主体信息及CA签名。

        中间CA证书:构成信任链的中间证书文件,通常以.chain.bundle后缀标识。

        证书捆绑文件:系统自动生成的ca-bundle.crt,集成所有受信CA证书。

        “/etc/pki/tls/private/”为私钥存储目录,包含

        RSA私钥:采用PEM格式存储的server.key等文件。

        ECC私钥:支持P-256、P-384等椭圆曲线的密钥文件。

        PKCS8 封装秘钥:通过openssl pkcs8转换的加密私钥。

        

2.2、自签名证书

        2.2.1、自签名证书是什么

        自签名证书是指由自己签发的证书,且没有被受信任的证书颁发机构(CA)认证而不受信任,因此在生产环境中会引起浏览器警告,故常用于测试环境。

        2.2.2、工作原理

        当客户端向服务器发起连接请求,并请求建立安全连接时,服务器会返回一个数字证书。客户端收到服务器的数字证书后验证证书的合法性,包括是否由CA签发、是否过期、证书的主题名称是否与访问的网站域名匹配等‌。如果数字证书被验证为有效,客户端和服务器之间就可以建立安全连接,开始在加密的通道上发送和接收数据‌,否则显示告警。

        2.2.3、生成私钥和自签名证书
## 使用下面命令,生成私钥 (server.key) 和一个自签名证书 (server.crt)
## 使用时,将“你的应用名称”部分字样,替换成你希望的名字即可。
## 其中 365是证书有效期, /etc/pki/tls/private/ 和 /etc/pki/tls/certs/ 是推荐的存储路径
## 其他参数的含义见上面三个步骤中的说明

## 生成RSA 私钥。在生成过程中需要你输入省份、城市、公司等一系列信息,可以一直回车不输入也可以根据实际情况输入即可。时刻谨记你是在生成“自签名”证书即可。
[root@keycloak2 ~]# openssl genrsa -out 你的应用名称.key 2048

## 通过私钥生成证书签名请求(CSR文件)
[root@keycloak2 ~]# openssl req -new -key 你的应用名称.key -out 你的应用名称.csr

## 使用CSR生成自签名证书
[root@keycloak2 ~]# openssl req -x509 -days 365 -newkey rsa:4096 -keyout /etc/pki/tls/private/你的应用名称.key -out /etc/pki/tls/certs/你的应用名称.crt -nodes -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/CN=你的应用名称.example.com"

2.3、二者与Https 的关系

        2.3.1、TLS 与Https的关系

        HTTPS 协议依赖于 SSL/TLS 协议来加密数据并确保数据传输的安全性,TLS 证书是 HTTPS 协议实现安全通信的核心组件。这意味着任何使用 HTTPS 的服务器都需要一个 SSL/TLS 证书来建立安全连接。

        2.3.2、自签名证书与Https的关系

        虽然自签名证书可以用于 HTTPS,但由于它们不被浏览器默认信任,因此会导致浏览器显示安全警告。同时使用自签名证书的 HTTPS 服务器可以加密数据,但用户需要手动信任该证书才能避免浏览器警告。

2.4、二者的信任机制关系

2.5、证书技术矩阵对比

       

2.6、证书文件存储位置对比 

三、证书管理

3.1、系统级证书管理

        CentOS 7采用动态证书管理系统,主要证书存储于

1、系统信任库:/etc/pki/ca-trust/source/anchors/
2、PEM格式证书:/etc/pki/tls/certs/
3、证书捆绑文件:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

3.2、应用级证书管理

        3.2.1、位置

        JDK 采用分层式证书管理体系,其核心证书库文件cacerts位于 

$JAVA_HOME/jre/lib/security/
该文件本质上是JKS(Java KeyStore)格式的密钥库 。此库文件默认包含DigiCert、GlobalSign等国际公认CA机构颁发的根证书,形成Java运行时的可信锚点。
        3.2.2、java秘钥操作
## 生成PKCS12密钥库
[root@keycloak2 ~]# keytool -genkeypair -alias server -keyalg RSA -keysize 2048   -validity 365 -keystore 你的应用名称.jks -storetype PKCS12   -dname "CN=server.example.com" -ext SAN=dns:server.example.com

## 导出证书
[root@keycloak2 ~]# keytool -exportcert -alias server -file 应用的别名.cer -keystore 你的应用名称.jks

## 密钥库加密
[root@keycloak2 ~]# keytool -importkeystore -srckeystore 你的应用名称.jks   -destkeystore 你的应用名称.p12 -deststoretype PKCS12   -deststorepass 'S3cureP@ssw0rd!' 
        3.2.3、导入方式 
## 定位目标证书库,该路径就是 3.1小节提到的核心证书文件的位置
[root@keycloak2 ~]# cd /usr/java/jdk1.8.0_161/jre/lib/security

## 执行证书导入指令
[root@keycloak2 ~]# keytool -import -alias custom_ca -file /path/to/certificate.crt -keystore cacerts

## 验证导入结果
[root@keycloak2 ~]# keytool -list -keystore cacerts -alias custom_ca

        3.2.4、keytool 中一些近似参数的对比

        export 和 exportcert 的作用完全相同,前者是后者的别名

        importcert专用于导入单个证书或证书链到信任库,而importkeystore用于密钥库级别的迁移操作

五、证书的用法

5.1、在NGINX 上的用法

## Nginx 配置文件
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/pki/tls/certs/你的应用名称.crt;
    ssl_certificate_key /etc/pki/tls/private/你的应用名称.key;
## 其中 ca-bundle.crt 文件中包含了一系列受信任的 CA 根证书
    ssl_trusted_certificate /etc/ssl/certs/ca-bundle.crt;
}

5.2、在 SpringBoot 上的用法

        通常,私钥或证书会放在 SpringBoot 项目的  src/main/resources/ 下

## SpringBoot 2.7.x以后,可以直接使用 pemg格式的私钥
## 在 application.yml 或 application.properties 上配置
server.port=8443
server.ssl.enabled=true
server.ssl.certificate=classpath:你的应用名称.crt
server.ssl.certificate-private-key=classpath:你的应用名称.key
## 但是在 SpringBoot 2.7.x之前的版本需要将 OpenSSL 工具生成的私钥转为 JKS或PKCS12格式 使用
## 转换PKCS12格式的方法如下,其中, --passout 参数是指定你的密码。如果不带这个参数,需要在命令执行过程中手动指定

[root@keycloak2 ~]# openssl pkcs12 -inkey 你的应用名称.key -in 你的应用名称.crt -export -out 你的应用名称.p12 -passout pass:YourPassword

## 然后在 application.yml 或者 application.properties 文件上配置
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:你的应用名称.p12
server.ssl.key-store-password=password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat

5.3、在Tomcat 上的用法

        通常,私钥或证书会放在 Tomcat 的 tomcat/conf/ 下。这里出现的password 就是在生成 p12格式文件过程中指定的密码。密码指定方法见上面 SpringBoot 的2.7.x 以前版本的那一步的说明。

## Tomcat 与 SpringBoot 2.7.x 之前版本的用法一样,要先将 秘钥转换为 PKCS12 格式后使用
## server.xml 中的配置
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
          maxThreads="150" scheme="https" secure="true"
          keystoreFile="/usr/local/tomcat/conf/你的应用名称.p12" 
          keystorePass="password"
          clientAuth="false" 
          sslProtocol="TLS" />

六、几种格式证书的区别联系

6.1、.jks与 .p12格式对比

        有的地方会让你在生成密钥时创建 keystore 格式文件(如jks文件)。这东西是Java特有的格式,主要用于存储私钥、证书和其他加密对象。它与PKCS12(即p12 文件) 的用法近似,后者是一种标准化的文件格式,用于存储私钥、证书和其他加密对象,它更中立,能被包括java、C++在内更多的语言支持,普适性更广泛。

        而且jdk9之后,PKCS12成为Java的默认keystore格式,取代了JKS。因此本文使用的是 p12文件,而没有举 jks 文件的例子。

        

6.2、.crt、.key 与 .pem 以及 .p12 格式文件的区别联系

        CRT文件:通常指证书文件,其扩展名可以是 .crt 也可以是 .pem。主要用于存储 SSL/TLS 证书。

        KEY文件:通常指私钥文件,其扩展名可以是 .key 也可以是 .pem。主要用于与证书配对使用,用于加密和解密数据。

        PEM文件:严格来说它与CRT、KEY文件不是同一维度的概念,它只是一种文本格式,使用 Base64 编码存储加密数据,其扩展名为 .pem。常用于 SSL/TLS 证书、SSH 密钥和 S/MIME 邮件加密。

        .p12文件:也是一种二进制格式,用于存储证书、私钥和中间证书。其特点在于它更多用于 Windows 和 macOS 操作系统中。


http://www.kler.cn/a/560981.html

相关文章:

  • 反向代理模块kfj
  • 实操解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题
  • escape SQL中用法
  • 力扣-贪心-135 分发糖果
  • 如何加固织梦CMS安全,防webshell、防篡改、防劫持,提升DedeCMS漏洞防护能力
  • 将Ubuntu操作系统的安装源设置为阿里云
  • java23种设计模式-原型模式
  • 【网络编程】UDP协议
  • Spring Boot 项目中,JDK 动态代理和 CGLIB 动态代理的使用
  • 【无标题】PHP-get_definde_vars
  • Unity汽车笔记
  • 三七互娱游戏策划岗内推
  • angular新闻列表分页
  • nodejs npm install、npm run dev运行的坎坷之路
  • Linux System V - 消息队列与责任链模式
  • linux应急响应-进程排查
  • VM C#脚本 调用命令行 以python为例
  • 搭建Appium工具环境
  • 赛前启航 | 三场重磅直播集结,予力微软 AI 开发者挑战赛!
  • 边缘安全加速(ESA)套餐