SSLVerifierV2
Use this automation to check for validity of your SSL certificate and get the time until expiration.
- Type
- python
- Pack
- SSLCertificates
Source
import socket
import ssl
from datetime import datetime
from typing import Any
import demistomock as demisto
from CommonServerPython import *
from cryptography import x509
from cryptography.hazmat.backends import default_backend
def results_return(command: str, item: list):
results = CommandResults(outputs_prefix=f"SSLVerifierV2.{command}", outputs_key_field="", outputs=item)
return_results(results)
def get_cert_info(hostname: str, port: str):
varExcept = ""
data = {}
cert: Any
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_OPTIONAL
s = ctx.wrap_socket(socket.socket(), server_hostname=hostname)
try:
s.connect((hostname, int(port)))
except Exception as e:
varExcept = str(e)
finally:
# Expired/Self-Signed/Unable-to-get-local-issuer errors
if (
str.__contains__(varExcept, "certificate has expired")
or str.__contains__(varExcept, "self signed certificate")
or str.__contains__(varExcept, "unable to get local issuer certificate")
):
pem_cert = ssl.get_server_certificate((hostname, int(port)))
cert_bytes = str.encode(pem_cert)
cert = x509.load_pem_x509_certificate(cert_bytes, default_backend())
expiration_obj = datetime.strptime(str(cert.not_valid_after), "%Y-%m-%d %H:%M:%S")
expiration_date = datetime.strftime(expiration_obj, "%Y/%m/%d - %H:%M:%S")
now_obj = datetime.now()
dateresults_obj = expiration_obj - now_obj
days = int(dateresults_obj.days)
data["Domain"] = hostname
data["ExpirationDate"] = expiration_date
data["TimeToExpiration"] = str(days)
elif varExcept == "":
cert = s.getpeercert()
expiration_obj = datetime.strptime(str(cert["notAfter"]), "%b %d %H:%M:%S %Y %Z")
converteddate = datetime.strftime(expiration_obj, "%Y/%m/%d - %H:%M:%S")
now_obj = datetime.now()
dateresults_obj = expiration_obj - now_obj
days = int(dateresults_obj.days)
data["Domain"] = hostname
data["ExpirationDate"] = converteddate
data["TimeToExpiration"] = str(days)
# Unhandled Exception
else:
return_error("Unhandled exception for hostname: " + hostname + ".\n\nRaw Error Message: " + varExcept)
return data
def main():
hostname = demisto.args().get("URL")
port = demisto.args().get("Port")
try:
results_return("Certificate", get_cert_info(hostname, port))
except Exception as e:
return_error(f"Error: {e}")
if __name__ in ("__main__", "__builtin__", "builtins"):
main()
README
Use this automation to check for validity of your SSL certificate and get the time until expiration.
Script Data
| Name |
Description |
| Script Type |
python3 |
| Tags |
Utilities |
Inputs
| Argument Name |
Description |
| URL |
URL to check |
| Port |
Port to check |
Outputs
| Path |
Description |
Type |
| SSLVerifierV2.Certificate.ExpirationDate |
Date Certificate Expires |
string |
| SSLVerifierV2.Certificate.Site |
Site that was checked |
string |
| SSLVerifierV2.Certificate.TimeToExpiration |
Days to expiration |
string |