A robust, user-friendly Python CLI tool for inspecting SSL/TLS certificates of remote servers.
Project description
ssl-checkup
A robust, modular Python CLI tool for inspecting SSL/TLS certificates of remote servers. Features comprehensive testing, clean architecture, colorized output, and detailed debugging capabilities.
Features
- Certificate Analysis: Check SSL certificate validity, issuer, subject, and SANs for any host
- Colorized Output: Beautiful, readable output with
--no-coloroption for plain text - Debug Mode: Comprehensive troubleshooting with
--debugflag - Flexible Output: Print PEM certificate, issuer, subject, or SANs only as needed
- Error Handling: Graceful handling of DNS/socket errors with helpful messages
- Modular Architecture: Clean, testable code structure with 95% test coverage
- Easy Installation: Available on PyPI - install with
pipx install ssl-checkup
Installation
For Users (Recommended)
Install with pipx for best isolation and to avoid dependency conflicts:
pipx install ssl-checkup
If you don't have pipx, install it first:
# On macOS with Homebrew
brew install pipx
# On Ubuntu/Debian
sudo apt install pipx
# Or with pip
pip install --user pipx
pipx ensurepath
Alternative: Install with pip (may cause dependency conflicts):
pip install ssl-checkup
# Optional enhanced parsing and colors
pip install "ssl-checkup[full]"
After installation, run from anywhere:
ssl-checkup example.com
For Development
Clone and set up development environment:
git clone https://github.com/BaDxKaRMa/ssl-checkup.git
cd ssl-checkup
# Using uv (recommended)
uv sync
uv run ssl-checkup example.com
# Or using pip
pip install -e ".[dev,test,full]"
python -m ssl_checkup.main example.com
Usage
ssl-checkup [OPTIONS] WEBSITE[:PORT]
Arguments:
WEBSITE- Domain or IP address to check (default port: 443)PORT- Optional custom port (e.g.,example.com:8443)
Options
| Option | Description |
|---|---|
--no-color |
Disable color output (plain text and pretty JSON) |
--json |
Output certificate data as JSON |
--json-pretty |
Pretty-print JSON output (implies JSON mode) |
--output FILE |
Write output to a file (- keeps stdout) |
-p, --print-cert |
Print the PEM certificate to stdout |
--show-chain |
Include certificate chain details in output |
--debug |
Enable debug output for troubleshooting |
-i, --issuer |
Print only the certificate issuer |
-s, --subject |
Print only the certificate subject |
-a, --san |
Print only the Subject Alternative Names (SANs) |
--warn-days N |
Warning threshold in days before expiry (default: 30) |
--critical-days N |
Critical threshold in days before expiry (default: 7) |
--timeout SEC |
Connection timeout in seconds (default: 10) |
--retries N |
Retry attempts for transient network errors (default: 0) |
--retry-delay SEC |
Delay between retry attempts (default: 0.5) |
--ip-version |
auto, 4, or 6 network family preference |
--input FILE |
Read targets from file (- reads from stdin) |
--workers N |
Worker threads for batch mode (--input) |
--summary |
Show aggregate summary counts for batch runs |
--fail-fast |
Stop batch processing on first non-success result |
--insecure, -k |
Allow insecure connections (bypass certificate validation) |
--version |
Show version and exit |
-h, --help |
Show help message |
Examples
Basic certificate check:
ssl-checkup example.com
Check custom port:
ssl-checkup example.com:8443
Print specific certificate fields:
ssl-checkup -i example.com # Issuer only
ssl-checkup -s example.com # Subject only
ssl-checkup -a example.com # SANs only
Debug and troubleshooting:
ssl-checkup --debug example.com # Detailed debug output
ssl-checkup --insecure expired.badssl.com # Skip validation
Export certificate:
ssl-checkup -p example.com > cert.pem # Save PEM certificate
ssl-checkup --no-color example.com > info.txt # Plain text output
JSON output and policy exit codes:
ssl-checkup --json example.com
ssl-checkup --json-pretty example.com
ssl-checkup --json-pretty --no-color example.com
ssl-checkup --json --show-chain example.com
ssl-checkup --retries 2 --retry-delay 1.0 example.com
ssl-checkup --warn-days 30 --critical-days 7 example.com
ssl-checkup --input targets.txt --json --summary
ssl-checkup --json example.com --output report.json
--json-pretty uses colorized syntax highlighting when writing to a TTY. Use --no-color for plain pretty JSON.
JSON schema (stable fields):
| Field | Type | Notes |
|---|---|---|
target |
string | Original target input (e.g. example.com:8443) |
hostname |
string | Parsed hostname used for TLS SNI |
port |
integer | Parsed port |
resolved_ip |
string | null | Remote IP if available |
tls_version |
string | null | Negotiated TLS version |
cipher |
array | string | null | Cipher details from Python SSL |
insecure |
boolean | Whether --insecure was enabled |
hostname_match |
boolean | Hostname verification result against cert SAN/CN |
issuer |
string | null | Issuer organization when available |
subject |
string | null | Subject common name when available |
san |
array[string] | DNS SAN entries |
not_before |
string | null | Certificate notBefore |
not_after |
string | null | Certificate notAfter |
checked_at |
string | UTC timestamp in ISO-8601 format |
warning_days |
integer | Effective warning threshold |
critical_days |
integer | Effective critical threshold |
chain_source |
string | null | Chain source: verified, unverified, or leaf-only |
chain |
array[object] | Present with --show-chain; includes index, is_leaf, subject, issuer, not_before, not_after |
status |
string | Present in policy mode: valid, warning, critical, expired |
days_left |
integer | Present in policy mode |
When --summary is used with --json, output becomes:
results: array of per-target objectssummary: aggregate counts (total,valid,warning,critical,expired,errors)
Exit codes in policy mode:
0valid1warning2critical/expired10+operational errors (DNS/socket/SSL/internal)
Batch checks:
ssl-checkup --input targets.txt --workers 8
cat targets.txt | ssl-checkup --input - --json --workers 4
Requirements
- Python: 3.11 or higher
- Optional Dependencies (install with
pip install "ssl-checkup[full]"):termcolor>=3.1.0(enhanced colorized output)cryptography>=45.0.5(advanced certificate parsing)
Note: The tool works without optional dependencies, with graceful fallbacks for missing features.
Development
Quick Start
# Clone and set up development environment
git clone https://github.com/BaDxKaRMa/ssl-checkup.git
cd ssl-checkup
uv sync
# Run tests
make test
# Run with coverage
make test-coverage
# Run all quality checks
make check-all
Contributing
- Fork and clone the repository
- Set up development environment:
uv sync - Run tests to ensure everything works:
make test - Make your changes with appropriate tests
- Run quality checks:
make check-all - Submit a pull request
Releasing (Maintainers)
This project uses automated PyPI publishing via GitHub Actions. To release a new version:
Option 1: Using Makefile (Recommended)
# Create and push a new release in one command
make release-push VERSION=1.2.0
Option 2: Manual Process
# 1. Update version in pyproject.toml
version = "1.2.0"
# 2. Commit and tag the release
git add pyproject.toml
git commit -m "Release v1.2.0"
git tag v1.2.0
# 3. Push to trigger automated PyPI upload
git push && git push --tags
What happens automatically:
- GitHub Actions builds the package with
uv - Runs quality checks with
twine check - Uploads to PyPI using stored API token
- New version is available within minutes
Requirements for automated releases:
- PyPI API token stored in GitHub Secrets as
PYPI_API_TOKEN - Version must follow semantic versioning (e.g., 1.0.0, 1.1.0, 2.0.0)
Troubleshooting
Common Issues
Missing dependencies:
# For development - sync all dependencies
uv sync
# Or install individual packages if needed
uv pip install termcolor cryptography
Connection issues:
# Use debug mode for detailed troubleshooting
ssl-checkup --debug example.com
# Test insecure connections for self-signed certificates
ssl-checkup --insecure your-internal-server.com
Installation issues:
# Ensure Python 3.11+
python --version
# Install with pipx (recommended for CLI tools)
pipx install ssl-checkup
# If pipx isn't available, install it first
pip install --user pipx
pipx ensurepath
# Alternative: Install with pip (may cause conflicts)
pip install ssl-checkup
# Or use uv for development
uv sync && uv run ssl-checkup example.com
# Force reinstall if needed
pipx reinstall ssl-checkup
License
GPL-3.0 License - see LICENSE file for details.
Project maintained by BaDxKaRMa. Contributions welcome!
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ssl_checkup-1.2.0.tar.gz.
File metadata
- Download URL: ssl_checkup-1.2.0.tar.gz
- Upload date:
- Size: 47.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f107b2c1db387966c2fae4e5e57c196c44cb30e734aae788c1f0a771bc5a6dec
|
|
| MD5 |
4646e8d1f3c2ed6227d2dc6fb96ff437
|
|
| BLAKE2b-256 |
2a2fcf891366c50cc54e9f584f09a390ddeb9ec1487ecf681c112ee34867cebe
|
Provenance
The following attestation bundles were made for ssl_checkup-1.2.0.tar.gz:
Publisher:
publish-uv.yml on BaDxKaRMa/ssl-checkup
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ssl_checkup-1.2.0.tar.gz -
Subject digest:
f107b2c1db387966c2fae4e5e57c196c44cb30e734aae788c1f0a771bc5a6dec - Sigstore transparency entry: 946885643
- Sigstore integration time:
-
Permalink:
BaDxKaRMa/ssl-checkup@a3357d7daf7877412522d85d5f6c38bf3044773e -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/BaDxKaRMa
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-uv.yml@a3357d7daf7877412522d85d5f6c38bf3044773e -
Trigger Event:
push
-
Statement type:
File details
Details for the file ssl_checkup-1.2.0-py3-none-any.whl.
File metadata
- Download URL: ssl_checkup-1.2.0-py3-none-any.whl
- Upload date:
- Size: 34.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7dbb0437f9f0ca4857b36f5dedb46f9009ac9a398eeb5fa93e8516edcf2d2a8
|
|
| MD5 |
e226256e786deff8b64b1b2ff74b15a4
|
|
| BLAKE2b-256 |
22b9cd91dc45cda266b78796bef171b094c242344c0318bfb4403dbb9bdc249a
|
Provenance
The following attestation bundles were made for ssl_checkup-1.2.0-py3-none-any.whl:
Publisher:
publish-uv.yml on BaDxKaRMa/ssl-checkup
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ssl_checkup-1.2.0-py3-none-any.whl -
Subject digest:
a7dbb0437f9f0ca4857b36f5dedb46f9009ac9a398eeb5fa93e8516edcf2d2a8 - Sigstore transparency entry: 946885652
- Sigstore integration time:
-
Permalink:
BaDxKaRMa/ssl-checkup@a3357d7daf7877412522d85d5f6c38bf3044773e -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/BaDxKaRMa
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-uv.yml@a3357d7daf7877412522d85d5f6c38bf3044773e -
Trigger Event:
push
-
Statement type: