likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 28

各位运维同仁肯定都多多少少面临过,为了节省不必要的开支,很多不那么重要的域名https证书大多数都是申请的免费的单域名证书,这造成检测非常不方便,虽然运营商ssl证书到期前会预警,但是为了避免该类问题,我们可以编写一个web用于检测ssl证书检测工具。

搭建demo

我们还是使用我们编写的SampleHttp框架来做该需求,我们先建立整体框架,定义查询路由为: /sslcheck请求方式为get,请求参数为: domain_name=xxx

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

如上代码,我们已经搭建了整体框架,在请求/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

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

如上命令,由于?=shell中具有特殊意义,所以将使用原生字符,得加上``进行转义才行。

如何检测ssl证书

如上demo我们已经搭建好了,我们想做的功能是,查询域名,我们进行证书检测,从而将证书创建时间和过期时间以及还有多少天过期返回给客户端,那么现在的问题是我们如何检测ssl证书呢?

好在go给我们提供了相关tls,该库名称为: crypto/tls ,我们使用该库即可抓到ssl证书信息。

我们看下使用代码应该如何进行抓取。

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

如上代码,我们使用tls.Dial连接服务器,而后使用conn.ConnectionsState()可以获取基本的TLS信息。而下面的PeerCertificates可以获取TLS的证书链,注意,这是一个数组,只有0才是记录的本地址哦。

我们执行下代码

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

我们可以打开浏览器校验一下

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

如上图示,可见,我们代码和手动查看证书时间期间一致。

整合代码进入web框架

我们按照上述的框架期望,将2者代码合并,形成一套工具,我们可以看下代码。

我们将检测https证书整理为函数,代码如下:

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

如上代码,我们增加了一个检测机制,分别是,如果是后缀没有加端口:443的话,添加一个:443(非:443端口,无法进行检测)。而后是若开头是https://,则去掉。返回的结果是证书申请时间,证书结束时间以及error

main函数

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

我们使用将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

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

可见,我们拿到了www.juejin.cn证书时间,是到2022-08-23到期。

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

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

因为本身就不存在www.pdudo.juejin.cn,当然找不到主机了,所以会报错,我们可以看到其code1

总结

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

转载自:https://juejin.cn/post/7131378441428926501
评论
请登录