openssl 生成自签名证书

生成自签名证书(不能用于生产环境)

其中的目录 /root/ssl 必须事先存在

1
2
3
4
5
openssl req -x509 -nodes \
-days 365 \
-newkey rsa:2048 \
-keyout /root/ssl/nginx.key \
-out /root/ssl/nginx.crt

参数说明
-req 请求处理器,用于处理SSL证书的请求。
-x509 指定生成一个X509格式的SSL证书。
-nodes 指定不对生成的SSL证书进行加密。
-days 365 指定证书的有效期为365天
-newkey rsa:2048 创建一个新的2048位的密钥
-keyout /root/ssl/nginx.key 私钥文件
-out /root/ssl/nginx.crt 证书文件

查看证书(网站的ssl证书也可以使用此方法)

1
2
#查看证书的起始日期和过期日期
openssl x509 -in /root/ssl/nginx.crt -noout -dates

返回结果
notBefore=Mar 25 18:16:56 2024 GMT
notAfter=Mar 25 18:16:56 2025 GMT

1
2
# 查看证书的过期日期
openssl x509 -enddate -noout -in /root/ssl/nginx.crt

返回结果
notAfter=Mar 25 18:16:56 2025 GMT

检查证书(网站的ssl证书也可以使用此方法)

python脚本,检查证书是否过期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3

import subprocess
import datetime

domain = "abc.com"
today = datetime.datetime.today() # 2024-05-30 04:28:26.287235

p1 = subprocess.Popen(["openssl", "x509", "-noout", "-enddate", "-in", "/path/ssl/%s/cert.pem" % domain], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "notAfter"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
output = p2.communicate()[0].strip()[9:].decode('utf-8') # Aug 27 06:57:08 2024 GMT

expire_date = datetime.datetime.strptime(output, '%b %d %H:%M:%S %Y %Z') # 2024-08-27 06:57:08
delta = expire_date - today # 89 days, 2:31:50.550693
#print(delta.days) # 89

if delta.days > 7:
print("你的 %s 证书将在 %d 天后过期!" % (domain, delta.days))
elif delta.days <= 0:
print(f"你的 {domain} 证书已过期!")
else:
print(f"你的 {domain} 证书将在 {delta.days} 天内过期,请尽快更新证书!")

shell脚本,检查证书是否过期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# 使用openssl检查证书文件是否过期
# 替换下面的'/path/to/certificate.pem'为您的证书文件路径

EXPIRE_DATE=`openssl x509 -enddate -noout -in /path/to/certificate.pem | sed 's/notAfter=//'`
CURRENT_DATE=`date +%s`
EXPIRE_DATE_SEC=`date +%s -d "$EXPIRE_DATE"`

if [ "$EXPIRE_DATE_SEC" -lt "$CURRENT_DATE" ]; then
echo "SSL证书已过期"
else
echo "SSL证书未过期,有效期至 $EXPIRE_DATE"
fi