{% extends "base.html" %} {% import "tool_parts.html" as p %} {% block title %}{% if result %}SSL certificate for {{ result.host }}: {{ result.verdict }}{% else %}Free SSL certificate check{% endif %}{% endblock %} {% block desc %}{{ tool.desc }}{% endblock %} {% block content %} {{ p.head(tool) }} {{ p.form(tool, input_value, 'example.com') }} {{ p.error(error, url) }} {% if result %} {% set d = result.days_left %} {% call p.verdict((d ~ 'd') if (d is not none and result.verified) else result.verdict, result.verdict_class, result.verdict ~ (' · ' ~ d ~ ' days left' if d is not none else ''), ('Expires ' ~ result.not_after|dt) if result.not_after else 'No expiry date found', 'https://' ~ result.host ~ (':' ~ result.port if result.port != 443 else ''), checked_at) %}
{{ 'trusted' if result.verified else 'not trusted' }} {% if result.tls_version %}{{ result.tls_version }}{% endif %}
{% endcall %}

Checks

{{ p.passfail(result.rows) }} {% if result.problems %}

Problems

{{ p.findings(result.problems) }}{% endif %}

Certificate

Subject
{{ result.subject.commonName or '—' }}{% if result.subject.organizationName %} · {{ result.subject.organizationName }}{% endif %}
Issuer
{{ result.issuer.organizationName or result.issuer.commonName or '—' }}{% if result.issuer.commonName and result.issuer.organizationName %} ({{ result.issuer.commonName }}){% endif %}
Valid from
{{ result.not_before|dt }}
Valid until
{{ result.not_after|dt }}{% if d is not none %} ({{ d }} days){% endif %}
Serial
{{ result.serial or '—' }}
Protocol
{{ result.tls_version or '—' }}{% if result.cipher %} · {{ result.cipher }}{% endif %}
SANs ({{ result.sans|length }})
{% for n in result.sans[:40] %}{{ n }}{% else %}—{% endfor %}{% if result.sans|length > 40 %}+{{ result.sans|length - 40 }} more{% endif %}
{{ p.share(share_url) }} {{ p.others(tools, tool, url) }} {% else %}

What we check

Expiry date and days left, issuer, subject, every SAN, the negotiated TLS version and cipher, plus whether the chain is trusted, the hostname matches and the certificate is not self-signed or expired.

Why it matters

An expired or mismatched certificate shows a full-page browser warning and breaks API clients. Let's Encrypt certificates last 90 days, so a broken renewal cron goes unnoticed until it's too late.

Try it on

puzaricloud.in · expired.badssl.com · self-signed.badssl.com

{% endif %} {{ p.cta(tool, url) }} {% endblock %}