使用go做一个https证书时间检测工具

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

各位运维同仁肯定都多多少少面临过,为了节省不必要的开支,很多不那么重要的域名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格式,若code0则代表查询证书成功,而若code为1,则代表查询证书失败。

测试功能

我们使用curl配合linux json工具jq进行测试,例如测试检测www.juejin.cnwww.pdudo.juejin.cn的结果,我们来看下呢。

命令:

curl -s http://127.0.0.1:8082/sslcheck?domain_name=www.juejin.cn | jq

可见,我们拿到了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,当然找不到主机了,所以会报错,我们可以看到其code1

总结

检测证书小工具,写好了可以集成在我们运维平台中,避免因为错过了证书更新而背锅,那才是最得不偿失的,怎么样,上面例子,很简单,但是也很有用吧,动动小手指,快来试试吧。相关代码已经放到了gitee上了。

posted @ 2022-08-13 23:11  pdudos  阅读(0)  评论(0编辑  收藏  举报  来源