본문 바로가기
기타

웹사이트 인증서 만료 전 팀즈 채널로 알림

by 앗사비 2020. 6. 4.
728x90

의외로 인증서 만료일을 챙기지 못하는 경우가 있다

만료일 체크를 스케줄러에 등록해서 팀즈 알림이 가도록 함

 

import OpenSSL
import ssl
import socket
import time
from datetime import datetime, timedelta
import pymsteams

domain = 'test.com' #접속 주소

cert = ssl.get_server_certificate((domain, 443))
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
x509info = x509.get_notAfter()

exp_day = x509info[6:8].decode('utf-8')
exp_month = x509info[4:6].decode('utf-8')
exp_year = x509info[:4].decode('utf-8')

exp_date = str(exp_year) + str(exp_month) + str(exp_day)

t = time.time()
today = time.strftime("%Y%m%d", time.gmtime(t))

date_str = today
date_now = datetime.strptime(date_str, "%Y%m%d").date()

date_str2 = exp_date
date_exp = datetime.strptime(date_str2, "%Y%m%d").date()

diff = (date_exp - date_now).days

if diff > 30:
    print('pass')
else:
    noti = domain + " 인증서 만료 " + str(diff) + "일 남았습니다"
    myTeamsMessage = pymsteams.connectorcard("https://")  #웹훅 주소 입력 (커넥터 구성하기)
    myTeamsMessage.text(noti)
    myTeamsMessage.send()

 

출처) 인증서 체크 :  https://gist.github.com/remoharsono/a5b6968b6f06e11a16e5b9cdf4586750

 

---

 

다른 코드 (도메인 리스트 / openssl 미사용)

 

import ssl, socket
from datetime import datetime, timedelta
import time
import pymsteams

# 도메인 리스트 - 오류나면 www 추가
list = ['google.com', 'naver.com']

for hostname in list:
	ctx = ssl.create_default_context()
	with ctx.wrap_socket(socket.socket(), server_hostname=hostname) as s:
		s.connect((hostname, 443))
		cert = s.getpeercert()

	notAfter = cert['notAfter']
	timestamp = ssl.cert_time_to_seconds(notAfter)
	exp = datetime.utcfromtimestamp(timestamp)

	t = time.time()
	today = time.strftime("%Y%m%d", time.gmtime(t))
	date_now = datetime.strptime(today, "%Y%m%d").date()
	date_exp = datetime.strptime(str(exp), "%Y-%m-%d %H:%M:%S").date()

	diff = (date_exp - date_now).days
		
	if diff > 30:
		print('pass')
	else:
		noti = hostname + " 인증서 만료 " + str(diff) + "일 남았습니다"
		myTeamsMessage = pymsteams.connectorcard("https://~")  #웹훅 주소 입력 (커넥터 구성하기)
		myTeamsMessage.text(noti)
		myTeamsMessage.send()

 

 

Cryptography  방식 

https://stackoverflow.com/a/71153638

728x90