域名批量检测ssl证书过期信息

一、云厂导出所有域名子域名解析

1、下载所有主域名子记录 TXT文本

2、导出记录文件

3、通过文件名获取所有主域名

#解压文件,进入目录dnspod_records_2024-03-28_10-47-33
 ls|awk -F'_' '{print $2}' > ../domain_list

4、整理获取最终所有子域名

#获取所有子域名、排序、去重、过滤非业务子域名
cat domain_list | while read mdomain; do cat dnspod_records_2024-03-28_10-47-33/*_"${mdomain}"_*.txt  | awk -v domain="${mdomain}" '{print $1"."domain}'; done |grep -v 最后操作时间|grep -v ^'_dnsauth.'|sort |uniq  > all_sub_domain.txt 

####去掉@、* 字符###
#vi all_sub_domain.txt 
:%s/@.//g
:%s/*./1./g
:wq

二、脚本获取过滤近期过期子域名

2.1 检测过期脚本

cat async_check_ssl.py

#-*- coding: UTF-8 -*-
import asyncio
import ssl
import socket
import dns.resolver
from datetime import datetime
import traceback

"""
使用 ssl.create_default_context() 创建一个默认的SSL上下文,用于管理设置和选项。
接着,我们使用 socket.create_connection() 创建一个到目标服务器的连接,并设置超时为3秒。
最后,使用 context.wrap_socket() 将普通的socket包装成SSL socket,这样就可以安全地进行通信并获取证书信息。

方法的优点是它提供了更底层的控制,并且可以在连接时直接处理SSL握手,从而允许你检查SSL证书的有效性。
不过,请注意,这种同步操作需要在异步环境中正确管理,以避免阻塞事件循环。
我们通过在异步函数中使用 async with semaphore 来限制并发,确保不会因为同时打开过多连接而导致资源耗尽。
"""
async def check_ssl(domain, semaphore):
    async with semaphore:  # 使用semaphore限制并发
        resolver = dns.resolver.Resolver(configure=False)
        resolver.nameservers = ['8.8.8.8']
        try:
            a_records = resolver.resolve(domain, 'A')
            ip_address = str(a_records[0])
            context = ssl.create_default_context()
            with socket.create_connection((ip_address, 443), timeout=3) as sock:
                with context.wrap_socket(sock, server_hostname=domain) as ssock:
                    cert = ssock.getpeercert()
                    exp_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
                    print(f"SSL Certificate for {domain} is valid until {exp_date}.")
        except Exception as e:
            print(f"Error: {str(e)} for domain {domain}")
            #traceback.print_exc()

async def main():
    all_subdomain_list = []
    file = open("/tmp/wps.cn.txt", 'r')
    for line in file:
        all_subdomain_list.append(line.strip())
    file.close()

    semaphore = asyncio.Semaphore(4)  # 创建Semaphore
    tasks = [check_ssl(domain, semaphore) for domain in all_subdomain_list]
    await asyncio.gather(*tasks)

if __name__ == "__main__":
    asyncio.run(main())

2.2 执行检测、过滤

## python async_check_ssl.py
SSL Certificate for a.cn is valid until 2025-04-09 23:59:59.
SSL Certificate for act.a.cn is valid until 2025-04-09 23:59:59.
Error: The DNS response does not contain an answer to the question: mail._domainkey.act.wps.cn. IN A for domain mail._domainkey.act.a.cn
Error: All nameservers failed to answer the query api.s.wps.cn. IN A: Server 8.8.8.8 UDP port 53 answered SERVFAIL for domain api.s.a.cn
Error: All nameservers failed to answer the query api.s.wps.cn. IN A: Server 8.8.8.8 UDP port 53 answered SERVFAIL for domain api.s.a.cn
Error: timed out for domain csdyn.wps.cn
Error: timed out for domain dyn.wps.cn
SSL Certificate for ic.a.cn is valid until 2025-03-31 23:59:59.
SSL Certificate for ic.a.cn is valid until 2025-03-31 23:59:59.
Error: timed out for domain info.a.cn
Error: timed out for domain info.a.cn
Error: timed out for domain minfo.a.cn
Error: timed out for domain minfo.a.cn
Error: timed out for domain qdyn.a.cn
......

#过滤四月到期子域名
# python async_check_ssl.py.py |grep -E 'valid until 2024-04-'

##也可 后台执行
nohup  python async_check_ssl.py >> all_subdomain_sslinfo.txt  &
#cat all_subdomain_sslinfo.txt|grep -E '2024-03|2024-04-0'

2.3 更新 或 通知业务处理即将过期域名证书

· 提前申请、更新域名证书

· 未使用的业务子域名可以申请回收解析、下线相关服务

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
Secured By miniOrange