自动检查SSL证书到期情况 - 无垠
Axton
Always dream. Always explore.
无垠

自动检查SSL证书到期情况

这是什么鬼?

自从我换了ECS,无垠旗下的各种项目也陆陆续续换成了HTTPS协议。然而,随着HTTPS使用越来越广泛,我手头的证书也越来越多。Let's的证书还好说嘛,可以搞自动续期,但各种CDN上的证书就难搞了...何况我在各大CDN服务商都有挂域名。我才懒得检查证书有效期嘞!So,我打算利用手头的技术搞点事情。

自动检查SSL证书情况!Yeah!Demo:无垠证书透明

让我们开始吧

如何获取证书信息让我纠结了很久。因为咱都知道你申请到的证书都是一坨乱码,直接读当然不行。一开始找到一个冷门的Python轮子结果并不支持Let's的证书,直接报不信任。花了老半天终于发现curl就自带检查emmmm

执行curl 你的URL -v可以看到(一定要加https://)

https://acdn.flyhigher.top/wp-content/uploads/2017/10/Axton2017.jpg

curl不止会输出连接信息,还会输出下载到的全文到终端。很显然如果任由curl把全文输出到终端非常不利于我们提取出我们需要的时间数据,何况这些是输出到stderr的。因此我们需要把输出重定向到一个文件然后用cat+grep控制输出。

所以咱这次不瞎扯了,直接上手程序。Python 3坠吼了!

# -*- coding:utf-8 -*-
#依赖库只有一个:pymysql,记得安装
#需要一个MySQL数据库,数据库结构看代码下面的图
import subprocess
import os
import time
import pymysql

db = pymysql.connect("数据库地址","数据库用户名","数据库密码","数据库名")
cursor = db.cursor()
cursor.execute("SET NAMES utf8");#设置数据库连接字符集

websitelist = ['flyhigher.top','acdn.flyhigher.top'] #需要检查的域名列表,无需填写协议名,同时支持端口号。建议先在数据库里面添加相应数量的记录,每条记录仅需填写ID,因为我懒没在代码里处理
for i in range(len(websitelist)):
    comm1 = "curl https://"+websitelist[i]+" --connect-timeout 10 -v -s -o /dev/null 2>/tmp/ca.info ; cat /tmp/ca.info | grep 'start date: '" #利用curl检查证书开始时间,注意一下ca.info保存路径,connect-timeout可以控制超时时间,避免假死
    out_bytes1 = subprocess.check_output(comm1, shell=True)
    out_text1 = out_bytes1.decode('utf-8')
    comm2 = "cat /tmp/ca.info | grep 'expire date: '" #检查证书到期时间
    out_bytes2 = subprocess.check_output(comm2, shell=True)
    out_text2 = out_bytes2.decode('utf-8')
    comm3 = "cat /tmp/ca.info | grep 'issuer: '" #获取证书颁发机构
    out_bytes3 = subprocess.check_output(comm3, shell=True)
    out_text3 = out_bytes3.decode('utf-8')
    os.system('rm -f /tmp/ca.info')
    sql = 'UPDATE 数据表名 SET domain = "'+websitelist[i]+'", check_time = "'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+'", s_time = "'+time.strftime("%Y-%m-%d %H:%M:%S",time.strptime(out_text1[-25:-5],"%b %d %H:%M:%S %Y"))+'", e_time = "'+time.strftime("%Y-%m-%d %H:%M:%S",time.strptime(out_text2[-25:-5],"%b %d %H:%M:%S %Y"))+'", c_info = "'+out_text3[11:-1].replace('"', "'")+'" WHERE ID = '+str(i+1) #格式化时间及证书颁发机构名称,构造SQL查询
    cursor.execute(sql)
    db.commit()
    time.sleep(1) #睡一会儿,免得太High
db.close()

OK,注释都有了。只要把这段Python扔到服务器上,搞个定时任务每天跑一遍就行了,这就不赘述了。

数据库结构如下,if_s是我用于判断敏感域名的字段,非敏感域名会被展示在前端页面。

https://acdn.flyhigher.top/wp-content/uploads/2017/10/Axton20171.jpg

然后呢

emmm数据都在数据库里了你还想干啥?如果有空可以搞个邮件提醒,或者像我一样做个前端展示页。记得去掉敏感域名就好。

稍后我可能会将其整理并作为一个完整的、带Web面板、支持邮件提醒的项目发布到Github上。

溜了溜了

赞赏
本文链接:https://flyhigher.top/develop/755.html
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可

发表回复

textsms
account_circle
email

  • 原来是这么弄的,看到命令就头大。 :arrow:

    5 年前 回复
  • 莫非只有我一个人用Myssl企业版?! :wink:

    6 年前 回复
  • 用大佬的Python代码然后自己写了PHP也做了一个 :roll: ,然后我发现s_time和e_time是GMT,check_time是按服务器时区来的 :grin: 。强迫症犯了,难受(事实是懒得在PHP里吧时区转换回来 :shock: )。https://board.fsky7.com/ssl/

    6 年前 回复
  • Sukka

    窝也造了一个类似的轮子,不过只用了 shell: https://lab.suka.moe/ssl

    6 年前 回复
  • www

    我想问一下你的代码高亮用的是什么插件啊

    7 年前 回复
  • 主题风格很炫

    7 年前 回复
  • 小超

    哈哈哈

    7 年前 回复
  • 海洋

    666,连input都是md风格的

    7 年前 回复
  • 正在使用博主的MDx主题,很漂亮很好用,这篇文章也有收获,感谢博主的辛勤付出。

    7 年前 回复
  • neoFelhz

    一旦看到每天跑的我就打算改造成 Travis CI 来跑(直接输出 json 并 deploy 到 gh-pages,然后前端 XHR 解析数据就行了

    7 年前 回复
    • NeverBehave

      @neoFelhz: 然而我会选择UptimeRobot,https带证书有效期检查,会发邮件通知还有API

      7 年前 回复

无垠

自动检查SSL证书到期情况
这是什么鬼? 自从我换了ECS,无垠旗下的各种项目也陆陆续续换成了HTTPS协议。然而,随着HTTPS使用越来越广泛,我手头的证书也越来越多。Let's的证书还好说嘛,可以搞自动续期,但各种CD…
扫描二维码继续阅读
2017-10-01