OpenSSL 常见用法与命令输出解析

1. OpenSSL 常见用法

1.1 查看 OpenSSL 版本

bash 复制代码
openssl version

输出示例:

plain 复制代码
OpenSSL 1.1.1k  25 Mar 2021
  • 用途:
    • 检查当前安装的 OpenSSL 版本。
    • 确保使用的是支持现代协议(如 TLS 1.3)的版本。

1.2 生成密钥

生成一个 2048 位的 RSA 私钥,存储在 rsa.key 文件中。

bash 复制代码
openssl genrsa -out rsa.key 2048

使用 prime256v1 椭圆曲线生成一个 ECC 私钥。

bash 复制代码
openssl ecparam -genkey -name prime256v1 -out ecc.key

从rsa私钥中提取公钥。

bash 复制代码
openssl rsa -in rsa.key -pubout -out rsapublic.key

从ecc私钥中提取公钥。

bash 复制代码
openssl ec -in ecc.key -pubout -out eccpublic.key

1.3 生成证书请求(CSR)

bash 复制代码
openssl req -new -key private.key -out request.csr

交互式输入

创建一个证书签名请求(CSR),供 CA 签署生成证书,OpenSSL 会提示输入一些证书信息,例如:

plain 复制代码
Country Name (C): CN
State or Province Name (ST): GuangDong
Locality Name (L): GuangDong
Organization Name (O): My Company
Organizational Unit Name (OU): IT
Common Name (CN): www.example.com
Email Address: admin@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

1.4 自签名证书

使用已有私钥生成证书。

bash 复制代码
openssl req -x509 -new -key rsa.key -out cert.pem -days 365
  • 输出描述:
    • 使用私钥生成一个有效期为 365 天的自签名证书。
    • 自签名证书可用于测试环境,不适合生产环境。

同时生成私钥和证书。

bash 复制代码
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/nginx.key \
    -out /etc/nginx/ssl/nginx.crt

生成一个新的 2048 位 RSA 私钥和一个自签名证书,分别存储在 /etc/nginx/ssl/nginx.key/etc/nginx/ssl/nginx.crt,适用于快速配置 Nginx 等 Web 服务。


1.5 检查证书信息

查看证书有效期。

bash 复制代码
openssl x509 -in cert.pem -noout -dates

输出示例:

plain 复制代码
notBefore=Aug 26 09:48:09 2020 GMT
notAfter=Aug 24 09:48:09 2030 GMT

查看证书详细信息,包括颁发者(Issuer)、有效期(Validity)、签名算法、公共名(CN)等。

bash 复制代码
openssl x509 -in cert.pem -text -noout

输出示例:

plain 复制代码
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            cd:f7:04:32:6e:c5:3b:3b
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=XX, L=Default City, O=Default Company Ltd
        Validity
            Not Before: Dec 26 05:49:08 2024 GMT
            Not After : Dec 26 05:49:08 2025 GMT
        Subject: C=XX, L=Default City, O=Default Company Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
        ...

1.6 测试 HTTPS 连接

测试服务器的 HTTPS 配置。

bash 复制代码
openssl s_client -connect www.example.com:443

输出示例:

plain 复制代码
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert Global G2 TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet\C2\A0Corporation\C2\A0for\C2\A0Assigned\C2\A0Names\C2\A0and\C2\A0Numbers, CN = www.example.org
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Los Angeles/O=Internet\xC2\xA0Corporation\xC2\xA0for\xC2\xA0Assigned\xC2\xA0Names\xC2\xA0and\xC2\xA0Numbers/CN=www.example.org
   i:/C=US/O=DigiCert Inc/CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1
 1 s:/C=US/O=DigiCert Inc/CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2
---
  • depth=0 表示服务器的证书。
  • verify return:1 表示证书验证成功。
  • Certificate chain 显示证书链的各级证书。

2. 常见命令输出解析

2.1 自签名证书错误

plain 复制代码
verify error:num=18:self signed certificate
verify return:1
  • 解析:
    • num=18 表示证书是自签名的,没有可信的 CA 签署。
    • 生产环境中须更换为由可信 CA 签署的证书。

2.2 证书过期错误

bash 复制代码
verify error:num=10:certificate has expired
  • 解析:
    • num=10 表示证书已过期。
    • 解决方法:更新证书或检查服务器时间是否正确。

2.3 中间人攻击可能性

如果证书的颁发者(Issuer)是未知组织或设备(如 WAF、代理),则可能存在中间人攻击风险。可以通过以下命令检查:

bash 复制代码
openssl s_client -connect www.example.com:443 | openssl x509 -noout -issuer

2.4 证书链不完整

plain 复制代码
verify error:num=21:unable to verify the first certificate
  • 解析:
    • num=21 表示证书链不完整,可能缺少中间证书。
    • 解决方法:检查服务器证书配置,确保完整的证书链(包括中间证书和根证书)。

3. OpenSSL 加密与解密

3.1 使用对称加密

使用 AES-256-CBC 算法加密和解密文件。

加密:

bash 复制代码
openssl enc -aes-256-cbc -salt -in test.txt -out entest.txt

解密:

bash 复制代码
openssl enc -d -aes-256-cbc -in entest.txt -out detest.txt

3.2 使用 RSA 加密

使用 RSA 公钥加密和私钥解密。

加密:

bash 复制代码
openssl rsautl -encrypt -inkey public.key -pubin -in plaintext.txt -out encrypted.txt

解密:

bash 复制代码
openssl rsautl -decrypt -inkey private.key -in encrypted.txt -out decrypted.txt

4. OpenSSL 常见问题与解决方法

4.1 如何解决自签名证书问题?

方法 1:忽略自签名证书错误(仅用于测试):

bash 复制代码
openssl s_client -connect example.com:443 -verify_return_error

方法 2:将自签名证书导入信任存储:

bash 复制代码
openssl s_client -connect example.com:443 -showcerts > server_cert.pem

4.2 如何验证证书链?

命令格式:

bash 复制代码
openssl verify -CAfile <CA_certificate> <target_certificate>
  • -CAfile <CA_certificate>:指定信任的根 CA 或中间 CA 证书文件,用于验证目标证书签名的合法性。
  • <target_certificate>:指定需要验证的目标证书文件。

自签名证书验证:

bash 复制代码
openssl verify -CAfile cert.pem cert.pem

如果返回 OK,表示证书链完整。

相关推荐
DemonAvenger4 小时前
Go中UDP编程:实战指南与使用场景
网络协议·架构·go
2501_916007474 小时前
iOS 性能测试工具全流程:主流工具实战对比与适用场景
websocket·tcp/ip·http·网络安全·https·udp
阿维的博客日记4 小时前
HTTP/3.0的连接迁移使用连接ID来标识连接为什么可以做到连接不会中断
网络·网络协议·http
半路_出家ren4 小时前
第8章:应用层协议HTTP、SDN软件定义网络、组播技术、QoS
网络·网络协议·http·mpls·qos·sdn软件定义网络·组播技术
teeeeeeemo5 小时前
http和https的区别
开发语言·网络·笔记·网络协议·http·https
令狐少侠20118 小时前
ai之对接电信ds后端服务,通过nginx代理转发https为http,对外请求,保持到达第三方后请求头不变
nginx·ai·https
岸边的风20 小时前
无需公网IP的文件交互:FileCodeBox容器化部署技术解析
网络·网络协议·tcp/ip
2501_9153743521 小时前
UDP vs TCP:核心差异与应用场景全解析
网络协议·tcp/ip·udp
Edingbrugh.南空21 小时前
操作系统级TCP性能优化:高并发场景下的内核参数调优实践
网络协议·tcp/ip·性能优化
yqcoder1 天前
1. http 有哪些版本,你是用的哪个版本,怎么查看
网络·网络协议·http