Skip to main content

A robust, user-friendly Python CLI tool for inspecting SSL/TLS certificates of remote servers.

Project description

Python Version License Tests Coverage PyPI version Downloads

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-color option for plain text
  • Debug Mode: Comprehensive troubleshooting with --debug flag
  • 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 objects
  • summary: aggregate counts (total, valid, warning, critical, expired, errors)

Exit codes in policy mode:

  • 0 valid
  • 1 warning
  • 2 critical/expired
  • 10+ 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

Architecture details: see ARCHITECTURE.md.

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

  1. Fork and clone the repository
  2. Set up development environment: uv sync
  3. Run tests to ensure everything works: make test
  4. Make your changes with appropriate tests
  5. Run quality checks: make check-all
  6. 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

ssl_checkup-1.2.1.tar.gz (46.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ssl_checkup-1.2.1-py3-none-any.whl (33.7 kB view details)

Uploaded Python 3

File details

Details for the file ssl_checkup-1.2.1.tar.gz.

File metadata

  • Download URL: ssl_checkup-1.2.1.tar.gz
  • Upload date:
  • Size: 46.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ssl_checkup-1.2.1.tar.gz
Algorithm Hash digest
SHA256 861968fb79c87b8c9ad167e68f5cd06359c5c421bc8e29452a2fb7e225215413
MD5 6b0aae4f0cd86d880a3b392c94d66677
BLAKE2b-256 9e18f3bb14ac2ede7257b55215ab56acb30a3db5141a7257acc48e00e5f415fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for ssl_checkup-1.2.1.tar.gz:

Publisher: publish-uv.yml on BaDxKaRMa/ssl-checkup

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ssl_checkup-1.2.1-py3-none-any.whl.

File metadata

  • Download URL: ssl_checkup-1.2.1-py3-none-any.whl
  • Upload date:
  • Size: 33.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ssl_checkup-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 575de553a9a62569ac19a58092e68946f4800cbdce8f434280fba9f0d54fcd9e
MD5 0bd929bce98c3e25d750926678135820
BLAKE2b-256 5a75ce626d0c7f0b6d08081b234e6e22b75fc8a508e932cd4885b61d51ac09f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ssl_checkup-1.2.1-py3-none-any.whl:

Publisher: publish-uv.yml on BaDxKaRMa/ssl-checkup

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page