各位运维同仁肯定都多多少少面临过,为了节省不必要的开支,很多不那么重要的域名https
证书大多数都是申请的免费的单域名证书,这造成检测非常不方便,虽然运营商ssl
证书到期前会预警,但是为了避免该类问题,我们可以编写一个web
用于检测ssl
证书检测工具。
搭建demo
我们还是使用我们编写的SampleHttp
框架来做该需求,我们先建立整体框架,定义查询路由为: /sslcheck
请求方式为get
,请求参数为: domain_name=xxx
。
如上代码,我们已经搭建了整体框架,在请求/sslcheck
路由的时候,传入一个domain_name
的域名,我们立即就将域名信息返回给客户端,我们启动程序来测试一下呢。
命令:
curl http://127.0.0.1:8082/sslcheck?domain_name=www.juejin.cn curl http://127.0.0.1:8082/sslcheck?domain_name=www.pdudo.juejin.cn
如上命令,由于?
和=
在shell
中具有特殊意义,所以将使用原生字符,得加上``进行转义才行。
如何检测ssl证书
如上demo
我们已经搭建好了,我们想做的功能是,查询域名,我们进行证书检测,从而将证书创建时间和过期时间以及还有多少天过期返回给客户端,那么现在的问题是我们如何检测ssl
证书呢?
好在go
给我们提供了相关tls
,该库名称为: crypto/tls
,我们使用该库即可抓到ssl
证书信息。
我们看下使用代码应该如何进行抓取。
如上代码,我们使用tls.Dial
连接服务器,而后使用conn.ConnectionsState()
可以获取基本的TLS
信息。而下面的PeerCertificates
可以获取TLS
的证书链,注意,这是一个数组,只有0
才是记录的本地址哦。
我们执行下代码
我们可以打开浏览器校验一下
如上图示,可见,我们代码和手动查看证书时间期间一致。
整合代码进入web框架
我们按照上述的框架期望,将2者代码合并,形成一套工具,我们可以看下代码。
我们将检测https
证书整理为函数,代码如下:
如上代码,我们增加了一个检测机制,分别是,如果是后缀没有加端口:443
的话,添加一个:443
(非:443
端口,无法进行检测)。而后是若开头是https://
,则去掉。返回的结果是证书申请时间,证书结束时间以及error
。
main
函数
我们使用将ssl
证书的信息查询后,返回给客户端,采用的是json
格式,若code
为0
则代表查询证书成功,而若code
为1,则代表查询证书失败。
测试功能
我们使用curl
配合linux json
工具jq
进行测试,例如测试检测www.juejin.cn
和www.pdudo.juejin.cn
的结果,我们来看下呢。
命令:
可见,我们拿到了www.juejin.cn
证书时间,是到2022-08-23
到期。
curl -s http://127.0.0.1:8082/sslcheck?domain_name=www.pdudo.juejin.cn | jq
因为本身就不存在www.pdudo.juejin.cn
,当然找不到主机了,所以会报错,我们可以看到其code
为1
。
总结
检测证书小工具,写好了可以集成在我们运维平台中,避免因为错过了证书更新而背锅,那才是最得不偿失的,怎么样,上面例子,很简单,但是也很有用吧,动动小手指,快来试试吧。相关代码已经放到了gitee上了。