主页 > 人工智能  > 

OpenSSL实验

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解析工具,查看加密私钥、明文私钥、公钥内容使用gmsslGmSSL密钥对生成签名验签加密解密 四、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 f,其位置可能因安装方式和系统配置而有所不同。以下是一些常见的OpenSSL配置文件路径和查找方法:

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

使用find命令:

find / -name openssl f 2>/dev/null

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

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

openssl version -a

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

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

echo $OPENSSL_CONF

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

示例

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

cat /etc/pki/tls/openssl f

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

find / -name openssl f 2>/dev/null

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

1. 配置文件结构

openssl f文件由多个段(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 f 2>/dev/null命令查找配置文件的位置。查看配置文件路径:运行openssl version -a可以显示OpenSSL的版本信息以及编译时的配置路径。环境变量:如果设置了OPENSSL_CONF环境变量,OpenSSL会优先使用该变量指定的配置文件。 4. 配置文件的高级用法 扩展配置段:可以自定义扩展字段,用于特定的证书需求。变量与宏:配置文件支持变量和宏的定义与引用,方便灵活配置。 5. 注意事项 权限问题:配置文件的权限需要正确设置,以防止未授权访问。配置错误:如果配置文件存在错误,可能会导致OpenSSL命令失败。 三、OpenSSL非对称密钥 生成RSA密钥

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

生成 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 加密保护。

从 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 是一种安全协议,用于在不安全的信道上安全地交换密钥。以下是每个命令的详细解释:

生成 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 密钥对。

生成 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 加密保护。

从 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)密钥对的两个步骤。以下是命令的详细解释:

生成 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 加密保护。

从 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 椭圆曲线算法的密钥对的两个步骤。以下是命令的详细解释:

生成 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 加密保护。

从 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 上的链接: github /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。 签名验签

生成待签名消息:

echo -n "abc" > msg.txt 将字符串 "abc" 写入文件 msg.txt。

签名:

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:输出签名文件。

验签:

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

生成随机明文:

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

加密:

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,即密文。

解密:

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,即解密后的明文。

比较明文:

cmp plain.bin pt.bin cmp:比较两个文件是否相同。plain.bin 和 pt.bin:分别是加密前的明文和解密后的文件。 四、OpenSSL杂凑和对称解密 杂凑(Hash)

SHA-256 杂凑:

openssl dgst -sha256 msg.txt

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

SM3 杂凑:

openssl dgst -sm3 msg.txt

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

HMAC(消息认证码)

SHA-256 HMAC:

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

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

SM3 HMAC:

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

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

加密

生成随机文件:

openssl rand -out plain.bin 32

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

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。

SM4-ECB 加密:

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

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

手动填充:

如果你不想手动填充,可以生成一个随机的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.bin 和 iv.bin 文件中读取密钥和初始化向量。

解密

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。

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)。以下是步骤和命令的解释:

配置

创建目录:

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

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

复制配置文件:

cp /etc/pki/tls/openssl f .

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

编辑 v3_ca 配置:

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

编辑 req_distinguished_name 配置:

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

切换到 rootca 目录:

cd /root/openssl/rootca

创建子目录:

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

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

设置权限:

chmod 700 demoCA/private

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

初始化索引文件:

touch demoCA/index.txt

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

初始化序列号文件:

echo 1000 > demoCA/serial

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

生成私钥:

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

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

生成自签名根证书:

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

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

Country Name (2 letter code) [CN]:国家名称(两位字母代码)[中国]:CNState 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

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

六、OpenSSL创建中间CA和CRL

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

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

生成私钥:

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

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

生成证书签名请求(CSR):

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

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

签发中间 CA 证书:

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

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

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

七、OpenSSL签发终端用户证书

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

配置

切换目录并创建子目录:

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

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

复制 OpenSSL 配置文件:

cp /etc/pki/tls/openssl f .

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

编辑用户证书配置(usr_cert):

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

生成用户私钥:

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

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

生成证书签名请求(CSR):

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

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

签发用户证书:

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

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

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

八、OpenSSL签发服务器证书

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

配置 增加 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 段。 新增 crl_section 段: URI.0 = http:// .domain.dom/ca-crl.pem:指定第一个 CRL 分发点的 URL。 新增 ocsp_section 段: caIssuers;URI.0 = http:// .domain.dom/ca.crt:指定 CA 证书的 URL,用于 OCSP 检查。OCSP;URI.0 = http://ocsp.domain.dom/ocsp:指定 OCSP 服务的 URL。 新增 alt_names 段: DNS.1 = .domain.dom:指定第一个备用 DNS 名称。IP.1 = 192.168.9.3:指定第一个备用 IP 地址。 执行

生成服务器私钥:

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

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

生成证书签名请求(CSR):

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

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

签发服务器证书:

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

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

生成 CRL 步骤:

初始化 CRL 序列号:

echo 01 > demoCA/crlnumber

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

生成 CRL:

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

这条命令使用配置文件 openssl f 生成 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 服务密钥和证书

切换目录:

cd /root/openssl/subca

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

生成 OCSP 私钥:

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

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

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

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

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

签发 OCSP 证书:

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

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

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

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


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

标签:

OpenSSL实验由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“OpenSSL实验