A simple, client-side tool to verify SSL certificate installation and check expiration status. Built by Don't Panic Labs.
- ✅ Certificate Expiration - Shows days until expiry with color coding
- ✅ Certificate Authority - Identifies who issued the certificate
- ✅ Domain Coverage - Lists all domains covered by the certificate (SANs)
- ✅ Validity Status - Clear visual indication of certificate status
- ✅ Certificate Chain - Shows the chain of trust
- ✅ TLS Version Detection - Shows TLS 1.2, 1.3, etc. with security rating
- ✅ Signature Algorithm Analysis - RSA vs ECDSA with security recommendations
- ✅ Download Certificate - Download .PEM file for local installation
- ✅ Copy Fingerprint - One-click copy SHA-256 fingerprint for verification
- ✅ Automatic Fallback - Robust error handling with automatic retry mechanisms
- ✅ Collapsible Technical Details - Clean UI with expandable advanced info
- Enter a domain name (e.g.,
example.comorwww.example.com) - Click "Check Certificate"
- View certificate details including:
- Expiration date and countdown
- Certificate authority (Let's Encrypt, DigiCert, etc.)
- All covered domains
- Certificate chain
- Recommendations
- 🟢 VALID - Certificate is valid and has more than 30 days remaining
- 🟠 EXPIRING SOON - Certificate expires in less than 30 days
- 🔴 EXPIRED - Certificate has expired
For real-time certificate validation:
-
Start the PHP server:
cd /Users/jdonner/Workspace/SSLChecker php -S localhost:8000 -
Open in browser:
open http://localhost:8000/index.html
-
Test with domains like:
google.comgithub.commalloylawofficesllc.settlementstreams.com
-
Verify features:
- ✅ Real-time certificate validation
- ✅ TLS version detection (in Technical Details)
- ✅ Download certificate button
- ✅ Copy fingerprint button
-
Stop the server when done:
# Press Ctrl+C in the terminal
- Frontend: Vanilla JavaScript (ES6+)
- Backend: PHP (single file, zero configuration)
- Styling: Custom CSS matching Don't Panic Labs theme
- No Build Process: Just HTML, CSS, JavaScript, and one PHP file
ssl-checker/
├── index.html # Main page
├── css/
│ └── styles.css # Don't Panic Labs themed styles
├── js/
│ ├── app.js # Main application logic
│ ├── api.js # Certificate API integration
│ └── certificate-parser.js # Data formatting
├── assets/
│ └── (logo files)
└── README.md
The application uses a simple PHP backend (api/check-cert.php) to:
- Connect directly to the domain's SSL/TLS endpoint
- Retrieve the certificate and metadata
- Parse certificate details (expiration, issuer, SANs, etc.)
- Capture TLS version and cipher suite information
- Return formatted JSON data to the frontend
No external APIs or third-party services required!
Prerequisites:
- SSH access to the server
- PHP support (✅ dontpaniclabs.com has PHP via WordPress)
Step 1: Prepare Files Locally
cd /Users/jdonner/Workspace/SSLCheckerStep 2: Connect to Server
ssh user@dontpaniclabs.comStep 3: Create Directory on Server
# Navigate to WordPress directory
cd /var/www/dontpaniclabs.com/public_html
# Create ssl-checker directory
mkdir -p ssl-checker/api
mkdir -p ssl-checker/css
mkdir -p ssl-checker/js
mkdir -p ssl-checker/assets
# Set permissions
chmod 755 ssl-checkerStep 4: Upload Files
Exit SSH and run from your local machine:
# Upload main files
scp index.html user@dontpaniclabs.com:/var/www/dontpaniclabs.com/public_html/ssl-checker/
# Upload CSS
scp css/styles.css user@dontpaniclabs.com:/var/www/dontpaniclabs.com/public_html/ssl-checker/css/
# Upload JavaScript
scp js/*.js user@dontpaniclabs.com:/var/www/dontpaniclabs.com/public_html/ssl-checker/js/
# Upload PHP backend
scp api/check-cert.php user@dontpaniclabs.com:/var/www/dontpaniclabs.com/public_html/ssl-checker/api/
# Upload assets (logo, favicon, etc.)
scp assets/* user@dontpaniclabs.com:/var/www/dontpaniclabs.com/public_html/ssl-checker/assets/Step 5: Test the Deployment
Visit: https://dontpaniclabs.com/ssl-checker/
Test with a domain like google.com to verify:
- ✅ Certificate details load correctly
- ✅ PHP backend is working (check for TLS version in Technical Details)
- ✅ Download certificate button appears
- ✅ Copy fingerprint works
Step 6: Troubleshooting
If PHP backend doesn't work:
- Check PHP error logs on the server
- Verify PHP version:
php -v(needs PHP 7.4+) - Check file permissions:
ls -la ssl-checker/api/ - Check browser console for errors
- Verify the PHP file uploaded correctly and is accessible
- Push to GitHub repository
- Connect repository to Vercel/Netlify
- Add environment variables if needed
- Deploy (auto-deploys on every push)
- Configure custom domain:
ssl-checker.dontpaniclabs.com
Note: For Vercel/Netlify, you'll need to convert check-cert.php to a serverless function (Python or Node.js).
- Push to GitHub repository
- Enable GitHub Pages in repository settings
- Access at:
https://your-username.github.io/ssl-checker/
Note: GitHub Pages only supports static files (no PHP backend). You would need to use a separate serverless function for certificate checking.
For more accurate current certificate checks, you can add a serverless function:
import ssl
import socket
import json
from http.server import BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
class handler(BaseHTTPRequestHandler):
def do_GET(self):
query = parse_qs(urlparse(self.path).query)
domain = query.get('domain', [''])[0]
if not domain:
self.send_error(400, 'Domain parameter required')
return
try:
context = ssl.create_default_context()
with socket.create_connection((domain, 443), timeout=10) as sock:
with context.wrap_socket(sock, server_hostname=domain) as ssock:
cert = ssock.getpeercert()
result = {
'commonName': dict(x[0] for x in cert['subject'])['commonName'],
'issuer': ', '.join([f"{k}={v}" for k, v in cert['issuer'][0]]),
'notBefore': cert['notBefore'],
'notAfter': cert['notAfter'],
'domains': [san[1] for san in cert.get('subjectAltName', [])],
'serialNumber': cert.get('serialNumber'),
'source': 'direct'
}
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(json.dumps(result).encode())
except Exception as e:
self.send_error(500, str(e))Then update js/api.js to use checkViaServerless() method.
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers
Matches Don't Panic Labs branding:
- Primary Color: #6cb144 (Green)
- Secondary Color: #becd33 (Lime)
- Font: Outfit (300, 700 weights)
- Design: Modern, minimal, responsive
- Requires PHP 7.4+ for the backend to function
- Certificate validation is performed at the time of request (not cached)
- Some hosting providers may restrict outbound SSL connections
- Side-by-side domain comparison
- Certificate history timeline
- Email alerts for expiring certificates
- Bulk domain checking
- Export results to PDF
© 2024 Don't Panic Labs. All rights reserved.
For issues or questions, contact Don't Panic Labs.