OpenSSL 加密算法与证书管理全解析:从基础到私有 CA 实战

目录

一、加密算法和协议

1、对称加密算法

2、非对称加密算法

①非对称加密实现加密

②非对称加密实现数字签名

[③ RSA,DSA(了解)](#③ RSA,DSA(了解))

3、单向哈希算法

4、综合应用多种加密算法

①实现数据加密

②实现数字签名

[③ 综合加密和签名](#③ 综合加密和签名)

二、CA和证书

1、中间人攻击

2、CA和证书

3、安全协议SSL/TLS

4、HTTPS

三、OpenSSL

1、Base64编码

2、openssl命令

①openssl单向哈希加密

[②openssl passwd生成用户密码](#②openssl passwd生成用户密码)

③openssl生成随机数

④openssl实现密钥对

四、建立私有CA实现证书申请颁发

1、创建私有CA

①创建CA所需要的文件

②生成CA私钥

③生成CA自签名证书

2、申请证书并颁发证书

①为需要使用证书的主机生成私钥

②为需要使用证书的主机生成证书申请文件

③用CA签署证书并将证书颁发给请求者

④查看证书中信息

3、吊销证书


一、加密算法和协议

互联网不能直接发送明文数据,明文传输会暴露信息内容,导致数据被窃取、篡改或滥用,通过加密保护数据机密性、完整性和来源真实性。

1、对称加密算法

对称加密算法(Symmetric Encryption Algorithm)是一种使用相同密钥进行数据加密和解密的加密方式,其核心特点是加密和解密过程共享同一把密钥。

例如:A通过互联网跟B进行通信,A将明文(原始数据)通过密钥生成密文(加密后的数据)传输发给B,由于A,B之间使用同样的密钥,因此B可将接收到的密文进行解密还原出原始数据。

特性:

⚪ 加/解密使用同一个密钥,效率高。

⚪ 将原始数据分割成固定大小的块,逐个进行加密。

缺点:

⚪ 密钥过多。

⚪ 密钥分发。

⚪ 数据来源无法确认。

例子解释:

1.多用户场景下,对称加密要为每对客户分配独立密钥才能实现通信安全,密钥数量随用户数增加,管理成本高。

2.密钥使用之前双方需要协商,则第一次传输时无加密是明文传输存在风险,无法安全通信。

3.多个用户之间使用同样的密钥,发送的密文互相可解密,无法保证数据来源。

常见算法:

DES(56bits)、3DES、AES(128,192,256bits)、Blowfish

2、非对称加密算法

非对称加密算法(Asymmetric Encryption Algorithm),它使用一对密钥------公钥(Public Key)和私钥(Private Key)实现加密、解密、数字签名和密钥交换等功能。

用公钥加密数据,只能使用与之对应的私钥解密,反之亦然。密钥是成对出现。

⚪公钥:公开给所有人,用于加密数据或验证签名。

⚪私钥:自己留存,严格保密,用于解密数据或生成签名。

功能:

数据加密:适合加密较小数据,比如:加密对称密钥。

数字签名:主要在于让接收方确认发送方身份。

缺点:

⚪密钥长,算法复杂。

⚪加密解密效率低下。

常见算法:

RSA:是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,可实现加密和数字签名。

DSA:数字签名算法,是一种标准的 DSS(数字签名标准)。

ECC:椭圆曲线密码编码学,比RSA加密算法使用更小的密钥,提供相当的或更高等级的安全。

①非对称加密实现加密

发送者:自己的公钥、自己的私钥、接收者的公钥;

接收者:自己的公钥、自己的私钥、发送者的公钥;

用公钥加密数据,只能使用与之对应的私钥解密。

例如:A跟B通过互联网进行通信,A将数据通过B的公钥加密发送给B,B收到密文后用自己的私钥解密------>保证数据在网络上传输的安全性(只有B的私钥才可以解密),但是无法证明数据是A发送的。

②非对称加密实现数字签名

发送者:自己的公钥、自己的私钥、接收者的公钥;

接收者:自己的公钥、自己的私钥、发送者的公钥;

用公钥加密数据,只能使用与之对应的私钥解密。

例如:A跟B通过互联网进行通信,A将数据通过自己的私钥加密发送给B,B收到密文后用A的公钥解密------>保证数据的来源是A,但是无法保证数据在网络上传输的安全性(其他用户拿到A的公钥可以解密)。

③ RSA,DSA(了解)

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多。

3、单向哈希算法

哈希算法:也称为散列算法,将任意长度的输入数据(如消息、文件)映射为固定长度的哈希值,称为digest,即摘要。

特性:

⚪任意长度输入,固定长度输出。

⚪修改数据的微小变化会导致哈希值发生显著且不可预测的变化。

⚪无法从哈希值反推出原始输入数据,即哈希函数是单向的。

功能:通过对比哈希值,可高效检测数据是否被篡改(数据完整性)。

常见算法:(算法不同,得到的哈希值长度也不一样)

md5 (128bits)、sha1 (160bits)、sha224、sha256、sha384、sha512

复制代码
#默认md5算法
[root@ubuntu-158 ~]#md5sum /etc/passwd
bf3f08e6f2c9394b8a4f94b67a8d6337  /etc/passwd

#sha1
[root@ubuntu-158 ~]#sha1sum /etc/passwd
aa2a68b2196a862a79aa4786b65ded88b395f9ff  /etc/passwd

常用工具:

md5sum、sha1sum、sha256sum、sha512sum、openssl、gpg、rpm -V

4、综合应用多种加密算法

①实现数据加密

实现数据加密,无法验证数据完整性和来源

bash 复制代码
Key(data)+Pb(key)

A跟B通信,A发送数据给B,并将原始数据进行对称密钥加密,再用B的公钥加密对称密钥,数据在传输过程中,只有B的私钥能解密出对称密钥,有了对称密钥就可解密出原始数据------>保证数据在网络上传输的安全,但无法验证数据完整性和来源;

此时,如果C跟A共享同一密钥key,并且C是有B的公钥可加密,同样将密文发送给B,B收到来自C的密文照样也可以解密出原始数据------>无法保证数据完整性和来源。

②实现数字签名

不加密数据,可以保证数据来源的可靠性、数据的完整性和一致性。

bash 复制代码
data+Sa(hash(data))

A跟B通信,A发送数据给B,数据是明文传输,但是用哈希算法将A的原始数据的摘要算出并将其用A的私钥加密,B收到后根据明文同样可计算出摘要,如果B有A的公钥则可以成功解密出摘要------>保证数据的来源是A,B用自己算出的摘要跟解密出的摘要对比------>相同------>保证数据完整性,传输过程没有被篡改;反之亦然。

③ 综合加密和签名

即实现数据加密,又可以保证数据来源的可靠性、数据的完整性和一致性。

复制代码
方法1:Pb{Sa[hash(data)]+data}

A跟B通信,A发送数据给B,数据是明文传输,并且A将明文数据和通过哈希算法算出的A的原始数据并用A的私钥加密的摘要再通过B的公钥整体进行加密发送给B------>保证数据在网络上传输的安全(只有B的私钥可以解密),解密后得到明文和经过A私钥加密的明文摘要,B根据明文计算出摘要,如果B有A的公钥则可以成功解密出摘要------>保证数据的来源是A,再将B自己算出的摘要跟解密出的摘要对比------>相同------>保证数据完整性;反之亦然。

复制代码
方法2:对称key{Sa[hash(data)]+data}+Pb(对称key)

A跟B通信,A发送数据给B,A通过对称密钥将明文和经过A的私钥加密的明文摘要整体加密,再将对称密钥用B的公钥加密,只有B的私钥才能解密出对称密钥------>保证数据在网络上传输的安全,B通过对称密钥解密出明文和A的私钥加密的明文摘要,B如果有A的公钥则可以成功解密出摘要------>保证数据的来源是A,再将B自己算出的摘要跟解密出的摘要对比------>相同------>保证数据完整性;反之亦然。

综上1,2:两种综合加密方法的前提------>A,B之间已经互换了公钥,如果没有这个前提,两种加密算法就不成立,问题:如何让A,B之间互换公钥,或者AorB自己拿到的公钥就一定是BorA的?

二、CA和证书

1、中间人攻击

正常情况:

A:自己的公钥、自己的私钥、B的公钥

B:自己的公钥、自己的私钥、A的公钥

中间人攻击:

A:自己的公钥、自己的私钥、MITM的公钥(A误以为是B的公钥)

B:自己的公钥、自己的私钥、MITM的公钥(B误以为是A的公钥)

MITM:A的公钥、B的公钥

后果:通信双方对于中间人完全透明,中间人攻击导致通信双方的隐私数据被拦截、敏感信息被窃取或通信内容被篡改。

2、CA和证书

CA(证书颁发机构,Certificate Authority)------网络世界的"身份证办理中心",它的核心作用是给网站、软件或设备颁发"电子身份证"(即SSL/TLS证书),证书在整个互联网中是可信的,以此来确保通信双方的身份真实性。

体系:

⚪根CA

根CA证书是自签名(自己私钥),操作系统内置根CA证书;

不直接签发用户证书,为中间CA做背书,签发二级CA授权证书,由二级CA进一步签发终端用户或服务器证书。

⚪中间CA

中间CA由根CA授权并颁发证书,可签发下一级中间CA或直接签发终端用户或服务器的证书。

⚪终端用户CA

终端用户CA的证书由中间CA签名颁发,终端用户CA直接面向最终用户,接收用户申请,提供证书签发、更新、撤销等全生命周期管理服务。

证书类型:

证书授权机构的证书、服务器证书、用户证书。

获取证书途径:

⚪自签名的证书: 自已签发自己的公钥。

⚪使用证书授权机构:

①生成证书请求 csr。

②将证书请求csr 发送给CA。

③CA 颁发签名证书。

A跟B通信,为了避免中间人攻击,不再交换公钥,而是互换证书,A和B向CA机构申请签发证书,证书中有用户公钥、用户相关信息,申请证书前要提交给CA机构审核再签发,对于证书签发完后会有证书颁发机构信息、证书有效期,CA机构将其和用户公钥、用户相关信息进行哈希摘要算法计算出摘要再用CA机构私钥进行加密得到数字签名再放入证书中;

设想中间人攻击情况,CA机构证书已经在操作系统上内置,证书中存着CA机构的公钥,MITM有CA机构的公钥,可以解密得到数字签名(摘要)但是无法修改------>CA机构的私钥加密,证书的前四部分通常是明文存储,就算被MITM篡改数据,当B收到证书后通过哈希摘要算法计算出前四部份的摘要,再通过CA机构的公钥解密得到数字签名(摘要)进行对比,就能够得知数据是否被篡改------>进而得知证书是否可信。

3、安全协议SSL/TLS

SSL/TLS协议是一种用于在计算机网络上进行安全通信的传输协议,通过加密算法对传输的数据进行加密,通过数字证书验证通信双方的身份,以及通过消息认证码(MAC)确保实现数据"机密性、完整性、身份认证"。

SSL(Secure Sockets Layer 安全套接字层),TLS(Transport Layer Security 传输层安全协议)

SSL子协议:

Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换。

ChangeCipherSpec 协议:一条消息表明握手协议已经完成。

Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告。

Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。

工作原理:

1、客户端发起连接:客户端向服务器发起一个安全连接请求,通常通过URL中的https来完成。

2、服务器提供证书:服务器响应客户端的请求,将自己的证书发送给客户端。证书由颁发机构(CA)签发,用于验证服务器的身份。

3、证书验证:客户端使用操作系统内置CA机构证书的中的公钥解密并验证服务器证书数字签名。同时,检查证书的有效期、撤销状态以及证书中的域名是否与请求的服务器域名匹配。

4、密钥交换:如果证书验证成功,客户端使用证书中的公钥(服务器)加密一个随机密钥(预主密钥),并将其发送给服务器。服务器使用自己的私钥解密这个预主密钥。

5、建立加密会话:客户端和服务器使用预主密钥生成会话密钥,并使用这个密钥对接下来的通信进行加密。

6、加密通信:一旦安全通道建立,客户端和服务器就可以开始加密的通信了。

4、HTTPS

HTTPS 协议:就是"HTTP 协议"和"SSL/TLS 协议"的组合。HTTP over SSL 或 HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输。

工作原理:

  1. 客户端发起HTTPS请求:用户在浏览器里输入一个https网址,然后连接到服务器的443端口。

  2. 服务端的配置:采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。

  3. 传送服务器的证书给客户端:证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等。

  4. 客户端解析验证服务器证书:这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构(不在受信任列表中),过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书中公钥对该随机值进行非对称加密。

  5. 客户端将加密信息传送服务器:这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

  6. 服务端解密信息:服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值。

  7. 服务器加密信息并发送信息:服务器将数据利用随机值进行对称加密,再发送给客户端。

  8. 客户端接收并解密信息:客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容。

三、OpenSSL

OPENSSL是一个开源的软件库,它支持传输层安全性(TLS)和安全套接字层(SSL)协议的开源实现。OPENSSL提供了生成密钥对、管理证书(创建、申请、颁发、吊销等)以及为客户端应用提供加密和解密的功能,被广泛应用于Web服务器(如NGINX)、电子邮件服务器、VPN等各种应用中,以确保通信的安全。

官网:https://www.openssl.org/

包括三个组件:

⚪libcrypto:用于实现加密和解密的库。

⚪libssl:用于实现ssl通信协议的安全库。

⚪openssl:多用途命令行工具。

1、Base64编码

Base64是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

核心目的:将不可见或非ASCII字符的二进制数据转换为可见的ASCII字符串,以便在文本协议或环境中安全传输和存储。

编码过程:将原始二进制数据按每3个字节分组存入(24位)缓冲区,不足3字节时用0补足剩余位;随后从缓冲区中依次取出6位(共4组),每组6位高位补2个0形成新字节,计算其十进制值并映射至64字符编码表,最终按顺序输出对应字符,完成全部数据编码;若末组不足6位,通过填充=确保输出长度为4的倍数。

复制代码
[root@rocky8-153 ~]#echo Man | base64
TWFuCg==

TWFU---MAN 因为包含换行符\t ascii->10 00001010 
取六位000010 base64=C 10补四个0 100000 base=g 

2、openssl命令

|--------|-------------------------|--------|
| 子命令类型 | En | 备注 |
| 标准命令 | Standard commands | |
| 消息摘要命令 | Message Digest commands | 配合不同算法 |
| 加密命令 | Cipher commands | 配合不同算法 |

复制代码
openssl command [ command_opts ] [ command_args ]
openssl list [ standard-commands | digest-commands | cipher-commands | cipher-algorithms | digest-algorithms | public-key-algorithms]
openssl no-XXX [ arbitrary options ]

openssl交互和非交互式查看版本

复制代码
[root@ubuntu-158 ~]#openssl version
OpenSSL 3.4.1 11 Feb 2025 (Library: OpenSSL 3.4.1 11 Feb 2025)

[root@rocky8-153 ~]#openssl 
OpenSSL> version
OpenSSL 1.1.1k  FIPS 25 Mar 2021

获得帮助

复制代码
[root@ubuntu-158 ~]#openssl help
help:

Standard commands
asn1parse         ca                ciphers           cmp               
cms               crl               crl2pkcs7         dgst              
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
fipsinstall       gendsa            genpkey           genrsa            
help              info              kdf               list              
mac               nseq              ocsp              passwd            
pkcs12            pkcs7             pkcs8             pkey              
pkeyparam         pkeyutl           prime             rand              
rehash            req               rsa               rsautl            
s_client          s_server          s_time            sess_id           
smime             speed             spkac             srp               
storeutl          ts                verify            version           
x509              

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        md4               md5               
rmd160            sha1              sha224            sha256            
sha3-224          sha3-256          sha3-384          sha3-512          
sha384            sha512            sha512-224        sha512-256        
shake128          shake256          sm3               

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb      
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb      
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1     
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb      
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8     
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64            
bf                bf-cbc            bf-cfb            bf-ecb            
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast              
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb         
cast5-ofb         des               des-cbc           des-cfb           
des-ecb           des-ede           des-ede-cbc       des-ede-cfb       
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb      
des-ede3-ofb      des-ofb           des3              desx              
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          sm4-cbc           sm4-cfb           
sm4-ctr           sm4-ecb           sm4-ofb           zlib              
zstd              

获取指定命令帮助

复制代码
#二级命令+选项
[root@ubuntu-158 ~]#openssl md5 --help
...

#二级命令+三级命令
[root@ubuntu-158 ~]#openssl help md5
...

分类列出所有命令和算法

复制代码
#列出所有标准命令
[root@ubuntu ~]# openssl list --commands

#列出所有摘要命令
[root@ubuntu ~]# openssl list -digest-commands
#列出所有摘要算法
[root@ubuntu ~]# openssl list -digest-algorithms

#列出所有加密命令
[root@ubuntu ~]# openssl list -cipher-commands
#列出所有加密算法
[root@ubuntu ~]# openssl list -cipher-algorithms 

①openssl单向哈希加密

复制代码
openssl digest-commands [options] [file...]
openssl dgst -commands [options] [file...]

#查看帮助
man dgst

#摘要命令和算法
[root@ubuntu-158 ~]#openssl list -digest-commands 
blake2b512        blake2s256        md5               rmd160            
sha1              sha224            sha256            sha3-224          
sha3-256          sha3-384          sha3-512          sha384            
sha512            sha512-224        sha512-256        shake128          
shake256          sm3               
[root@ubuntu-158 ~]#openssl list -digest-algorithms 

[root@ubuntu-158 ~]#openssl md5 /etc/issue
MD5(/etc/issue)= 80e9b443d9e48e486906b662863590b1
[root@ubuntu-158 ~]#openssl dgst -md5 /etc/issue
MD5(/etc/issue)= 80e9b443d9e48e486906b662863590b1

[root@ubuntu-158 ~]#md5sum /etc/issue
80e9b443d9e48e486906b662863590b1  /etc/issue

[root@ubuntu-158 ~]#openssl sha512 /etc/issue
SHA2-512(/etc/issue)= 09241a0f9b17f8be4ad21852e36e2d5b2927c735bcdc41eebee257046b19eb79ba5f88e244b8cde1dab7673c6dd91b09d64ab967fbdc807f1dbdab5c6ba2fd73
[root@ubuntu-158 ~]#openssl dgst -sha512 /etc/issue
SHA2-512(/etc/issue)= 09241a0f9b17f8be4ad21852e36e2d5b2927c735bcdc41eebee257046b19eb79ba5f88e244b8cde1dab7673c6dd91b09d64ab967fbdc807f1dbdab5c6ba2fd73

[root@ubuntu-158 ~]#sha512sum /etc/issue
09241a0f9b17f8be4ad21852e36e2d5b2927c735bcdc41eebee257046b19eb79ba5f88e244b8cde1dab7673c6dd91b09d64ab967fbdc807f1dbdab5c6ba2fd73  /etc/issue

#dgst 默认sha256
[root@ubuntu-158 ~]#openssl dgst /etc/passwd
SHA256(/etc/passwd)= d73c6afa4754f06166c007db2fd76470c97f255346c38bb20337ab0cfcefd008

[root@ubuntu-158 ~]#openssl sha256 /etc/passwd
SHA2-256(/etc/passwd)= d73c6afa4754f06166c007db2fd76470c97f255346c38bb20337ab0cfcefd008

②openssl passwd生成用户密码

复制代码
penssl passwd [options...] STRING

#常用选项
-help              #获取帮助信息
-in infile         #从文件读取要加密的内容
-noverify          #从标准输入接收密码时,不用输两次
-quiet             #不输出告警信息
-table             #以表格形式输出
-salt val          #手动指定盐值,默认每次自动随机生成
-stdin             #从标准输入接收要加密的内容
-6                 #使用SHA512 算法加密
-5                 #使用SHA256 算法加密
-apr1              #使用 apache 特有的MD5 算法加密
-1                 #使用MD5 加密算法
-aixmd5            #使用AIX MD5 加密算法
-rand val          #将文件加到随机数生成器
-writerand outfile #将此过程中产生的随机数写到指定文件

-crypt             #标准unix密码加密算法,旧版中默认项

#帮助
man openssl passwd
openssl passwd --help
openssl help passwd

#默认采用md5算法 
[root@ubuntu-158 ~]#openssl passwd 12345
$1$xHJhTCW0$RlgB4grydBU2xhZizZdWE1


#交互式[root@rocky8-153 ~]#openssl passwd
Password: 
Verifying - Password: 
.nC8X.5lZb9Tk

[root@ubuntu-158 ~]#openssl passwd -1 12345
$1$do785afy$5B4ib76kaWBAGXJRPoyku1

#sha256
[root@ubuntu-158 ~]#openssl passwd -5 12345
$5$HZ0KiGEiLCpHxr1d$OzLe6OQUWDMJkR7gWtPm3RqY5.BxPUoOQWKXAK3mdIB

#标准输入读取
[root@ubuntu-158 ~]#echo 12345 | openssl passwd -stdin
$1$LhZqF9.t$RpdwI0tnFdyvTOlfMf2tl.

指定盐值

复制代码
[root@ubuntu-158 ~]#openssl passwd -1 -salt abcde 12345
$1$abcde$pTFEaLhoD5SEeC0X0QkoJ0

[root@ubuntu-158 ~]#openssl passwd -1 -salt abcde 12345
$1$abcde$pTFEaLhoD5SEeC0X0QkoJ0

[root@ubuntu-158 ~]#openssl passwd -1 -salt abc890 12345
$1$abc890$hI/ap27qgjLXmMdeQGLWl/

[root@ubuntu-158 ~]#openssl passwd -1 -salt abc890 12345
$1$abc890$hI/ap27qgjLXmMdeQGLWl/

[root@ubuntu-158 ~]#getent shadow root hu
root:$y$j9T$Mjs0te1PjdwzGVEl..Fp/1$UI5Ec89xuvyJI9gf7q0a0TLUA1MHVKBC7sK4gLY0R50:20353:0:99999:7:::
hu:$6$a/IhWZ2BNfQjEQlS$R4qGmJ7AIEe0oZ34dBFZas/9McOmQbz9mKiZd6U.obB21jPYFEkXmu2fpHMT.lMt6lesF3MWC88rYICbIFgNQ/:20351:0:99999:7:::

[root@ubuntu-158 ~]#getent shadow root hu | cut -d: -f2
$y$j9T$Mjs0te1PjdwzGVEl..Fp/1$UI5Ec89xuvyJI9gf7q0a0TLUA1MHVKBC7sK4gLY0R50

$6$a/IhWZ2BNfQjEQlS$R4qGmJ7AIEe0oZ34dBFZas/9McOmQbz9mKiZd6U.obB21jPYFEkXmu2fpHMT.lMt6lesF3MWC88rYICbIFgNQ/

#$ y        加密算法
#$ j9T      盐值
#$ Mjs0te1PjdwzGVEl..Fp/1$UI5Ec89xuvyJI9gf7q0a0TLUA1MHVKBC7sK4gLY0R50    加密后密文

相同加密算法,相同内容相同盐值的情况下,加密后的内容也相同

复制代码
[root@ubuntu-158 ~]#openssl passwd -6 -salt a/IhWZ2BNfQjEQlS 12345
$6$a/IhWZ2BNfQjEQlS$R4qGmJ7AIEe0oZ34dBFZas/9McOmQbz9mKiZd6U.obB21jPYFEkXmu2fpHMT.lMt6lesF3MWC88rYICbIFgNQ/
[root@ubuntu-158 ~]#openssl passwd -6 -salt a/IhWZ2BNfQjEQlS 12345
$6$a/IhWZ2BNfQjEQlS$R4qGmJ7AIEe0oZ34dBFZas/9McOmQbz9mKiZd6U.obB21jPYFEkXmu2fpHMT.lMt6lesF3MWC88rYICbIFgNQ/

不指定盐值,每次都会随机生成

html 复制代码
[root@ubuntu-158 ~]#openssl passwd -6 12345
$6$S6yGpmwezSPsfhxY$PSnp8A3V5xPmXpnueAIgqor6jP25zkxQh3zpsjt66.QAn3aQvKC1VoN5yVT3Z.2ODMxGUFYxG75KTA9LCBdvE/
[root@ubuntu-158 ~]#openssl passwd -6 12345
$6$9EGpkEwRxAJQciCL$gAp7lkTLOlMPNqvTc1Lndd/PaC1STZD3IFyahs9MNSoBpdHOPBgQv0H5r1ZOk8JA7.jT0LsaJUhfy2GkE649T1

③openssl生成随机数

随机数生成器:伪随机数字,利用键盘和鼠标,块设备中断生成随机数

/dev/random #仅从熵池返回随机数;随机数用尽,阻塞

/dev/urandom #从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞

html 复制代码
openssl rand [options...] NUM

NUM                 #字符个数 
-help               #获取帮助信息
-out outfile        #输出到指定文件
-rand val           #将文件加到随机数生成器
-writerand outfile  #将此过程中产生的随机数写到指定文件
-base64             #base64编码后显示
-hex                #16进制显示
-engine val         Use engine, possibly a hardware device

#帮助
openssl rand --help
openssl help rand
html 复制代码
##直接使用会乱码,默认是以二进制输出,不一定都是可打印字符
[root@ubuntu-158 ~]#openssl rand 8
(B±K[root@ubuntu-158 ~]#openssl rand 8
XνH[root@ubuntu-158 ~]#openssl rand 8
ΞX[root@ubuntu-158 ~]#openssl rand 8
;"啧+қroot@ubuntu-158 ~]#openssl rand 8
L>>I`s[root@ubuntu-158 ~]#openssl rand 8
ꈛroot@ubuntu-158 ~]#

#转Base64,不够=补齐
[root@ubuntu-158 ~]#openssl rand -base64 8
RWiyNduLuDc=

[root@ubuntu-158 ~]#openssl rand -base64 8
WrWmdJwJp1w=
html 复制代码
#随机生成10位长度密码
[root@ubuntu-158 ~]#openssl rand -base64 10 | head -c10
gv6zcFKWIc

[root@ubuntu-158 ~]#tr -dc '[:alnum:]' < /dev/urandom | head -c10
XCm0cPWz5I

#面试题:创建10个新用户,并指定8个字符长度的随机密码
[root@ubuntu-158 ~]#cat a.sh
#!/bin/bash

for i in {1..10};do
	useradd user$i;
	pwd=`openssl rand -base64 10 | head -c8`

	echo user$1:$pwd >> shadow.txt
	echo -e "${pwd}\n${pwd}" | passwd user$i

done

[root@ubuntu-158 ~]#cat a.sh
#!/bin/bash

for i in {1..10};do
	useradd user$i;
	pwd=`openssl rand -base64 10 | head -c8`

	echo user$1:$pwd >> shadow.txt
	echo $pwd | passwd --stdin user$i

done

④openssl实现密钥对

生成私钥,再从私钥中提取公钥

html 复制代码
#生成私钥,私钥包含公钥信息
openssl genrsa [options...] [NUM]

#常用选项
NUM                 #指定密钥长度,单位bit,默认2048
-help               #获取帮助信息
-out outfile        #输出到指定文件
-rand val           #以文件作随机数种子
-writerand outfile  #将此过程中产生的随机数写到指定文件
-passout val        #输出文件的保护口令
-*                  #加密算法
html 复制代码
#从私钥提取公钥
openssl rsa [options...]

#常用选项
-help               #获取帮助信息       
-inform format      #显示指定输入文件格式DEM|PEM,默认PEM
-outform format     #指定输出文件模式DER|PEM,默认PEM
-in val             #指定输入的文件,通常是私钥
-out outfile        #指定要输出的文件,不指定就是标准输出
-pubin              #从输入文件中读取公钥值,默认是读取私钥值
-pubout             #指定导出公钥,默认输出私钥
-passout val        #输出文件的保护口令
-passin val         #输入文件的保护口令
-RSAPublicKey_in    #输入文件格式为RSAPublicKey
-RSAPublicKey_out   #输出文件格式为RSAPublicKey
-noout              #不输出任何内容
-text               #输出所有信息
-modulus            #输出公钥信息
-check              #检查公钥是否匹配
-*                  #指定私钥的保护加密算法

#加密算法
aes128|aes192|aes256|aria128|aria192|aria256|camellia128|camellia192|camellia256|des|des3|idea
html 复制代码
#生成私钥
[root@ubuntu-158 hu]#openssl genrsa -out test.key 

[root@ubuntu-158 hu]#cat test.key 
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDV5Rr+3o+75QVX
jADsF0Ck3H+vrqe0nPVkRN9UsKUQbAsVPoZUCNNmrXBUCkV+ylJmtp5mEnAKJZqI
i42OkzWwP0tUEDmddC2DobqJD6PrTjxsfy0nhjiftwk8vGsWUjSc0hdte1wdCUGd
...
-----END PRIVATE KEY-----

#从指定私钥提取出公钥
#不指定输出文件,默认输出到终端
[root@ubuntu-158 hu]#openssl rsa -in test.key -pubout 
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1eUa/t6Pu+UFV4wA7BdA
pNx/r66ntJz1ZETfVLClEGwLFT6GVAjTZq1wVApFfspSZraeZhJwCiWaiIuNjpM1
sD9LVBA5nXQtg6G6iQ+j6048bH8tJ4Y4n7cJPLxrFlI0nNIXbXtcHQlBnbDvNNDO
1YSWs071nRxcsym5Ke/Ih5IDwtoMcotkuZ+1EhXLd+dyCxfVvrygBNoj/tuPluyU
ZSIoIZm5PbG6IcRbeHusS3KDQreRCaPzR26wAWC7b04d2h+G8y9qTTJV4JT5Gc2Y
v/TY9ntzvH2BK9l9tzjVqp/kMAgjP+fLvvcl9SG3sTz+PDbvY0HI+sOOlmLlNfm2
eQIDAQAB
-----END PUBLIC KEY-----

[root@ubuntu-158 hu]#openssl rsa -in test.key -pubout -out test2.pubkey
writing RSA key

[root@ubuntu-158 hu]#cat test2.pubkey 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1eUa/t6Pu+UFV4wA7BdA
pNx/r66ntJz1ZETfVLClEGwLFT6GVAjTZq1wVApFfspSZraeZhJwCiWaiIuNjpM1
sD9LVBA5nXQtg6G6iQ+j6048bH8tJ4Y4n7cJPLxrFlI0nNIXbXtcHQlBnbDvNNDO
1YSWs071nRxcsym5Ke/Ih5IDwtoMcotkuZ+1EhXLd+dyCxfVvrygBNoj/tuPluyU
ZSIoIZm5PbG6IcRbeHusS3KDQreRCaPzR26wAWC7b04d2h+G8y9qTTJV4JT5Gc2Y
v/TY9ntzvH2BK9l9tzjVqp/kMAgjP+fLvvcl9SG3sTz+PDbvY0HI+sOOlmLlNfm2
eQIDAQAB
-----END PUBLIC KEY-----

#这种写法也可
[root@ubuntu-158 hu]#openssl rsa -in test.key -pubout > test3.pubkey

生成私钥加密

html 复制代码
#指定加密算法,指定口令
[root@ubuntu-158 108]#openssl genrsa -out test.key -des3 -passout pass:"12345"

#解密加密的私钥
[root@ubuntu-158 108]#cat test.key 
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQVhURpVEvHdQ5i90o
zv534wICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIfwrfV1J7cGMEggTI
...
-----END ENCRYPTED PRIVATE KEY-----

#解密加密的私钥
[root@ubuntu-158 108]#openssl rsa -in test.key -pubout -out test2.pubkey

#提取公钥要求输入密码
[root@ubuntu-158 108]#openssl rsa -in test.key -pubout -out test2.pubkey
Enter pass phrase for test.key:
writing RSA key

[root@ubuntu-158 108]#ll 
total 16
-rw-r--r--  1 root root  451 Oct  8 18:10 test2.pubkey
-rw-------  1 root root 1862 Oct  8 18:09 test.key

[root@ubuntu-158 108]#cat test2.pubkey 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsikQgfMDFrXiWvyLhgWj
Tk2uBcdQDQhCgHuQ0huZSEvd30qIpAumCfzS/trepHZ+UDorh5MPI8E6QqZQ4zmn
nHt0cTLvgDarFcC8lIArCmqg9YLKQFvI9XRNz+UTK5NFvrfHuF9YHn4mvLKovU6W
lxuAcBu1nVqUcfXEpI5lHsxk8TvOZqjBLXLZT9iYo5VgdOO00usaJDt3pCs8+1bY
MWcvW6lsu87lnDBo+eY9w9YLviulukUUBBazEd7ezBHwSUzzdHSvbsXQZaesZKfl
e04mlT5KW/3qrVjzK6hhZZecp5Xyl3rCvY6m4bexY2x++2ODmHnN4pzsuYfItvVr
+wIDAQAB
-----END PUBLIC KEY-----

密钥文件要保证权限,在Centos8及以后,已经是600权限,为保证其他版本Centos权限问题

html 复制代码
(umask 666;openssl genrsa -out test.key)

四、建立私有CA实现证书申请颁发

证书申请及签署步骤:

  1. 生成证书申请请求

  2. RA核验

  3. CA签署

  4. 获取证书

复制代码
#安装包
[root@rocky8-153 ~]#yum install openssl-libs

#查看配置文件
[root@rocky8-153 ~]#cat /etc/pki/tls/openssl.cnf

#安装包
[root@ubuntu-158 108]#apt install libssl-dev

#查看配置文件
[root@ubuntu-158 108]#cat /etc/ssl/openssl.cnf

配置文件部分内容说明

复制代码
[ CA_default ]
[ CA_default ]
dir             = ./demoCA               # CA 根目录,所有与证书相关的文件目录
certs           = $dir/certs             # 存放签发的证书
crl_dir         = $dir/crl               # 存放 CRL(证书吊销列表)
database        = $dir/index.txt         # 证书数据库(记录签发的证书)
new_certs_dir   = $dir/newcerts          # 新签发证书的存储目录(按序列号命名)
certificate     = $dir/cacert.pem        # CA 机构自己的证书(公钥)
serial          = $dir/serial            # 证书编号文件,下一个证书编号,16进制
crlnumber       = $dir/crlnumber         # CRL 序列号文件(用于生成 CRL),存放当前CRL编号的文件
crl             = $dir/crl.pem           # CA证书吊销列表文件
private_key     = $dir/private/cakey.pem # CA 证书的私钥(必须严格保护)

[ policy_match ]
countryName            = match     # 必须与 CA 的国家代码一致
stateOrProvinceName    = match     # 必须与 CA 的省份一致
organizationName       = match     # 必须与 CA 的组织名称一致
organizationalUnitName = optional  # 不强制要求(可选)
commonName             = supplied  # 必须提供(如域名或用户名)
emailAddress           = optional  # 不强制要求

匹配策略,指用此CA颁发证书时,证书的相关字段与CA的值的匹配规则

|----------|----------------------|
| 匹配规则 | 说明 |
| match | 要求申请填写的信息跟CA设置信息必须一致 |
| optional | 可有可无,跟CA设置信息可不一致 |
| supplied | 必须填写这项申请信息 |

1、创建私有CA

①创建CA所需要的文件

复制代码
#创建相关目录
[root@ubuntu-158 108]#mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}

[root@ubuntu-158 108]#tree /etc/pki/CA
/etc/pki/CA
├── certs
├── crl
├── newcerts
└── private

4 directories, 0 files

②生成CA私钥

复制代码
[root@ubuntu-158 108]#cd /etc/pki/CA

[root@ubuntu-158 CA]#openssl genrsa -out private/cdkey.pem 2048

③生成CA自签名证书

openssl req用于生成证书签名请求,自签名证书。

-new:生成新证书签署请求

-x509:专用于CA生成自签证书

-key:生成请求时用到的私钥文件

-days n:证书有效期

-out /PATH/...:证书的保存路径

openssl x509允许用户查看、修改、转换和验证证书文件

复制代码
[root@ubuntu-158 CA]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN                             #国家代码           
State or Province Name (full name) [Some-State]:tianjin          #省/州
Locality Name (eg, city) []:tianjin                              #城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hcompany  #公司/单位
Organizational Unit Name (eg, section) []:HHH                     #部门
Common Name (e.g. server FQDN or YOUR name) []:test-certificate   #域名
Email Address []:3506934363@qq.com                                #邮箱

[root@ubuntu-158 CA]#ls
cacert.pem  certs  crl  newcerts  private

#查看证书
[root@ubuntu-158 CA]#cat cacert.pem 
-----BEGIN CERTIFICATE-----
MIIEATCCAumgAwIBAgIUfdOQV13NEl6fVJs/TnuNRT3rEewwDQYJKoZIhvcNAQEL
BQAwgY8xCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAd0aWFuamluMRAwDgYDVQQHDAd0
aWFuamluMREwDwYDVQQKDAhIY29tcGFueTEMMAoGA1UECwwDSEhIMRkwFwYDVQQD
...
-----END CERTIFICATE-----

#查看证书
[root@ubuntu-158 CA]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            7d:d3:90:57:5d:cd:12:5e:9f:54:9b:3f:4e:7b:8d:45:3d:eb:11:ec
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=tianjin, L=tianjin, O=Hcompany, OU=HHH, CN=test-certificate, emailAddress=3506934363@qq.com
        Validity
            Not Before: Oct  8 11:05:24 2025 GMT
            Not After : Oct  6 11:05:24 2035 GMT
        Subject: C=CN, ST=tianjin, L=tianjin, O=Hcompany, OU=HHH, CN=test-certificate, emailAddress=3506934363@qq.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b0:d3:8c:5d:ed:8e:cf:99:a8:5d:f2:d0:ed:1d:
                    b0:70:16:99:82:80:47:99:c5:c2:f8:0f:3d:d4:05:
                    38:34:73:e9:93:1f:8b:34:a5:61:25:84:9a:a1:de:
                   ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                83:35:29:EB:BE:49:F6:65:BA:28:16:6D:C9:50:15:FF:15:79:B6:1E
            X509v3 Authority Key Identifier: 
                83:35:29:EB:BE:49:F6:65:BA:28:16:6D:C9:50:15:FF:15:79:B6:1E
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        6f:d9:4b:d4:87:1f:47:e7:30:1b:99:dc:47:6a:35:ec:6f:f5:
        37:04:f9:5c:ca:1f:27:74:86:50:d2:52:8d:63:e8:35:95:1e:
        ba:aa:6b:1c:fc:28:2a:17:a3:c4:81:4d:41:3e:be:43:25:ee:
      ...

#导入到WINDOS中查看,添加后缀.crt
[root@ubuntu-158 CA]#sz cacert.pem 

2、申请证书并颁发证书

①为需要使用证书的主机生成私钥

复制代码
[root@ubuntu-158 108]#openssl genrsa -out test.key 2048

②为需要使用证书的主机生成证书申请文件

复制代码
#注意:默认要求国家,省,公司名称三项必须和CA一致
[root@ubuntu-158 108]#openssl req -new -key test.key -out test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:tianjin
Locality Name (eg, city) []:tianjin
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hcompany
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:test-cert
Email Address []:3506934363@qq.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[root@ubuntu-158 108]# ll
total 16
-rw-r--r--  1 root root 1029 Oct  8 19:22 test.csr
-rw-------  1 root root 1704 Oct  8 19:18 test.key

③用CA签署证书并将证书颁发给请求者

如果证书申请文件中的配置项与CA机构的匹配规则不一致,将无法签发证书。

索引文件:记录所有已颁发证书的元数据,相当于 CA 的"证书数据库"。用于查询、撤销或验证证书状态。

序号文件:存储下一个待颁发证书的序列号,确保每个证书的序列号唯一。

openssl ra用于证书签发、撤销、管理

复制代码
#创建索引文件
[root@ubuntu-158 CA]#touch index.txt

#创建序号文件
[root@ubuntu-158 CA]#echo 0F > serial

[root@ubuntu-158 CA]#ll
total 32
-rw-r--r-- 1 root root 1448 Oct  8 19:05 cacert.pem
drwxr-xr-x 2 root root 4096 Oct  8 18:44 certs/
drwxr-xr-x 2 root root 4096 Oct  8 18:44 crl/
-rw-r--r-- 1 root root    0 Oct  8 19:24 index.txt
drwxr-xr-x 2 root root 4096 Oct  8 18:44 newcerts/
drwxr-xr-x 2 root root 4096 Oct  8 18:55 private/
-rw-r--r-- 1 root root    3 Oct  8 19:24 serial

#签发证书
[root@ubuntu-158 CA]#openssl ca -in /root/hu/108/test.csr -out certs/test.crt -days 100
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15 (0xf)
        Validity
            Not Before: Oct  8 11:26:26 2025 GMT
            Not After : Jan 16 11:26:26 2026 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = tianjin
            organizationName          = Hcompany
            commonName                = test-cert
            emailAddress              = 3506934363@qq.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                0B:7B:A6:2E:3A:56:93:56:B0:1B:AD:99:69:08:E3:F4:20:24:C8:AD
            X509v3 Authority Key Identifier: 
                83:35:29:EB:BE:49:F6:65:BA:28:16:6D:C9:50:15:FF:15:79:B6:1E
Certificate is to be certified until Jan 16 11:26:26 2026 GMT (100 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Database updated

#查看
[root@ubuntu-158 CA]#tree /etc/pki/CA
/etc/pki/CA
├── cacert.pem
├── certs
│   └── test.crt
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│   └── 0F.pem
├── private
│   └── cakey.pem
├── serial
└── serial.old

5 directories, 9 files

#原来是0F,加1变成10
[root@ubuntu-158 CA]#cat /etc/pki/CA/serial
10

#V - 表示有效,260116 - 表示2026年11月6日过期,0F 表示证书编号
[root@ubuntu-158 CA]#cat /etc/pki/CA/index.txt
V	260116112626Z		0F	unknown	/C=CN/ST=tianjin/O=Hcompany/CN=test-cert/emailAddress=3506934363@qq.com

④查看证书中信息

复制代码
#根据编号查看状态
[root@ubuntu-158 CA]#openssl ca -status 0F
Using configuration from /usr/lib/ssl/openssl.cnf
0F=Valid (V)

[root@ubuntu-158 CA]#openssl x509 -in /etc/pki/CA/certs/test.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 15 (0xf)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=tianjin, L=tianjin, O=Hcompany, OU=HHH, CN=test-certificate, emailAddress=3506934363@qq.com
        Validity
            Not Before: Oct  8 11:26:26 2025 GMT
            Not After : Jan 16 11:26:26 2026 GMT
        Subject: C=CN, ST=tianjin, O=Hcompany, CN=test-cert, emailAddress=3506934363@qq.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a9:1b:0d:b9:4a:cf:6d:d3:98:0e:91:49:65:06:
                    3c:61:2f:2f:1d:81:b4:c9:1c:11:3a:84:c8:0c:3a:
                    fc:9a:eb:a7:cf:0a:d5:1f:dd:6e:26:2f:a3:24:3e:
                    ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                0B:7B:A6:2E:3A:56:93:56:B0:1B:AD:99:69:08:E3:F4:20:24:C8:AD
            X509v3 Authority Key Identifier: 
                83:35:29:EB:BE:49:F6:65:BA:28:16:6D:C9:50:15:FF:15:79:B6:1E
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        6b:43:a1:ab:70:6d:c3:9c:d1:2c:cd:5c:b5:e2:ce:b0:20:48:
        6c:7c:40:5d:13:4c:3b:2c:93:0e:35:38:f2:57:7a:ff:4b:e7:
        14:cd:a0:36:4c:2b:6f:9c:9f:89:2e:03:e3:53:5e:21:99:c2:
        ...

#导入到WINDOS中查看
[root@ubuntu-158 CA]#sz certs/test.crt 


解决:


3、吊销证书

客户端访问服务器,得到服务器的证书,要先去校验服务器证书的合法性,先看证书颁发的机构,如果颁发机构在客户端受信任列表可以进一步校验,如果不在压根不需要校验其证书。操作系统中查找颁发机构的证书,用来校验服务器的证书合法性,首先先看颁发机构吊销了哪些证书,如果吊销列表存在该服务器的证书,说明该服务器证书被颁发机构吊销失效。

在客户端获取要吊销证书的serial

复制代码
[root@ubuntu-158 CA]#openssl x509 -in /etc/pki/CA/certs/test.crt -noout -serial -subject
serial=0F
subject=C=CN, ST=tianjin, O=Hcompany, CN=test-cert, emailAddress=3506934363@qq.com

在CA上,根据客户提交的serial和subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书

复制代码
[root@ubuntu-158 CA]#openssl ca -revoke /etc/pki/CA/certs/test.crt 
Using configuration from /usr/lib/ssl/openssl.cnf
Revoking Certificate 0F.
Database updated

[root@ubuntu-158 CA]#cat /etc/pki/CA/index.txt
R	260116112626Z	251008120005Z	0F	unknown	/C=CN/ST=tianjin/O=Hcompany/CN=test-cert/emailAddress=3506934363@qq.com

指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行

复制代码
[root@ubuntu-158 CA]#echo 01 > /etc/pki/CA/crlnumber

更新证书吊销列表

复制代码
#-gencrl生成证书撤销列表crl
[root@ubuntu-158 CA]#openssl ca -gencrl -out /etc/pki/CA/crl.pem
Using configuration from /usr/lib/ssl/openssl.cnf

查看crl文件

复制代码
[root@ubuntu-158 CA]#openssl crl -in /etc/pki/CA/crl.pem -noout -text
Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=tianjin, L=tianjin, O=Hcompany, OU=HHH, CN=test-certificate, emailAddress=3506934363@qq.com
        Last Update: Oct  8 12:11:29 2025 GMT
        Next Update: Nov  7 12:11:29 2025 GMT
        CRL extensions:
            X509v3 CRL Number: 
                1
Revoked Certificates:
    Serial Number: 0F
        Revocation Date: Oct  8 12:00:05 2025 GMT
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        a4:fd:32:4d:60:1a:68:f3:c4:e1:cf:16:d1:4d:f5:16:92:e0:
        aa:93:72:dc:4d:fb:1b:07:a7:29:7e:1c:5a:5a:70:23:cd:29:
        6b:e2:5e:4b:e0:d7:81:62:f3:bc:e1:c5:f8:a1:53:43:8f:bf:
        70:25:d9:86:70:a6:32:c6:33:a1:ab:e1:a0:51:0c:e7:d9:35:
        8b:08:b1:8d:6c:5b:65:ad:51:3d:52:c7:48:e1:36:c3:31:75:
        b0:fa:11:d2:7c:b5:c4:df:f1:d5:06:bf:1c:cd:90:1f:09:51:
        c8:08:5e:bc:84:bd:03:b0:b5:6c:fe:0b:81:e5:7c:10:93:31:
        90:10:35:2e:0d:06:85:09:1d:10:06:1b:89:60:a1:8b:e9:0a:
        bc:a6:42:ca:b2:ac:f0:07:ad:03:5c:81:b0:82:ed:bd:e3:45:
        f2:81:2e:44:1d:0e:0c:eb:a9:95:1b:a6:5b:1a:cf:cf:b7:fb:
        09:e2:f1:ac:b0:6e:98:55:cc:54:8e:30:c4:08:d4:76:c0:34:
        25:a1:cd:36:f3:37:50:7d:00:b8:72:64:e8:22:54:d4:37:33:
        f1:c3:0d:7c:ae:33:9e:1b:ac:06:eb:3e:8a:98:a9:04:00:d4:
        dc:37:ed:e8:f5:c2:9b:13:0d:c2:3b:2d:3d:fe:c3:78:1b:53:
        5a:66:c1:f4
相关推荐
IT_Octopus20 小时前
https私人证书 PKIX path building failed 报错解决
java·spring boot·网络协议·https
艾菜籽20 小时前
网络原理-HTTPS
网络·网络协议·https
程序员三明治1 天前
HTTPS 真的牢不可破吗?—— 中间人攻击与安全机制解析
网络协议·安全·https
2501_915106321 天前
CDN 可以实现 HTTPS 吗?实战要点、部署模式与真机验证流程
网络协议·http·ios·小程序·https·uni-app·iphone
tryCbest2 天前
Windows和Linux设置Https(SSL)访问
linux·windows·https
Gary Studio3 天前
ESP32 IDF GET_HTTPS
网络协议·https·php
半桔3 天前
【网络编程】揭秘 HTTPS 数据安全:加密方案与证书体系的协同防护
linux·网络·网络协议·http·https
清静诗意4 天前
FRP v0.65.0 内网穿透专业指南(SSH + HTTP/HTTPS 一体化配置)
http·https·ssh·frp
想躺平的咸鱼干4 天前
ollama的下载以及Spring AI Alibaba的ChatModel和ChatClient的流式输出和在idea的实现
windows·https·idea·流式输出·springaialibaba·chatclient·chatmodel