added check letsencrypt certificate
This commit is contained in:
parent
e929676f9e
commit
50fe70b8e8
84
cert_email.py
Normal file
84
cert_email.py
Normal file
@ -0,0 +1,84 @@
|
||||
import ssl
|
||||
import socket
|
||||
import datetime
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
def check_certificate_expiry(url, days_threshold=20):
|
||||
"""Checks if a website's SSL certificate expires within the given threshold."""
|
||||
try:
|
||||
hostname = url.split('//')[-1].split('/')[0] # Extract hostname
|
||||
port = 443 # Default HTTPS port
|
||||
|
||||
context = ssl.create_default_context()
|
||||
with socket.create_connection((hostname, port)) as sock:
|
||||
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
|
||||
cert = ssock.getpeercert()
|
||||
|
||||
expiry_date_str = cert['notAfter']
|
||||
expiry_date = datetime.datetime.strptime(expiry_date_str, '%b %d %H:%M:%S %Y %Z')
|
||||
now = datetime.datetime.utcnow()
|
||||
time_remaining = expiry_date - now
|
||||
|
||||
if time_remaining.days <= days_threshold:
|
||||
return url, expiry_date
|
||||
else:
|
||||
return None, None
|
||||
except (socket.gaierror, ConnectionRefusedError, ssl.SSLError, ValueError, IndexError) as e: # Handle potential errors
|
||||
print(f"Error checking {url}: {e}")
|
||||
return None, None
|
||||
|
||||
|
||||
def send_email(expired_certs, recipient_email="user@example.com", sender_email="your_email@example.com", sender_password="your_password"):
|
||||
"""Sends an email with the list of expiring certificates."""
|
||||
|
||||
if not expired_certs: # Check if expired_certs is empty
|
||||
print("No certificates expiring soon.")
|
||||
return
|
||||
|
||||
message = MIMEMultipart()
|
||||
message['From'] = sender_email
|
||||
message['To'] = recipient_email
|
||||
message['Subject'] = "Expiring SSL Certificates"
|
||||
|
||||
email_body = "The following certificates are expiring soon:\n\n"
|
||||
for url, expiry_date in expired_certs:
|
||||
email_body += f"URL: {url}\nExpiry Date: {expiry_date}\n\n"
|
||||
|
||||
message.attach(MIMEText(email_body, 'plain'))
|
||||
|
||||
try:
|
||||
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server: # Example using Gmail, adjust as needed
|
||||
server.login(sender_email, sender_password)
|
||||
server.sendmail(sender_email, recipient_email, message.as_string())
|
||||
print("Email sent successfully.")
|
||||
except Exception as e:
|
||||
print(f"Error sending email: {e}")
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
"""Reads URLs from a file, checks certificates, and sends an email."""
|
||||
|
||||
try:
|
||||
with open("urls.txt", "r") as f: # Replace "urls.txt" with your file name
|
||||
urls = [line.strip() for line in f]
|
||||
except FileNotFoundError:
|
||||
print("urls.txt file not found. Please create this file with your urls")
|
||||
return
|
||||
|
||||
expiring_certificates = []
|
||||
for url in urls:
|
||||
url_with_protocol = url if url.startswith("http://") or url.startswith("https://") else "https://" + url
|
||||
url_with_protocol = url_with_protocol.split("#")[0] #remove anchor links if present
|
||||
|
||||
checked_url, expiry_date = check_certificate_expiry(url_with_protocol)
|
||||
if checked_url:
|
||||
expiring_certificates.append((checked_url, expiry_date))
|
||||
|
||||
send_email(expiring_certificates)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user