之前写过一个检查HTTPS证书的《证书到期检查》,今天遇到个需求要检查FTPS的。
问AI,给个大体的代码,但是跑不通,还是自己搜索找到了答案。
代码很简单,用ftplib库连接服务器,由sock获取到证书,检查下就行了:
from ftplib import FTP_TLS
from datetime import datetime
import ssl
def get_cert_expiry_date(hostname, port=21):
try:
# 创建 FTPS 连接
ftps = FTP_TLS(context=ssl._create_stdlib_context(cert_reqs=ssl.CERT_REQUIRED))
ftps.connect(hostname, port)
ftps.auth() # 发送 AUTH TLS 命令
#ftps.prot_p() # 切换到安全数据连接,这句好像对检查证书无用
# 获取 SSL socket 并提取证书
cert = ftps.sock.getpeercert(binary_form=False) # cert_reqs=ssl.CERT_REQUIRED 才能获取到解析好的字典证书
# print(cert)
## 获取PEM格式的需要这样
# cert = ftps.sock.getpeercert(binary_form=True)
# pem_cert = ssl.DER_cert_to_PEM_cert(cert)
# print(pem_cert)
# 解析证书的有效期
begin_date = datetime.strptime(cert['notBefore'], '%b %d %H:%M:%S %Y %Z')
expiry_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
try:
ftps.quit()
except Exception as e:
ftps.close()
return begin_date,expiry_date
except Exception as e:
print(f"获取证书时出错: {e}")
return None
def check_cert_expiry(hostname, port=21):
_, expiry_date = get_cert_expiry_date(hostname, port)
if expiry_date:
current_date = datetime.now()
if current_date > expiry_date:
print(f"证书已过期!过期日期: {expiry_date}")
else:
print(f"证书未过期,有效至: {expiry_date}")
if __name__ == "__main__":
ftps_host = "ftps.example.net" # 替换为你的 FTPS 服务器地址
ftps_port = 21 # 默认 FTPS 端口(显式 FTPS)
check_cert_expiry(ftps_host, ftps_port)
输出只有一行字:
证书未过期,有效至: 2026-01-18 23:59:59