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私钥包含了以下几个关键参数:

  1. 模数(Modulus,N)

  2. 公钥指数(Public Exponent,e)

  3. 私钥指数(Private Exponent,d)

  4. 素数p(Prime 1,p)

  5. 素数q(Prime 2,q)

  6. 指数dp(Exponent 1,dp)

  7. 指数dq(Exponent 2,dq)

  8. 系数(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 的流程

  1. 生成密钥对:使用 openssl genpkeyopenssl rsa 生成私钥和公钥。

  2. 创建 CSR:使用 openssl req 创建证书签名请求。

  3. 获得数字证书:通过 CA 颁发或自签名生成证书。

  4. 加密和签名:使用公钥加密数据,使用私钥签名数据。

  5. 解密和验证签名:使用私钥解密数据,使用公钥验证签名。

(一)安装OpenSSL

(二)生成自签名证书

生成一张自签名证书,类似一张独一无二的会员卡。

  1. 生成私钥 私钥是证书的核心。首先生成一个2048位的RSA私钥:

    加钥私密文件

  2. 生成证书签名请求(CSR) 使用私钥生成一个CSR文件,这是获得数字证书的关键步骤,CSR包含了申请者的身份信息和公钥

    在这个过程中,会被提示输入一些信息,以下字段是必填的:

    1. Country Name (2 letter code):CN

    2. State or Province Name (full name):Guangdong

    3. Locality Name (eg, city):Guangzhou

    4. Organization Name (eg, company):SCNU

    5. Common Name (e.g. server FQDN or YOUR name):Xuan

    而以下字段是可选的:

    1. Organizational Unit Name (eg, section)

    2. Email Address

    3. A challenge password

    4. An optional company name

    image-20240725085508784
  3. 生成自签名证书 使用CSR和私钥生成一个有效期为一年的自签名证书:

(三)基本使用

  1. 查看证书信息 使用以下命令查看证书的详细信息:

  2. 加密文件 使用公钥加密一个文件:

  3. 解密文件 使用私钥解密文件:

(四)其他使用

  1. openssl speed测试加密算法的性能

  2. openssl rand生成伪随机数

  3. openssl passwd 生成加密的密码

  4. openssl dgst 生成和验证数字签名

  5. openssl rsautl和openssl pkeyutl:文件的非对称加密

    rsautl是rsa的工具,相当于rsa、dgst的部分功能集合,可用于生成数字签名、验证数字签名、加密和解密文件。

    pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多

项目实践

(一)在SpringBoot中使用

  1. OpenSSL生成密钥和证书,配置HTTPS

  1. 在JWT中使用(JWT详细介绍可见:浅析JWT原理及牛客出现过的相关面试题-CSDN博客),在Spring Boot应用中使用JWT进行认证和授权时,可以使用生成的私钥和公钥进行签名和验证。

(二)在区块链项目中使用

使用私钥对交易进行签名。使用Java的Bouncy Castle库进行签名

  1. 添加Bouncy Castle依赖

  2. 创建证书生成工具类CertificateGenerator

  3. 使用工具类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

意思是在证书中读取不到公钥,这种情况就把公钥提取出来,再用公钥文件加密即可

openssl genrsaopenssl 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.

最后更新于