OpenSSL实验

文章目录

  • 一、OpenSSL安装
  • 二、OpenSSL配置
      • 常见路径
      • 查找配置文件的方法
      • 示例
      • **1. 配置文件结构**
      • **2. 主要段落及其作用**
        • **(1) 默认段(Default Section)**
        • **(2) OID段(OID Section)**
        • **(3) CA相关段(CA Section)**
        • **(4) 证书请求段(REQ Section)**
        • **(5) DN字段段(Distinguished Name Section)**
        • **(6) 扩展字段段(Extensions Section)**
      • **3. 配置文件的使用**
      • **4. 配置文件的高级用法**
      • **5. 注意事项**
  • 三、OpenSSL非对称密钥
    • 生成RSA密钥
    • 生成DH密钥及参数
    • 生成EC密钥
    • 生成SM2密钥
    • 使用openssl pkey将加密的私钥转换为明文私钥
    • 使用openssl asn1parse或其他ASN1解析工具,查看加密私钥、明文私钥、公钥内容
    • 使用gmssl
      • GmSSL
      • 密钥对生成
      • 签名验签
      • 加密解密
  • 四、OpenSSL杂凑和对称解密
      • 杂凑(Hash)
      • HMAC(消息认证码)
      • 加密
      • 解密
  • 五、OpenSSL创建根CA
      • `[ CA_default ]` 部分:
      • `[ req ]` 部分:
      • 配置
      • 执行
  • 六、OpenSSL创建中间CA和CRL
      • 配置
      • 执行
  • 七、OpenSSL签发终端用户证书
      • 配置
      • 执行
  • 八、OpenSSL签发服务器证书
      • 配置
      • 执行
      • 生成 CRL 步骤:
  • 九、OpenSSL提供OCSP服务
      • 生成 OCSP 服务密钥和证书
      • 启动 OCSP 服务
      • OCSP 客户端测试


一、OpenSSL安装

先查看系统相关信息

[root@testsvr ~]# cat /etc/os-release
NAME="openEuler"
VERSION="22.03 (LTS-SP3)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP3)"
ANSI_COLOR="0;31"

[root@testsvr ~]# uname -r
5.10.0-182.0.0.95.oe2203sp3.x86_64

[root@testsvr ~]# hostnamectl
 Static hostname: testsvr
       Icon name: computer-vm
         Chassis: vm
      Machine ID: 6994b28ec2914ac98303f773e970f959
         Boot ID: 7f75d528cb9e44f7b8d4d8dd112e009d
  Virtualization: vmware
Operating System: openEuler 22.03 (LTS-SP3)
          Kernel: Linux 5.10.0-182.0.0.95.oe2203sp3.x86_64
    Architecture: x86-64
 Hardware Vendor: VMware, Inc.
  Hardware Model: VMware Virtual Platform

使用的系统是openEuler 22.03 SP3

openEuler 是一个开源的 Linux 操作系统,由华为(Huawei)发起并维护,旨在为服务器、云计算、边缘计算等场景提供稳定、可靠、高性能的操作系统平台。它基于 CentOS 和其他开源技术构建,具有良好的兼容性和扩展性。

改系统已安装了OpenSSL,故此步骤跳过

[root@testsvr ~]# openssl version
OpenSSL 1.1.1wa  16 Nov 2023

若未进行安装可使用以下命令进行安装:

sudo yum update
sudo yum install openssl

二、OpenSSL配置

在Linux系统中,OpenSSL的配置文件通常名为openssl.cnf,其位置可能因安装方式和系统配置而有所不同。以下是一些常见的OpenSSL配置文件路径和查找方法:

常见路径

  1. /etc/ssl/openssl.cnf:这是许多Linux发行版中OpenSSL配置文件的默认位置。
  2. /etc/pki/tls/openssl.cnf:在某些系统(如CentOS、openEuler)中,配置文件可能位于此路径。
  3. /usr/local/ssl/openssl.cnf:如果OpenSSL是从源代码编译安装的,配置文件可能位于此路径。

查找配置文件的方法

  1. 使用find命令

    find / -name openssl.cnf 2>/dev/null
    

    这个命令会在整个文件系统中搜索名为openssl.cnf的文件,并忽略错误信息。

  2. 查看OpenSSL命令的配置文件路径

    openssl version -a
    

    这个命令会显示OpenSSL的版本信息以及编译时的配置路径。

  3. 检查环境变量: 如果系统设置了OPENSSL_CONF环境变量,可以通过以下命令查看其值:

    echo $OPENSSL_CONF
    

    如果该变量未设置,OpenSSL会使用默认路径。

示例

假设你使用的是openEuler系统,配置文件通常位于/etc/pki/tls/openssl.cnf。你可以通过以下命令确认:

cat /etc/pki/tls/openssl.cnf

如果不确定配置文件的位置,可以使用find命令进行全局搜索:

find / -name openssl.cnf 2>/dev/null

OpenSSL的配置文件openssl.cnf是一个关键的文件,用于定义OpenSSL的行为、证书的生成和管理等。以下是对openssl.cnf配置文件的详细解释,基于最新的搜索结果:

1. 配置文件结构

openssl.cnf文件由多个段(Section)组成,每个段以[section_name]开头,后面跟着一系列的name=value格式的指令。未被引用的段将被忽略。

2. 主要段落及其作用

(1) 默认段(Default Section)

默认段通常没有明确的名称,但也可以自定义名称。它定义了一些全局的默认设置。

ini复制

HOME = .
RANDFILE = $ENV::HOME/.rnd
oid_section = new_oids
  • HOME:定义了当前目录。
  • RANDFILE:定义了随机数文件的路径。
  • oid_section:指向其他定义了OID(对象标识符)的段。
(2) OID段(OID Section)

该段定义了自定义的OID,用于扩展证书的功能。

ini复制

[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
(3) CA相关段(CA Section)

该段定义了CA(证书颁发机构)的行为和路径。

ini复制

[ ca ]
default_ca = CA_default

[ CA_default ]
dir = /etc/pki/CA
certs = $dir/certs
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
serial = $dir/serial
private_key = $dir/private/cakey.pem
x509_extensions = usr_cert
default_days = 365
default_md = default
policy = policy_match
  • dir:CA的根目录。
  • certs:已颁发证书的存放目录。
  • database:证书数据库文件。
  • new_certs_dir:新证书的存放目录。
  • certificate:CA证书文件。
  • serial:序列号文件。
  • private_key:CA的私钥文件。
  • x509_extensions:证书扩展字段。
  • default_days:证书默认有效期。
  • default_md:默认的摘要算法。
  • policy:证书匹配策略。
(4) 证书请求段(REQ Section)

该段定义了生成证书请求时的默认设置。

ini复制

[ req ]
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
string_mask = utf8only
  • default_bits:私钥的默认位数。
  • default_md:默认的摘要算法。
  • default_keyfile:默认的私钥文件。
  • distinguished_name:引用DN(可识别名称)的设置。
  • x509_extensions:自签名证书的扩展字段。
  • string_mask:字符串类型掩码,推荐使用utf8only
(5) DN字段段(Distinguished Name Section)

该段定义了证书请求中需要填写的DN字段。

ini复制

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = XX
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
commonName = Common Name (eg, your name or your server's hostname)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
(6) 扩展字段段(Extensions Section)

该段定义了证书的扩展字段。

ini复制

[ usr_cert ]
basicConstraints = CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
  • basicConstraints:基本约束,CA:FALSE表示该证书不能作为CA证书。
  • nsComment:注释字段。
  • subjectKeyIdentifier:主题密钥标识符。
  • authorityKeyIdentifier:颁发者密钥标识符。

3. 配置文件的使用

  • 查找配置文件:可以通过find / -name openssl.cnf 2>/dev/null命令查找配置文件的位置。
  • 查看配置文件路径:运行openssl version -a可以显示OpenSSL的版本信息以及编译时的配置路径。
  • 环境变量:如果设置了OPENSSL_CONF环境变量,OpenSSL会优先使用该变量指定的配置文件。

4. 配置文件的高级用法

  • 扩展配置段:可以自定义扩展字段,用于特定的证书需求。
  • 变量与宏:配置文件支持变量和宏的定义与引用,方便灵活配置。

5. 注意事项

  • 权限问题:配置文件的权限需要正确设置,以防止未授权访问。
  • 配置错误:如果配置文件存在错误,可能会导致OpenSSL命令失败。

三、OpenSSL非对称密钥

生成RSA密钥

使用 OpenSSL 命令行工具生成 RSA 密钥对的两个步骤。以下是每个命令的详细解释:

  1. 生成 RSA 密钥对

    openssl genpkey -algorithm RSA -out rsa.key -aes256 -pkeyopt rsa_keygen_bits:4096
    
    • genpkey:生成私钥/公钥对。
    • <algorithm RSA>:指定算法为 RSA。
    • -out rsa.key:输出文件名,包含生成的 RSA 私钥。
    • -aes256:使用 AES-256 算法加密私钥文件。
    • -pkeyopt rsa_keygen_bits:4096:指定生成的 RSA 密钥长度为 4096 位。

    这个命令会生成一个 RSA 私钥文件 rsa.key,并使用 AES-256 加密保护。

  2. 从 RSA 密钥对中提取公钥

    bash复制

    openssl pkey -in rsa.key -pubout -out rsa.key.pub
    
    • -in rsa.key:输入文件名,包含 RSA 私钥。
    • -pubout:指示从私钥中提取公钥。
    • -out rsa.key.pub:输出文件名,包含提取的 RSA 公钥。

    这个命令会从 RSA 私钥文件 rsa.key 中提取公钥,并将其保存到 rsa.key.pub 文件中。

验证私钥

生成私钥后,可以通过以下命令验证私钥是否正确生成:

openssl rsa -in rsa.key -check

执行该命令时,系统会提示你输入私钥的密码。输入密码后,如果私钥有效,将输出类似以下内容:

RSA key ok

提取公钥

从私钥中提取公钥的命令如下:

openssl rsa -in rsa.key -pubout -out rsa.pub
  • -in rsa.key:指定输入的私钥文件。
  • -pubout:指示从私钥中提取公钥。
  • -out rsa.pub:指定公钥输出文件的名称。

执行该命令时,系统会提示你输入私钥的密码。输入密码后,公钥将被提取并保存到rsa.pub文件中。

生成DH密钥及参数

使用 OpenSSL 命令行工具生成和处理 Diffie-Hellman(DH)密钥对的三个步骤。Diffie-Hellman 是一种安全协议,用于在不安全的信道上安全地交换密钥。以下是每个命令的详细解释:

  1. 生成 DH 参数

    openssl genpkey -genparam -algorithm dh -out dh.param.pem -pkeyopt dh_paramgen_prime_len:2048
    
    • genpkey:生成私钥/公钥对。
    • -genparam:生成密钥交换参数。
    • <algorithm dh>:指定算法为 Diffie-Hellman。
    • -out dh.param.pem:输出文件名,包含 DH 参数。
    • -pkeyopt dh_paramgen_prime_len:2048:指定生成的素数长度为 2048 位。

    这个命令会生成一个包含 DH 参数的文件 dh.param.pem,这些参数稍后用于生成 DH 密钥对。

  2. 生成 DH 密钥对

    openssl genpkey -paramfile dh.param.pem -out dh.key -aes256
    
    • -paramfile dh.param.pem:使用之前生成的 DH 参数文件。
    • -out dh.key:输出文件名,包含生成的 DH 私钥。
    • -aes256:使用 AES-256 算法加密私钥文件。

    这个命令会生成一个 DH 私钥文件 dh.key,并使用 AES-256 加密保护。

  3. 从 DH 密钥对中提取公钥

    openssl pkey -in dh.key -pubout -out dh.key.pub
    
    • -in dh.key:输入文件名,包含 DH 私钥。
    • -pubout:指示从私钥中提取公钥。
    • -out dh.key.pub:输出文件名,包含提取的 DH 公钥。

    这个命令会从 DH 私钥文件 dh.key 中提取公钥,并将其保存到 dh.key.pub 文件中。

生成EC密钥

使用 OpenSSL 命令行工具生成椭圆曲线(EC)密钥对的两个步骤。以下是命令的详细解释:

  1. 生成 EC 密钥对

    openssl genpkey -algorithm EC -out ec.key -aes256 -pkeyopt ec_paramgen_curve:prime256v1
    
    • genpkey:生成私钥/公钥对。
    • <algorithm EC>:指定算法为椭圆曲线。
    • -out ec.key:输出文件名,包含生成的 EC 私钥。
    • -aes256:使用 AES-256 算法加密私钥文件。
    • -pkeyopt ec_paramgen_curve:prime256v1:指定椭圆曲线参数,这里使用的是 prime256v1 曲线,也称为 secp256r1,这是一个广泛使用的 NIST 曲线。

    这个命令会生成一个 EC 私钥文件 ec.key,并使用 AES-256 加密保护。

  2. 从 EC 密钥对中提取公钥

    openssl pkey -in ec.key -pubout -out ec.key.pub
    
    • -in ec.key:输入文件名,包含 EC 私钥。
    • -pubout:指示从私钥中提取公钥。
    • -out ec.key.pub:输出文件名,包含提取的 EC 公钥。

    这个命令会从 EC 私钥文件 ec.key 中提取公钥,并将其保存到 ec.key.pub 文件中。

生成SM2密钥

使用 OpenSSL 命令行工具生成基于 SM2 椭圆曲线算法的密钥对的两个步骤。以下是命令的详细解释:

  1. 生成 SM2 密钥对

    openssl genpkey -algorithm EC -out sm2.key -aes256 -pkeyopt ec_paramgen_curve:SM2
    
    • genpkey:生成私钥/公钥对。
    • <algorithm EC>:指定算法为椭圆曲线。
    • -out sm2.key:输出文件名,包含生成的 SM2 私钥。
    • -aes256:使用 AES-256 算法加密私钥文件。
    • -pkeyopt ec_paramgen_curve:SM2:指定椭圆曲线参数,这里使用的是 SM2 曲线,这是中国国家密码局推荐的椭圆曲线密码算法。

    这个命令会生成一个 SM2 私钥文件 sm2.key,并使用 AES-256 加密保护。

  2. 从 SM2 密钥对中提取公钥

    openssl pkey -in sm2.key -pubout -out sm2.key.pub
    
    • -in sm2.key:输入文件名,包含 SM2 私钥。
    • -pubout:指示从私钥中提取公钥。
    • -out sm2.key.pub:输出文件名,包含提取的 SM2 公钥。

    这个命令会从 SM2 私钥文件 sm2.key 中提取公钥,并将其保存到 sm2.key.pub 文件中。

使用openssl pkey将加密的私钥转换为明文私钥

使用 OpenSSL 命令来查看椭圆曲线(EC)私钥文件内容的命令。命令如下:

openssl ec -in sm2.key -text -noout

这个命令的各个参数解释如下:

  • openssl ec:指定使用 OpenSSL 的椭圆曲线(EC)功能。
  • -in sm2.key:指定输入文件为 sm2.key,这是包含椭圆曲线私钥的文件。
  • -text:指示 OpenSSL 输出私钥的详细信息,包括使用的椭圆曲线参数、私钥值等。
  • -noout:指示 OpenSSL 不要输出私钥或公钥的编码内容,只显示文本信息。

执行这个命令后,OpenSSL 会显示 sm2.key 文件中椭圆曲线私钥的详细信息,但不包括私钥或公钥的编码内容。这对于验证密钥文件的内容或调试问题非常有用,同时不会泄露私钥信息。

输出信息通常包括:

  • 椭圆曲线的名称(例如 SM2
  • 使用的参数(例如素数、系数等)
  • 私钥值(以十六进制表示)
  • 其他相关信息(例如密钥长度)

这个命令可以帮助你确认密钥文件是否正确生成,以及它使用的椭圆曲线参数是否符合预期。

使用openssl asn1parse或其他ASN1解析工具,查看加密私钥、明文私钥、公钥内容

使用 OpenSSL 的 asn1parse 工具来解析一个名为 rsa.key 的文件,该文件可能包含一个 RSA 私钥。命令如下:

openssl asn1parse -in rsa.key -dump

这个命令的参数解释如下:

  • openssl asn1parse:这是 OpenSSL 提供的一个用于解析 ASN.1 数据结构的命令。
  • -in rsa.key:指定输入文件为 rsa.key,这是包含 RSA 密钥的文件。
  • -dump:这个选项会输出更详细的信息,包括每个字段的标签、长度和内容。它通常用于调试和分析 ASN.1 结构。

执行这个命令后,OpenSSL 会显示 rsa.key 文件中每个 ASN.1 字段的详细信息。

使用gmssl

使用 GmSSL 工具进行密钥对生成、签名验签以及加密解密操作的说明。GmSSL 是一个支持国密算法的 OpenSSL 替代品。以下是各个步骤的详细解释:

GmSSL

  • 链接:提供了 GmSSL 在 GitHub 上的链接:https://github.com/guanzhi/GmSSL,你可以从这里获取 GmSSL 的源代码和相关文档。

密钥对生成

  • 命令

    gmssl sm2keygen -pass 12345678 -out sm2.key -pubout sm2.key.pub
    
    • sm2keygen:生成 SM2 密钥对。
    • -pass 12345678:设置私钥的密码为 12345678
    • -out sm2.key:输出私钥文件名为 sm2.key
    • -pubout sm2.key.pub:输出公钥文件名为 sm2.key.pub

签名验签

  1. 生成待签名消息

    echo -n "abc" > msg.txt
    
    • 将字符串 "abc" 写入文件 msg.txt
  2. 签名

    gmssl sm2sign -key sm2.key -pass 12345678 -in msg.txt -out msg.sig
    
    • sm2sign:使用 SM2 算法进行签名。
    • -key sm2.key:指定私钥文件。
    • -pass 12345678:指定私钥的密码。
    • -in msg.txt:指定输入文件,即待签名的消息。
    • -out msg.sig:输出签名文件。
  3. 验签

    gmssl sm2verify -in msg.txt -pubkey sm2.key.pub -sig msg.sig
    
    • sm2verify:验证签名。
    • -in msg.txt:指定输入文件,即原始消息。
    • -pubkey sm2.key.pub:指定公钥文件。
    • -sig msg.sig:指定签名文件。

加密解密

  1. 生成随机明文

    gmssl rand -outlen 32 -out plain.bin
    
    • rand:生成随机数。
    • -outlen 32:生成 32 字节的随机数。
    • -out plain.bin:输出文件名为 plain.bin
  2. 加密

    gmssl sm2encrypt -in plain.bin -pubkey sm2.key.pub -out ct.bin
    
    • sm2encrypt:使用 SM2 算法进行加密。
    • -in plain.bin:指定输入文件,即明文。
    • -pubkey sm2.key.pub:指定公钥文件。
    • -out ct.bin:输出文件名为 ct.bin,即密文。
  3. 解密

    gmssl sm2decrypt -in ct.bin -key sm2.key -pass 12345678 -out pt.bin
    
    • sm2decrypt:使用 SM2 算法进行解密。
    • -in ct.bin:指定输入文件,即密文。
    • -key sm2.key:指定私钥文件。
    • -pass 12345678:指定私钥的密码。
    • -out pt.bin:输出文件名为 pt.bin,即解密后的明文。
  4. 比较明文

    cmp plain.bin pt.bin
    
    • cmp:比较两个文件是否相同。
    • plain.binpt.bin:分别是加密前的明文和解密后的文件。

四、OpenSSL杂凑和对称解密

杂凑(Hash)

  1. SHA-256 杂凑

    openssl dgst -sha256 msg.txt
    

    这条命令使用 SHA-256 算法对文件 msg.txt 进行杂凑运算,生成消息的摘要。

  2. SM3 杂凑

    openssl dgst -sm3 msg.txt
    

    这条命令使用 SM3 算法对文件 msg.txt 进行杂凑运算,生成消息的摘要。

HMAC(消息认证码)

  1. SHA-256 HMAC

    openssl dgst -sha256 -hmac "hmackey" msg.txt
    

    这条命令使用 SHA-256 算法和密钥 hmackey 对文件 msg.txt 进行 HMAC 计算,生成消息的认证码。

  2. SM3 HMAC

    openssl dgst -sm3 -hmac "hmackey" msg.txt
    

    这条命令使用 SM3 算法和密钥 hmackey 对文件 msg.txt 进行 HMAC 计算,生成消息的认证码。

加密

  1. 生成随机文件

    openssl rand -out plain.bin 32
    

    这条命令生成一个包含 32 字节随机数据的文件 plain.bin

  2. AES-128-CBC 加密

    openssl enc -e -in plain.bin -K 00112233445566778899aabbccddeeff -iv 00112233445566778899aabbccddeeff -aes-128-cbc -out ct.aes.bin
    

    这条命令使用 AES-128-CBC 算法加密文件 plain.bin,密钥和初始化向量(IV)均为 001122334455667788899aabbccddeeff,输出加密文件 ct.aes.bin

  3. SM4-ECB 加密

    openssl enc -e -in plain.bin -K 00112233445566778899aabbccddeeff -sm4-ecb -out ct.sm4.bin
    

    这条命令使用 SM4-ECB 算法加密文件 plain.bin,密钥为 00112233445566778899aabbccddeeff,输出加密文件 ct.sm4.bin

  4. 手动填充

    如果你不想手动填充,可以生成一个随机的16字节( 128 位)密钥和初始化向量,例如:

    openssl rand -out key.bin 16
    openssl rand -out iv.bin 16
    

    然后你可以使用这些文件作为密钥和初始化向量:

    openssl enc -e -in plain.bin -K $(cat key.bin | xxd -p) -iv $(cat iv.bin | xxd -p) -aes-128-cbc -out ct.aes.bin
    

    这样,OpenSSL 会从 key.biniv.bin 文件中读取密钥和初始化向量。

解密

  1. AES-128-CBC 解密

    openssl enc -d -in ct.aes.bin -K 00112233445566778899aabbccddeeff -iv 00112233445566778899aabbccddeeff -aes-128-cbc -out pt.aes.bin
    

    这条命令使用 AES-128-CBC 算法解密文件 ct.aes.bin,密钥和初始化向量(IV)均为 00112233445566778899aabbccddeeff,输出解密文件 pt.aes.bin

  2. SM4-ECB 解密

    openssl enc -d -in ct.sm4.bin -K 00112233445566778899aabbccddeeff -sm4-ecb -out pt.sm4.bin
    

    这条命令使用 SM4-ECB 算法解密文件 ct.sm4.bin,密钥为 001122334455667788899aabbccddeeff,输出解密文件 pt.sm4.bin

五、OpenSSL创建根CA

如何使用 OpenSSL 创建一个根证书颁发机构(CA)的配置文件?

配置文件通常包含两个主要部分:[ CA_default ][ req ],每个部分定义了不同的参数。以下是图片中提到的配置项的解释:

[ CA_default ] 部分:

  • dir:CA 的工作目录,这里是 ./demoCA
  • database:CA 的索引数据库文件路径,这里是 $dir/index.txt,即工作目录下的 index.txt 文件。
  • serial:CA 的序列号文件路径,这里是 $dir/serial,即工作目录下的 serial 文件。
  • private_key:CA 的私钥文件路径,这里是 $dir/private/cakey.pem,即工作目录下的 private 子目录中的 cakey.pem 文件。
  • x509_extensions:证书扩展的配置文件,这里使用的是 subca_cert,通常用于子 CA 证书的扩展。
  • default_days:证书的默认有效期,这里是 3650 天。
  • default_md:默认的消息摘要算法,这里使用的是 default,通常指的是 OpenSSL 默认的摘要算法。

[ req ] 部分:

  • default_bits:默认的密钥长度,这里是 2048 位。
  • default_keyfile:默认的私钥文件,这里是 privkey.pem
  • distinguished_name:用于证书请求的名称区分字段,这里使用的是 req_distinguished_name,通常在另一个配置文件中定义。
  • attributes:请求的属性,这里使用的是 req_attributes,通常在另一个配置文件中定义。
  • x509_extensions:X.509 证书扩展,这里使用的是 v3_ca,通常用于定义 CA 证书的扩展。

这些配置项是创建根 CA 时常用的参数,它们定义了 CA 的基本属性和证书的生成规则。在实际使用中,可能需要根据具体需求调整这些参数。

如何配置和执行 OpenSSL 命令来创建一个根证书颁发机构(CA)。以下是步骤和命令的解释:

配置

  1. 创建目录

    mkdir -p /root/openssl/rootca && cd /root/openssl/rootca
    

    这条命令创建一个名为 rootca 的目录在 /root/openssl/ 下,然后切换到该目录。

  2. 复制配置文件

    cp /etc/pki/tls/openssl.cnf .
    

    这条命令将系统的 OpenSSL 配置文件 openssl.cnf 复制到当前目录。

  3. 编辑 v3_ca 配置

    • basicConstraints = critical,CA:true:指定证书是一个 CA 证书。
    • keyUsage = critical, cRLSign, keyCertSign:指定密钥的用途,包括签发证书和 CRL(证书吊销列表)。
  4. 编辑 req_distinguished_name 配置

    • countryName_default = CN:默认的国家代码。
    • stateOrProvinceName_default0.organizationName_default:需要设置为合适的值,这些是证书申请者的信息。

执行

  1. 切换到 rootca 目录

    cd /root/openssl/rootca
    
  2. 创建子目录

    mkdir -p demoCA/{certs,crl,newcerts,private}
    

    这条命令在 demoCA 目录下创建四个子目录,用于存放证书、CRL、新证书和私钥。

  3. 设置权限

    chmod 700 demoCA/private
    

    这条命令设置 private 目录的权限,确保私钥文件的安全性。

  4. 初始化索引文件

    touch demoCA/index.txt
    

    这条命令创建一个空的索引文件,用于记录签发的证书。

  5. 初始化序列号文件

    echo 1000 > demoCA/serial
    

    这条命令创建一个序列号文件,并初始化为 1000,用于证书序列号的生成。

  6. 生成私钥

    openssl genpkey -algorithm RSA -out demoCA/private/cakey.pem -aes256 -pkeyopt rsa_keygen_bits:4096
    

    这条命令生成一个 4096 位的 RSA 私钥,并使用 AES-256 加密保存到 cakey.pem 文件中。

  7. 生成自签名根证书

    openssl req -config ./openssl.cnf -key ./demoCA/private/cakey.pem -x509 -days 7300 -out ./demoCA/cacert.pem
    

    这条命令使用配置文件 openssl.cnf 和私钥 cakey.pem 生成一个自签名的根证书,有效期为 7300 天,保存到 cacert.pem 文件中。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • Country Name (2 letter code) [CN]:
    • 国家名称(两位字母代码)[中国]:CN
    • State or Province Name (full name) [Some-State]:
    • 州或省名称(全名)[某个州]:Guangdong(广东)
    • Locality Name (eg, city) []:
    • 地区名称(例如,城市)[]:Shenzhen(深圳)
    • Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    • 组织名称(例如,公司)[互联网小部件有限公司]:My Company(我的公司)
    • Organizational Unit Name (eg, section) []:
    • 组织单位名称(例如,部门)[]:IT Department(IT部门)
    • Common Name (e.g. server FQDN or YOUR name) []:
    • 通用名称(例如,服务器的完全限定域名或您的名称)[]:my-ca(我的CA)
    • Email Address []:
    • 电子邮件地址[]:admin@example.com

这些步骤和命令构成了创建一个基本的 OpenSSL 根 CA 的过程。

六、OpenSSL创建中间CA和CRL

如何使用 OpenSSL 创建一个中间证书颁发机构(CA)。以下是配置和执行步骤的解释:

配置

  1. CA_default
    • default_days = 3650:证书的默认有效期为 3650 天(不修改也可以)。
    • x509_extensions = subca_cert:修改证书扩展配置段,使用名为 subca_cert 的扩展配置。
  2. subca_cert(新增该段)
    • subjectKeyIdentifier=hash:指定主题密钥标识符使用哈希值。
    • authorityKeyIdentifier=keyid:always,issuer:指定颁发者密钥标识符总是包含密钥 ID 和颁发者信息。
    • basicConstraints=critical, CA:true:指定证书是一个 CA 证书。
    • keyUsage = critical, cRLSign, keyCertSign:指定密钥的用途,包括签发证书和 CRL(证书吊销列表)。

执行

  1. 生成私钥

    openssl genpkey -algorithm RSA -out demoCA/private/subca.pem -aes256 -pkeyopt rsa_keygen_bits:2048
    

    这条命令生成一个 2048 位的 RSA 私钥,并使用 AES-256 加密保存到 subca.pem 文件中。

  2. 生成证书签名请求(CSR)

    openssl req -config openssl.cnf -new -key ./demoCA/private/subca.pem -out ./demoCA/csr/subca.csr
    

    这条命令使用配置文件 openssl.cnf 和私钥 subca.pem 生成一个证书签名请求(CSR),保存到 subca.csr 文件中。

  3. 签发中间 CA 证书

    openssl ca -config openssl.cnf -in ./demoCA/csr/subca.csr -out ./demoCA/certs/subca.cer
    

    这条命令使用配置文件 openssl.cnf 签发中间 CA 证书,从 CSR 文件 subca.csr 中获取信息,并将签发的证书保存到 subca.cer 文件中。

这些步骤构成了创建一个中间 CA 的基本过程。中间 CA 通常用于分层的 PKI(公钥基础设施)结构中,以提供额外的安全性和管理灵活性。

七、OpenSSL签发终端用户证书

以下是使用 OpenSSL 签发用户证书的过程,包括配置和执行步骤的详细解释:

配置

  1. 切换目录并创建子目录

    mkdir -p /root/openssl/subca && cd /root/openssl/subca
    mkdir -p demoCA/{certs,crl,newcerts,private,csr}
    

    切换到 /root/openssl/subca 目录,这是存放中间 CA 相关文件的地方。

  2. 复制 OpenSSL 配置文件

    cp /etc/pki/tls/openssl.cnf .
    

    将系统的 OpenSSL 配置文件 openssl.cnf 复制到当前目录。

  3. 编辑用户证书配置(usr_cert)

    • basicConstraints=CA:FALSE:指定证书不是 CA 证书。
    • keyUsage = nonRepudiation, digitalSignature, keyEncipherment:指定密钥的用途,包括不可否认性、数字签名和密钥加密。
    • subjectKeyIdentifier=hash:指定主题密钥标识符使用哈希值。
    • authorityKeyIdentifier=keyid,issuer:指定颁发者密钥标识符包括密钥 ID 和颁发者信息。
    • req_distinguished_name:设置合适的默认值,这些值将在生成证书请求时使用。

执行

  1. 生成用户私钥

    openssl genpkey -algorithm RSA -out demoCA/private/user.pem -aes256 -pkeyopt rsa_keygen_bits:2048
    

    生成一个 2048 位的 RSA 私钥,并使用 AES-256 加密保存到 user.pem 文件中。

  2. 生成证书签名请求(CSR)

    openssl req -config openssl.cnf -new -key demoCA/private/user.pem -out demoCA/csr/user.csr
    

    使用配置文件 openssl.cnf 和私钥 user.pem 生成一个证书签名请求(CSR),保存到 user.csr 文件中。

  3. 签发用户证书

    openssl ca -config openssl.cnf -in ./demoCA/csr/user.csr -out ./demoCA/certs/user.cer
    

    使用配置文件 openssl.cnf 签发用户证书,从 CSR 文件 user.csr 中获取信息,并将签发的证书保存到 user.cer 文件中。

这些步骤构成了使用 OpenSSL 签发用户证书的基本过程。在这个过程中,你首先生成用户的私钥和 CSR,然后使用中间 CA 来签发最终的用户证书。

八、OpenSSL签发服务器证书

OpenSSL 配置文件中添加和配置不同的段落,以设置证书的扩展属性。以下是详细解释:

配置

  1. 增加 server_cert 段
    • basicConstraints=CA:FALSE:指定该证书不是一个 CA 证书。
    • keyUsage = nonRepudiation, digitalSignature, keyEncipherment:指定密钥的用途,包括不可否认性、数字签名和密钥加密。
    • subjectKeyIdentifier=hash:指定主题密钥标识符使用哈希值。
    • authorityKeyIdentifier=keyid,issuer:指定颁发者密钥标识符包括密钥 ID 和颁发者信息。
    • crlDistributionPoints = @crl_section:指定 CRL(证书吊销列表)分发点,引用 crl_section 段。
    • authorityInfoAccess = @ocsp_section:指定 OCSP(在线证书状态协议)信息访问,引用 ocsp_section 段。
    • subjectAltName = @alt_names:指定主题备用名称,引用 alt_names 段。
  2. 新增 crl_section 段
    • URI.0 = http://www.domain.dom/ca-crl.pem:指定第一个 CRL 分发点的 URL。
  3. 新增 ocsp_section 段
    • caIssuers;URI.0 = http://www.domain.dom/ca.crt:指定 CA 证书的 URL,用于 OCSP 检查。
    • OCSP;URI.0 = http://ocsp.domain.dom/ocsp:指定 OCSP 服务的 URL。
  4. 新增 alt_names 段
    • DNS.1 = www.domain.dom:指定第一个备用 DNS 名称。
    • IP.1 = 192.168.9.3:指定第一个备用 IP 地址。

执行

  1. 生成服务器私钥

    openssl genpkey -algorithm RSA -aes256 -pkeyopt rsa_keygen_bits:2048 -out demoCA/private/server.pem
    

    这条命令生成一个 2048 位的 RSA 私钥,并使用 AES-256 加密保存到 demoCA/private/server.pem 文件中。

  2. 生成证书签名请求(CSR)

    openssl req -config openssl.cnf -new -key ./demoCA/private/server.pem -out ./demoCA/csr/server.csr
    

    这条命令使用配置文件 openssl.cnf 和私钥 server.pem 生成一个证书签名请求(CSR),保存到 server.csr 文件中。

  3. 签发服务器证书

    openssl ca -config openssl.cnf -extensions server_cert -in ./demoCA/csr/server.csr -out ./demoCA/certs/server.cer
    

    这条命令使用配置文件 openssl.cnf 和扩展配置 server_cert 签发服务器证书,从 CSR 文件 server.csr 中获取信息,并将签发的证书保存到 server.cer 文件中。

生成 CRL 步骤:

  1. 初始化 CRL 序列号

    echo 01 > demoCA/crlnumber
    

    这条命令初始化 CRL 序列号文件 crlnumber,序列号从 01 开始。

  2. 生成 CRL

    openssl ca -config openssl.cnf -gencrl -out demoCA/crl/01.crl
    

    这条命令使用配置文件 openssl.cnf 生成 CRL,并将生成的 CRL 保存到 01.crl 文件中。

使用 OpenSSL 签发不同类型服务器证书时如何指定证书的扩展密钥使用(Extended Key Usage,简称 EKU)。以下是详细解释:

特定应用服务器证书

  • extendedKeyUsage:用于指定证书的预期用途,确保证书仅用于特定的应用场景。

OCSP服务证书

  • extendedKeyUsage = critical, OCSPSigning:指定证书用于 OCSP(在线证书状态协议)签名。

代码签名服务证书

  • extendedKeyUsage = critical, codeSigning:指定证书用于代码签名。

时间戳服务证书

  • extendedKeyUsage = critical, timeStamping:指定证书用于时间戳服务。

可能取值

  • serverAuth:服务器认证。
  • clientAuth:客户端认证。
  • codeSigning:代码签名。
  • emailProtection:电子邮件保护。
  • OCSPSigning:OCSP 签名。
  • timeStamping:时间戳服务。

多个用途

  • extendedKeyUsage = critical, serverAuth, clientAuth, codeSigning, emailProtection:指定证书可以用于服务器认证、客户端认证、代码签名和电子邮件保护等多个用途。
  • extendedKeyUsage = critical, serverAuth, 1.2.3.4.5.6.7:指定证书可以用于服务器认证和另一个特定 OID(对象标识符)所代表的用途。

九、OpenSSL提供OCSP服务

如何使用 OpenSSL 提供 OCSP(在线证书状态协议)服务的步骤。以下是详细解释:

生成 OCSP 服务密钥和证书

  1. 切换目录

    cd /root/openssl/subca
    

    切换到存放中间 CA 相关文件的目录。

  2. 生成 OCSP 私钥

    openssl genpkey -algorithm RSA -aes256 -pkeyopt rsa_keygen_bits:2048 -out demoCA/private/ocsp.pem
    

    生成一个 2048 位的 RSA 私钥,并使用 AES-256 加密保存到 ocsp.pem 文件中。

  3. 生成 OCSP 证书签名请求(CSR)

    openssl req -config openssl.cnf -new -key ./demoCA/private/ocsp.pem -out ./demoCA/csr/ocsp.csr
    

    使用配置文件 openssl.cnf 和私钥 ocsp.pem 生成一个证书签名请求(CSR),保存到 ocsp.csr 文件中。

  4. 签发 OCSP 证书

    openssl ca -config openssl.cnf -extensions ocsp_cert -in ./demoCA/csr/ocsp.csr -out ./demoCA/certs/ocsp.cer
    

    使用配置文件 openssl.cnf 和扩展配置 ocsp_cert 签发 OCSP 证书,从 CSR 文件 ocsp.csr 中获取信息,并将签发的证书保存到 ocsp.cer 文件中。

    [在openssl.cnf中仿照server_cert新增ocsp_cert段]

  5. 拷贝根 CA 证书

    cp /root/openssl/rootca/demoCA/cacert.pem ./demoCA/rootcert.pem
    

    拷贝根 CA 证书到 rootcert.pem 文件中。

启动 OCSP 服务

openssl ocsp -port 8888 -index ./demoCA/index.txt -rsigner ./demoCA/certs/ocsp.cer -rkey ./demoCA/private/ocsp.pem -CA ./demoCA/cacert.pem -text

这条命令启动 OCSP 服务,监听 8888 端口,使用 ocsp.cer 作为签名证书,ocsp.pem 作为私钥,cacert.pem 作为 CA 证书,并以文本格式输出信息。

OCSP 客户端测试

openssl ocsp -host 127.0.0.1 -port 8888 -issuer ./demoCA/cacert.pem -cert ./demoCA/certs/user.cer -CAfile ./demoCA/rootcert.pem

这条命令测试 OCSP 服务,从本地主机(127.0.0.1)的 8888 端口获取证书状态,使用 cacert.pem 作为 CA 证书,user.cer 作为要查询的证书,rootcert.pem 作为信任的根 CA 证书。

忽略证书链验证(仅用于测试)

  • 如果需要验证 OCSP 响应,但证书链验证失败,可以使用 -noverify 选项跳过验证:

    bash复制

    openssl ocsp -host 127.0.0.1 -port 8888 -issuer ./demoCA/cacert.pem -cert ./demoCA/certs/user.cer -CAfile ./demoCA/rootcert.pem -noverify
    
  • 注意-noverify 仅用于调试,不适用于生产环境。


人类刻着对痛苦的敏感,却没有对痛苦的反感。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机-按键

1、独立按键 1.1、按键介绍 轻触开关是一种电子开关&#xff0c;使用时&#xff0c;轻轻按开关按钮就可使开关接通&#xff0c;当松开手时&#xff0c;开关断开。 1.2、独立按键原理 按键在闭合和断开时&#xff0c;触点会存在抖动现象。P2\P3\P1都是准双向IO口&#xff0c;…

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …

EasyRTC智能硬件:实时畅联、沉浸互动、消音护航

在当今智能硬件迅猛发展的时代&#xff0c;音视频通讯技术已成为设备与用户、设备与设备间不可或缺的沟通纽带。而EasyRTC&#xff0c;凭借其无可比拟的实时性能、卓越的互动感受以及强大的交互实力&#xff0c;正逐步演变为智能硬件领域的“超级动力”核心。特别是其倾力打造的…

[AI相关]Unity的C#代码如何简写

是一个某培训机构的飞行棋教学源码 不知道&#xff0c;是否有人想知道怎么可以简写 &#xff08;这个问AI&#xff0c;DeepSeek也应该找不到答案的&#xff09; 静态变量 属性引用 单例 注入 一些UnityEvent特性就不说了。。。 IL 注入 运算符号改写

ubuntu 执行 sudo apt-get update 报错

记录一下&#xff0c;遇到这个问题了&#xff0c;网络上看到的解决办法&#xff0c;亲测有效 执行sudo apt-get update ,却报以下错误&#xff0c;“SECURITY: URL redirect target contains control characters rejecting ” 经检查发现&#xff0c;/etc/apt/source.list 下的…

蓝桥杯学习大纲

&#xff08;致酷德与热爱算法、编程的小伙伴们&#xff09; 在查阅了相当多的资料后&#xff0c;发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以&#xff0c;干脆自己整理一篇&#xff0c;欢迎大家补充&#xff01; 一、蓝桥必备高频考点 我们以此为重点学习…

【插件】前端生成word 文件

文章目录 1、背景2、方式一&#xff1a;html-docx-js2.1 具体代码2.2 前端生成word文件的样式2.3 总结 3、方式二&#xff1a;pizzip docxtemplater3.1 具体代码3.2 前端生成word文件的样式3.3 总结 4、参考链接 1、背景 在实际开发中&#xff0c;业务需要&#xff0c;需要把数…

4. grafana(7.5.17)功能菜单简介

点击可以返回home页面 搜索Dashboard 新建按钮&#xff1a;用户创建Dashboard、文件夹。以及导入外部&#xff08;社区&#xff09;Dashboard 用于查看活管理Dashboard&#xff0c;包括home、Manage、playlists、snapshots功能 explore&#xff08;探索&#xff09;&#x…

QT之改变鼠标样式

QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标&#xff0c…

ctfshow web入门 web11-web24

web11 web12 进来浏览网站&#xff0c;底部有一串数字&#xff0c;根据提示可能有用&#xff0c;访问robots.txt&#xff0c;发现禁止访问/admin/&#xff0c;进去看看发现需要输入用户名和密码&#xff0c;刚想爆破就猜对了&#xff0c;用户名是admin&#xff0c;密码是页面下…

大模型开发实战篇7:语音识别-语音转文字

语音识别大模型&#xff0c;是人工智能领域的一项重要技术&#xff0c;它能够将人类的语音转换为文本。近年来&#xff0c;随着深度学习技术的不断发展&#xff0c;语音识别大模型取得了显著的进展&#xff0c;并在各个领域得到了广泛应用。 主流语音识别大模型 目前&#xf…

基于Flask的租房信息可视化系统的设计与实现

【Flask】基于Flask的租房信息可视化系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展&#xff0c;租房市场日益繁荣&#xff0c;信息量急剧增加&#xff…

记一次一波三折的众测SRC经历

视频教程和更多福利在我主页简介或专栏里 &#xff08;不懂都可以来问我 专栏找我哦&#xff09; 目录&#xff1a; 前言 波折一&#xff1a;RCE漏洞利用失败 波折二&#xff1a;SQL时间盲注 波折三&#xff1a;寻找管理后台 总结 前言 先谈个人SRC心得体会吧&#xff0c;我虽…

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL&#xff1a; CREATE DATABASE dbname; 人大金仓&#xff08;Kingbase&#xff09;&#xff1a; 在人大金仓中&#xff0c;CREATE DATABASE 的语法通常相同&#xff0c;但可能需要特别注意字符集的指定&#xff08;如果涉及到多语言支持…

【单臂路由配置】

【单臂路由配置】 设备接口IP子网网关vlanR1G0/0/1.1192.168.1.254255.255.255.0NAvlan10R1G0/0/1.2192.168.2.254255.255.255.0NAvlan20R1G0/0/1.3192.168.3.254255.255.255.0NAvlan30PC1e0/0/1192.168.1.1255.255.255.0192.168.1.254vlan10PC2e0/0/1192.168.2.1255.255.255.0…

NutUI内网离线部署

文章目录 官网拉取源代码到本地仓库修改源代码打包构建nginx反向代理部署访问内网离线地址 在网上找了一圈没有写NutUI内网离线部署的文档&#xff0c;花了1天时间研究下&#xff0c;终于解决了。 对于有在内网离线使用的小伙伴就可以参考使用了 如果还是不会联系UP主:QQ:10927…

【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。

AnolisOS 8中使用Docker部署&#xff08;全&#xff09;_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了&#xff0c;我重点讲述我解决文章里面问题一些的方法。 问题1&#xff1a; docker: Get https://registry-1.docker.io/v2/: net/h…

免费体验,在阿里云平台零门槛调用满血版DeepSeek-R1模型

一、引言 随着人工智能技术的飞速发展&#xff0c;各类AI模型层出不穷。其中&#xff0c;DeepSeek作为一款新兴的推理模型&#xff0c;凭借其强大的技术实力和广泛的应用场景&#xff0c;逐渐在市场中崭露头角。本文将基于阿里云提供的零门槛解决方案&#xff0c;对DeepSeek模…

ARM Linux平台下 OpenCV Camera 实验

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器&#xff0c;支持以下功能&#xff1a; 最高分辨率&#xff1a;200 万像素&#xff08;1600x1200&#xff09;。 输出格式&#xff1a;JPEG、YUV、RGB。 内置图像处理功能&#xff1a;自动曝…

论文笔记-WSDM2025-ColdLLM

论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM&#xff1a;用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…