使用openssl命令行产生密钥对、签发证书[详细]

本文介绍如何使用OpenSSL生成RSA、SM2及ECC密钥对,并演示了生成证书、签名验证等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

openssl的相关参数


1. 产生密钥对

注意:以下操作命令均在openssl的bin目录内执行。

1.1 RSA密钥对

# 产生RSA私钥
openssl genrsa -out rsa_private_key.pem 1024
# 根据私钥产生公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
# 私钥PKCS1转为PKCS8格式
openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
# 私钥PKCS8转为PKCS1格式
openssl rsa -in pkcs8_rsa_private_key.pem -out pkcs1_rsa_private_key.pem

1.2 SM2密钥对

# 生成SM2密钥参数和私钥
openssl ecparam -name SM2 -out ec_param.pem -param_enc explicit -genkey
# 查看私钥信息
openssl ecparam -in ec_param.pem -text
# 验证参数
openssl ecparam -in ec_param.pem -check
# 将私钥转换为PKCS8编码
openssl pkcs8 -topk8 -inform PEM -in ec_param.pem -outform PEM -nocrypt -out sm2_private_key_pkcs8.pem
# 根据私钥产生公钥
openssl ec -in ec_param.pem -pubout -out sm2_public_key.pem

符合0009规范标准的SM2密钥对

首先看一下0009 SM2密码算法适用规范中定义的SM2公钥:

 

 产生SM2密钥对命令:

1)生成SM2私钥
openssl ecparam -genkey -name SM2 -out SM2PrivateKey.pem
2)生成SM2公钥
openssl ec -in SM2PrivateKey.pem -pubout -out SM2PublicKey.pem

打开SM2公钥文件:

 用工具对密钥主体内容转码:

 红框内容即符合0009规范定义的SM2公钥结构体(04||X||Y):

 这个公钥内容的前半部分是什么呢?这里我们在asn1View里再看一下:

SM2椭圆曲线OID:

 SM2算法标识OID:


1.3 ECC密钥对

1.3.1 产生SECP256R1曲线的ECC密钥对

注意:openssl产生ECC密钥对时,暂不支持SECP256R1曲线参数,可以使用prime256v1曲线代替

# 产生ECC私钥(带曲线参数)
openssl ecparam -genkey -name prime256v1 -param_enc explicit -outform pem -out ec_prime256v1_prikey.pem
# 产生ECC私钥(不带曲线参数 RFC5915)
openssl ecparam -genkey -name prime256v1 -param_enc explicit -outform pem -noout -out ec_prime256v1_prikey.pem
# 显示私钥
openssl pkey -in ec_prime256v1_prikey.pem -text
# 产生ECC公钥
openssl ec -in ec_prime256v1_prikey.pem -pubout -out ec_pubkey.pem

1.3.2 产生SECP256K1曲线的ECC密钥对

openssl ecparam -genkey -name secp256k1 -param_enc explicit -outform pem -noout -out ec_secp256k1_prikey.pem

openssl ec -in ec_secp256k1_prikey.pem -pubout -out ec_secp256k1_pubkey.pem

openssl req -x509 -new -days 3650 -key ec_secp256k1_prikey.pem -out ec_secp256k1.cer

2. 查看ASN1编码文件

openssl asn1parse -i -in pkcs1.pem

3. 证书相关

# 产生证书请求文件
openssl req -new -key rsa_private_key.pem -out rsaCerReq.csr
# 生成证书
openssl x509 -req -days 3650 -in rsaCerReq.csr -signkey rsa_private_key.pem -out rsaCert.crt
# 生成RSA密钥并生成证书
openssl req -x509 -nodes -newkey rsa:1024 -keyout keyfile.key -out certificate.cer
# 签名(不带证书)
openssl smime -sign -md sha1 -binary -nocerts -noattr -in data.txt -out data.txt.signed -outform der -inkey keyfile.key -signer certificate.cer
# 签名(带证书)
openssl smime -sign -md sha1 -binary -noattr -in data.txt -out data.txt.signed -outform der -inkey keyfile.key -signer certificate.cer

# 产生ECC证书
openssl req -x509 -new -days 3650 -key ec_prime256v1_prikey.pem -out ec.cer

4. 签名验签

# 生成PKCS7签名结构
openssl smime -sign -md sha1 -binary -noattr -pk7out -in data.txt -out data.txt.signed -outform der -inkey keyfile.key -signer certificate.cer
# 从PKCS7结构中提取签名值
dd if=data.txt.signed of=signed-sha1.bin bs=1 skip=$[212+3] count=128
# 查看签名数据(签名数据最后128字节)
hexdump -C signed-sha1.bin
# 解析签名结果(最后一个OCTET STRING即为签名值)
openssl asn1parse -inform der -in data.txt.signed
# 从证书中提取公钥
openssl x509 -inform pem -in certificate.cer -noout -pubkey > pubkey.pem
# 验证签名(verifyed.bin中为数据的HASH值)
openssl rsautl -verify -pubin -inkey pubkey.pem < signed-sha1.bin > verifyed.bin
# 查看验签结果
openssl asn1parse -inform der -in verifyed.bin
# 对原文计算HASH
sha1sum data.txt
# 对比结果一致

5. CA签发证书

# 1.初始化目录
mkdir -p ./myDemo/demoCerts
touch ./myDemo/index.txt
echo '02' > ./myDemo/serial
# 2.生成CA私钥
openssl ecparam -name SM2 -out ca.pem -param_enc explicit -genkey
# 3.根据私钥产生公钥
openssl ec -in ca.pem -pubout -out ca_pub.pem
# 4.生成CA证书请求文件
openssl req -new -key ca.pem -out ca.csr
# 5.生成CA证书
openssl x509 -req -in ca.csr -signkey ca.pem -days 3650 -out ca.cer
# 6.CA签发证书
openssl ca -in my_rsa.csr -cert ca.cer -keyfile ca.pem -out my_rsa.cer

<think>我们正在模拟证书签发过程,使用OpenSSL命令行工具。证书签发通常涉及以下步骤: 1. 生成根证书的私钥 2. 创建自签名的根证书CA证书) 3. 生成服务器(或用户)证书的私钥 4. 创建服务器证书证书签名请求(CSR) 5. 使用证书的私钥对服务器证书的CSR进行签名,生成服务器证书 下面我们逐步进行: ### 步骤1: 生成根证书的私钥 使用以下命令生成一个RSA私钥(例如,2048位): ```bash openssl genrsa -out ca.key 2048 ``` ### 步骤2: 创建自签名的根证书 使用上一步生成的私钥创建自签名的根证书CA证书)。在生成证书时,需要提供一些信息(如国家、组织等): ```bash openssl req -new -x509 -days 3650 -key ca.key -out ca.crt ``` 执行此命令后,会提示输入一些信息,这些信息将被嵌入到根证书中。 ### 步骤3: 生成服务器证书的私钥 同样,生成一个用于服务器证书的私钥: ```bash openssl genrsa -out server.key 2048 ``` ### 步骤4: 创建服务器证书证书签名请求(CSR) 使用服务器私钥生成证书签名请求(CSR): ```bash openssl req -new -key server.key -out server.csr ``` 同样,需要输入一些信息(注意:这些信息不必与根证书相同,但通常一些字段如国家、组织等需要符合一定的规则)。 ### 步骤5: 使用证书签发服务器证书 使用证书的私钥和根证书对服务器证书的CSR进行签名: ```bash openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt ``` 这里: - `-CA` 指定根证书 - `-CAkey` 指定根证书的私钥 - `-CAcreateserial` 选项会生成一个序列号文件(ca.srl),用于记录下一个可用的序列号 ### 证书 我们可以证服务器证书是否由根证书签发: ```bash openssl verify -CAfile ca.crt server.crt ``` ### 示例 假设我们模拟一个简单的CA和服务器证书签发过程,具体命令如下: 1. 生成CA私钥: ```bash openssl genrsa -out ca.key 2048 ``` 2. 生成自签名CA证书(有效期10年): ```bash openssl req -new -x509 -days 3650 -key ca.key -out ca.crt # 输入信息示例: # Country Name (2 letter code) []:CN # State or Province Name (full name) []:Beijing # Locality Name (eg, city) []:Beijing # Organization Name (eg, company) []:My CA # Organizational Unit Name (eg, section) []:Root CA # Common Name (eg, fully qualified host name) []:My CA # Email Address []:ca@example.com ``` 3. 生成服务器私钥: ```bash openssl genrsa -out server.key 2048 ``` 4. 生成服务器CSR: ```bash openssl req -new -key server.key -out server.csr # 输入信息示例(注意Common Name是服务器的域名,例如:www.example.com): # ... 其他信息可以不同,但Common Name要写服务器域名 ``` 5. 用CA证书签名服务器CSR: ```bash openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt ``` 6. 证: ```bash openssl verify -CAfile ca.crt server.crt ``` 这样,我们就得到了: - `ca.key`: CA私钥 - `ca.crt`: CA证书(根证书) - `server.key`: 服务器私钥 - `server.csr`: 服务器证书签名请求(可保留或删除) - `server.crt`: 服务器证书(由CA签发) ### 注意事项 - 在实际应用中,CA的私钥必须严格保护,因为泄露CA私钥意味着可以签发任意证书。 - 上述过程是简化版,实际中可能还会涉及扩展项(如主题备用名称SAN)等,可以通过配置文件添加。 ### 添加扩展项(可选) 如果需要为服务器证书添加扩展项(例如subjectAltName),可以创建一个配置文件(如`server.ext`): ``` authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = www.example.com DNS.2 = example.com ``` 然后在签名使用该配置文件: ```bash openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile server.ext ``` 这样生成的服务器证书就包含了SAN扩展。 §§相关问题§§ 1. 如何为OpenSSL生成的证书添加主题备用名称(SAN)? 2. 如何使用OpenSSL创建中间CA签发证书? 3. 如何将根证书安装到系统信任库中? 4. OpenSSL命令中,`-CAcreateserial`参数的作用是什么? 5. 如何查看证书详细信息(如有效期、颁发者、主题等)?</think>### OpenSSL命令行模拟证书签发过程 OpenSSL命令行工具模拟证书签发过程主要包括以下步骤: #### 1. 生成根证书CA证书) ```bash # 生成CA私钥 openssl genrsa -out ca.key 2048 # 创建自签名证书(有效期10年) openssl req -new -x509 -days 3650 -key ca.key -out ca.crt ``` 执行后会提示输入证书信息(国家/组织/通用名等),通用名建议使用`My Root CA`。 #### 2. 生成服务器证书请求(CSR) ```bash # 生成服务器私钥 openssl genrsa -out server.key 2048 # 创建证书签名请求(CSR) openssl req -new -key server.key -out server.csr ``` 在通用名(Common Name)处输入服务器域名(如`www.example.com`)。 #### 3. 签发服务器证书 ```bash # 使用CA证书签发服务器证书 openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt ``` 参数说明: - `-CAcreateserial`:生成唯一的序列号文件(`ca.srl`) - `-days 365`:证书有效期1年 - 输出`server.crt`为最终签发证书 #### 4. 证书链 ```bash # 证书是否由CA签发 openssl verify -CAfile ca.crt server.crt # 查看证书详细信息 openssl x509 -in server.crt -text -noout ``` #### 完整流程示例 ```bash # 生成CA openssl genrsa -out ca.key 2048 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt # 生成服务器证书 openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt # openssl verify -CAfile ca.crt server.crt ``` #### 关键文件说明: | 文件 | 作用 | |------|------| | `ca.key` | CA私钥(需严格保密) | | `ca.crt` | 根证书(需分发给客户端) | | `server.key` | 服务器私钥 | | `server.csr` | 证书签名请求(可删除) | | `server.crt` | 最终服务器证书 | ### 常见问题解决 1. **证书证失败**: ```bash # 添加CA信任链 cat ca.crt >> /etc/ssl/certs/ca-certificates.crt ``` 2. **缺少扩展属性**: 使用配置文件添加扩展(创建`ext.cnf`): ```ini [ req ] req_extensions = v3_req [ v3_req ] subjectAltName = @alt_names [ alt_names ] DNS.1 = www.example.com ``` 签发时添加:`-extfile ext.cnf -extensions v3_req` 3. **密钥格式转换**(如需要PKCS#12格式): ```bash openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt ``` > 注意:生产环境应使用更安全的椭圆曲线密钥(如`openssl ecparam -genkey -name prime256v1`),并设置合理的证书有效期[^1]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洒家肉山大魔王

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值