OpenSSL实验

文章目录


一、OpenSSL安装

先查看系统相关信息

sh 复制代码
[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,故此步骤跳过

sh 复制代码
[root@testsvr ~]# openssl version
OpenSSL 1.1.1wa  16 Nov 2023

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

sh 复制代码
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命令

    bash 复制代码
    find / -name openssl.cnf 2>/dev/null

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

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

    bash 复制代码
    openssl version -a

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

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

    bash 复制代码
    echo $OPENSSL_CONF

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

示例

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

bash 复制代码
cat /etc/pki/tls/openssl.cnf

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

bash 复制代码
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复制

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

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

ini复制

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复制

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复制

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复制

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复制

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 密钥对

    bash 复制代码
    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复制

    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 文件中。

验证私钥

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

bash 复制代码
openssl rsa -in rsa.key -check

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

RSA key ok

提取公钥

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

bash 复制代码
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 参数

    bash 复制代码
    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 密钥对

    bash 复制代码
    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 密钥对中提取公钥

    bash 复制代码
    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 密钥对

    bash 复制代码
    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 密钥对中提取公钥

    bash 复制代码
    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 密钥对

    bash 复制代码
    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 密钥对中提取公钥

    bash 复制代码
    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)私钥文件内容的命令。命令如下:

bash 复制代码
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 私钥。命令如下:

bash 复制代码
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

密钥对生成

  • 命令

    bash 复制代码
    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. 生成待签名消息

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

    bash 复制代码
    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. 验签

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

加密解密

  1. 生成随机明文

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

    bash 复制代码
    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. 解密

    bash 复制代码
    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. 比较明文

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

四、OpenSSL杂凑和对称解密

杂凑(Hash)

  1. SHA-256 杂凑

    bash 复制代码
    openssl dgst -sha256 msg.txt

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

  2. SM3 杂凑

    bash 复制代码
    openssl dgst -sm3 msg.txt

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

HMAC(消息认证码)

  1. SHA-256 HMAC

    bash 复制代码
    openssl dgst -sha256 -hmac "hmackey" msg.txt

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

  2. SM3 HMAC

    bash 复制代码
    openssl dgst -sm3 -hmac "hmackey" msg.txt

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

加密

  1. 生成随机文件

    bash 复制代码
    openssl rand -out plain.bin 32

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

  2. AES-128-CBC 加密

    bash 复制代码
    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 加密

    bash 复制代码
    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 位)密钥和初始化向量,例如:

    bash 复制代码
    openssl rand -out key.bin 16
    openssl rand -out iv.bin 16

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

    bash 复制代码
    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 解密

    bash 复制代码
    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 解密

    bash 复制代码
    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. 创建目录

    bash 复制代码
    mkdir -p /root/openssl/rootca && cd /root/openssl/rootca

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

  2. 复制配置文件

    bash 复制代码
    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 目录

    bash 复制代码
    cd /root/openssl/rootca
  2. 创建子目录

    bash 复制代码
    mkdir -p demoCA/{certs,crl,newcerts,private}

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

  3. 设置权限

    bash 复制代码
    chmod 700 demoCA/private

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

  4. 初始化索引文件

    bash 复制代码
    touch demoCA/index.txt

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

  5. 初始化序列号文件

    bash 复制代码
    echo 1000 > demoCA/serial

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

  6. 生成私钥

    bash 复制代码
    openssl genpkey -algorithm RSA -out demoCA/private/cakey.pem -aes256 -pkeyopt rsa_keygen_bits:4096

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

  7. 生成自签名根证书

    bash 复制代码
    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. 生成私钥

    bash 复制代码
    openssl genpkey -algorithm RSA -out demoCA/private/subca.pem -aes256 -pkeyopt rsa_keygen_bits:2048

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

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

    bash 复制代码
    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 证书

    bash 复制代码
    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. 切换目录并创建子目录

    bash 复制代码
    mkdir -p /root/openssl/subca && cd /root/openssl/subca
    mkdir -p demoCA/{certs,crl,newcerts,private,csr}

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

  2. 复制 OpenSSL 配置文件

    bash 复制代码
    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. 生成用户私钥

    bash 复制代码
    openssl genpkey -algorithm RSA -out demoCA/private/user.pem -aes256 -pkeyopt rsa_keygen_bits:2048

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

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

    bash 复制代码
    openssl req -config openssl.cnf -new -key demoCA/private/user.pem -out demoCA/csr/user.csr

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

  3. 签发用户证书

    bash 复制代码
    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. 生成服务器私钥

    bash 复制代码
    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)

    bash 复制代码
    openssl req -config openssl.cnf -new -key ./demoCA/private/server.pem -out ./demoCA/csr/server.csr

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

  3. 签发服务器证书

    bash 复制代码
    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 序列号

    bash 复制代码
    echo 01 > demoCA/crlnumber

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

  2. 生成 CRL

    bash 复制代码
    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. 切换目录

    bash 复制代码
    cd /root/openssl/subca

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

  2. 生成 OCSP 私钥

    bash 复制代码
    openssl genpkey -algorithm RSA -aes256 -pkeyopt rsa_keygen_bits:2048 -out demoCA/private/ocsp.pem

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

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

    bash 复制代码
    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 证书

    bash 复制代码
    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 证书

    bash 复制代码
    cp /root/openssl/rootca/demoCA/cacert.pem ./demoCA/rootcert.pem

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

启动 OCSP 服务

bash 复制代码
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 客户端测试

bash 复制代码
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复制

    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 仅用于调试,不适用于生产环境。


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

相关推荐
你怎么睡得着的!2 小时前
【护网行动-红蓝攻防】第一章-红蓝对抗基础 认识红蓝紫
网络·安全·web安全·网络安全
anddddoooo7 小时前
域内证书维权
服务器·网络·网络协议·安全·网络安全·https·ssl
Dyan_csdn7 小时前
【Python项目】基于Python的Web漏洞挖掘系统
网络·python·安全·web安全
okok__TXF8 小时前
Rpc导读
网络·网络协议·rpc
&向上8 小时前
RK3588配置成为路由器
网络·智能路由器·rk3588
猫猫的小茶馆9 小时前
【网络编程】UDP协议
linux·服务器·网络·网络协议·ubuntu·udp
十月ooOO9 小时前
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
网络·ssh·路由器·openwrt
SKYDROID云卓小助手9 小时前
无人设备遥控器之如何分享数传篇
网络·人工智能·算法·计算机视觉·电脑