OpenSSL 学习笔记及项目应用
OpenSSL官方命令手册:OpenSSL commands - OpenSSL Documentation
参考教程:
操作:OpenSSL的基本使用教程(一)_openssl.exe使用教程-CSDN博客
操作:Linux和Shell回炉复习系列文章总目录 - 骏马金龙 - 博客园 (cnblogs.com)
网站应用:最新OpenSSL简明教程_openssl使用教程-CSDN博客
项目应用:spring-boot-sign: SpringBoot请求响应加签、验签 (gitee.com)
最详细的SpringBoot实现接口校验签名调用_springboot接口签名验证-CSDN博客
概念
公钥和私钥
公钥:可以公开分享,用于加密数据或验证数字签名。
私钥:必须保密,用于解密数据或创建数字签名。
关系:公钥和私钥是成对出现的,使用公钥加密的数据只能由对应的私钥解密,反之亦然。
一个完整的RSA私钥包含了以下几个关键参数:
模数(Modulus,N)
公钥指数(Public Exponent,e)
私钥指数(Private Exponent,d)
素数p(Prime 1,p)
素数q(Prime 2,q)
指数dp(Exponent 1,dp)
指数dq(Exponent 2,dq)
系数(Coefficient,qinv)
数字签名
数字签名使用私钥创建,确保数据的完整性和来源的真实性。
验证签名使用公钥,可以确认数据是否被篡改,并且确认数据确实来自特定的私钥持有者。
数字证书
数字证书由受信任的证书颁发机构(CA)签发,包含公钥及其所有者的身份信息。
证书用于验证公钥的真实性,确保其属于声明中的持有者。
对称加密和非对称加密
对称加密:使用相同的密钥进行加密和解密,例如 AES、DES。
非对称加密:使用一对公钥和私钥进行加密和解密,例如 RSA。
对称加密速度快,适合大数据量;非对称加密安全性高,适合小数据量。
证书链
证书链由一系列证书组成,确保最终用户证书的可信性。
包括根证书(CA)、中间证书和最终用户证书。
验证证书链时,必须从根证书到最终用户证书逐级验证。
常见文件后缀
.key:通常用于表示私钥或公钥文件。这个后缀比较通用,可以表示任何类型的加密密钥。 private.key(私钥),public.key(公钥)。
.pub:通常用于表示公钥文件。这个后缀明确指示文件包含公钥。id_rsa.pub(RSA 公钥),id_ecdsa.pub(ECDSA 公钥)。
.pri:通常用于表示私钥文件。虽然不是标准后缀,但一些系统或工具可能使用这个后缀来标识私钥文件。 private.pri。
.pem: PEM(Privacy Enhanced Mail)格式文件的标准后缀,通常用于存储证书、私钥、公钥和证书链。文件内容通常以 Base64 编码并用 "-----BEGIN CERTIFICATE-----" 等标头和尾标记。cert.pem(证书),private.pem(私钥),public.pem(公钥)。
.crt:通常用于表示 X.509 证书文件。这个后缀通常用于证书文件,格式可以是 PEM 或 DER。server.crt(服务器证书),ca.crt(CA 证书)。
.csr:用于表示证书签名请求(Certificate Signing Request)文件。CSR 文件包含申请证书时的必要信息。request.csr。
.der:DER(Distinguished Encoding Rules)格式文件的标准后缀,通常用于存储二进制编码的证书或密钥。不同于 PEM 格式,DER 文件是二进制格式,没有 Base64 编码。cert.der(证书),private.der(私钥)。
操作
(零)使用 OpenSSL 的流程
生成密钥对:使用
openssl genpkey和openssl rsa生成私钥和公钥。创建 CSR:使用
openssl req创建证书签名请求。获得数字证书:通过 CA 颁发或自签名生成证书。
加密和签名:使用公钥加密数据,使用私钥签名数据。
解密和验证签名:使用私钥解密数据,使用公钥验证签名。
(一)安装OpenSSL
(二)生成自签名证书
生成一张自签名证书,类似一张独一无二的会员卡。
生成私钥 私钥是证书的核心。首先生成一个2048位的RSA私钥:
加钥私密文件
生成证书签名请求(CSR) 使用私钥生成一个CSR文件,这是获得数字证书的关键步骤,CSR包含了申请者的身份信息和公钥
在这个过程中,会被提示输入一些信息,以下字段是必填的:
Country Name (2 letter code):CN
State or Province Name (full name):Guangdong
Locality Name (eg, city):Guangzhou
Organization Name (eg, company):SCNU
Common Name (e.g. server FQDN or YOUR name):Xuan
而以下字段是可选的:
Organizational Unit Name (eg, section)
Email Address
A challenge password
An optional company name

image-20240725085508784 生成自签名证书 使用CSR和私钥生成一个有效期为一年的自签名证书:
(三)基本使用
查看证书信息 使用以下命令查看证书的详细信息:
加密文件 使用公钥加密一个文件:
解密文件 使用私钥解密文件:
(四)其他使用
openssl speed测试加密算法的性能openssl rand生成伪随机数openssl passwd生成加密的密码openssl dgst生成和验证数字签名openssl rsautl和openssl pkeyutl:文件的非对称加密rsautl是rsa的工具,相当于rsa、dgst的部分功能集合,可用于生成数字签名、验证数字签名、加密和解密文件。
pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多
项目实践
(一)在SpringBoot中使用
OpenSSL生成密钥和证书,配置HTTPS
在JWT中使用(JWT详细介绍可见:浅析JWT原理及牛客出现过的相关面试题-CSDN博客),在Spring Boot应用中使用JWT进行认证和授权时,可以使用生成的私钥和公钥进行签名和验证。
(二)在区块链项目中使用
使用私钥对交易进行签名。使用Java的Bouncy Castle库进行签名
添加Bouncy Castle依赖
创建证书生成工具类
CertificateGenerator使用工具类
CertificateGenerator生成密钥对和自签名证书
TIPS/BUGS
验证openssl version时报错version not found
背景:在使用openssl version时出现openssl: /lib/x86_64-linux-gnu/libcrypto.so.3: version OPENSSL_3.0.9' not found (required by openssl)
解决办法:
加密时报错Could not read public key from mycert.crt
Could not read public key from mycert.crt意思是在证书中读取不到公钥,这种情况就把公钥提取出来,再用公钥文件加密即可
openssl genrsa 和openssl genpkey -algorithm rsa有什么区别?
openssl genrsa 和openssl genpkey -algorithm rsa有什么区别?openssl pkey 更通用,可以处理多种私钥 openssl rsa 专门处理RSA密钥
openssl-genpkey - OpenSSL Documentation明确指出应使用genpkey,而不是特定于算法的 genrsa:
The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.
最后更新于