local-ssl — Local HTTPS for Development
Trust your local certs. Ship with confidence.
⚠ Deprecation notice:
local-sslis now a library crate. Use the unified CLI:localtool ssl <command>. The standalone binary still works and is a thin wrapper around the library. See github.com/veduket/localtool for the unified tool.
Modern browsers require HTTPS for Service Workers, WebRTC, geolocation, and more. OAuth providers demand HTTPS redirect URIs — even for localhost. Self-signed certificates trigger scary warnings that break your flow.
local-ssl generates a private Certificate Authority on your machine, installs it in your system trust store, and issues trusted HTTPS certificates for any local development domain. One command to create a CA. One command to generate certs. Your browser stops complaining and your OAuth flows work.
This tool is built for local development only. Never use these certificates in production.
Pair it with local-dns for the complete local dev experience — name resolution + TLS trust.
Features
- Local CA generation — creates a private root CA and installs it in your system trust store (Linux, macOS, Windows)
- Wildcard certs — every generated cert includes
*.domainas a Subject Alternative Name - Multi-domain SANs —
local-ssl generate api.test www.test app.testfor one cert covering all three - System trust integration — auto-installs CA via
security(macOS),update-ca-certificates(Debian),update-ca-trust(Fedora),certutil(Windows) - Pure Rust — no OpenSSL dependency, no Node.js, no Python
- Compatible with local-dns — use together:
local-dns add myapp.test 127.0.0.1 && local-ssl generate myapp.test
Quick Start
# Install
# Generate and trust a local CA (one-time)
# Generate a cert for your development domain
# Use in your app (example with curl)
Why This Exists
Every developer hits the HTTPS wall eventually:
| Problem | Solution |
|---|---|
| Browsers block features over HTTP | Trusted local CA silences security warnings |
| OAuth providers require HTTPS redirect URIs | Valid certs for myapp.test make OAuth flows work locally |
| Service Workers require HTTPS | Register workers during development without workarounds |
| Self-signed certs cause confusing errors | System-trusted CA means zero browser friction |
/etc/hosts entries need HTTPS too |
Pair with local-dns for DNS + TLS in one workflow |
Usage
Initialize CA
This generates a 10-year CA key and certificate at /etc/local-ssl/ and installs trust system-wide.
Generate Certificates
# Single domain (auto-includes *.domain as SAN)
# Multiple SANs
# List generated certs
# Show certificate details
# Check certificate validity or remote TLS
Manage Trust
# Reinstall CA into system trust store
# Check CA and system trust status
# Manage telemetry
Integration with local-dns
# Install both tools
# Point domain to localhost and get a trusted cert
# Start your HTTPS server with the generated cert/key
# Cert: /etc/local-ssl/certs/myapp.test/cert.pem
# Key: /etc/local-ssl/certs/myapp.test/key.pem
How It Works
local-ssl init
├── Generates 4096-bit RSA key pair for CA
├── Creates self-signed CA certificate (10-year validity)
├── Installs CA in system trust store
└── Ready to sign development certificates
local-ssl generate myapp.test
├── Generates server key pair
├── Creates cert signed by local CA
│ ├── CN = myapp.test
│ ├── SANs = myapp.test, *.myapp.test
│ └── 1-year validity
├── Writes cert.pem + key.pem
└── Ready to use with any HTTPS server
Certificate Locations
| Component | Path |
|---|---|
| CA key | /etc/local-ssl/ca-key.pem |
| CA cert | /etc/local-ssl/ca-cert.pem |
| Generated certs | /etc/local-ssl/certs/<domain>/cert.pem |
| Generated keys | /etc/local-ssl/certs/<domain>/key.pem |
Supported Platforms
| Platform | CA Trust Mechanism |
|---|---|
| Debian/Ubuntu | update-ca-certificates via /usr/local/share/ca-certificates/ |
| Fedora/RHEL | update-ca-trust via /etc/pki/ca-trust/source/anchors/ |
| Arch/openSUSE | trust extract-compat via /usr/share/pki/trust/anchors/ |
| macOS | security add-trusted-cert to System keychain |
| Windows | certutil -addstore Root |
Building from Source
Requires Rust 1.75+.
Documentation
| Guide | Audience | Contents |
|---|---|---|
| README | Everyone | Quick start, feature overview |
| Admin Guide | Sysadmins | Deployment, integration, troubleshooting |
| Developer Guide | Contributors | Architecture, building, extending |
| Contributing | Contributors | PR workflow, code style, testing |
Versioning
This project follows Semantic Versioning 2.0.0. Given a MAJOR.MINOR.PATCH version:
- MAJOR — breaking changes to CLI commands, certificate storage format, or CA generation
- MINOR — new features, commands, or platform integrations (backward-compatible)
- PATCH — bug fixes, performance improvements, or documentation updates
Contributing
Contributions are welcome! See CONTRIBUTING.md for our guidelines.
Before submitting a PR, please:
- Ensure all tests pass:
cargo test - Verify the code compiles with no warnings:
cargo build - Run
cargo clippyfor linting - Update documentation if adding or changing commands
License
MIT — see LICENSE.
Made in Ethiopia with love by Yared Getachew and OpenCode (Big Pickle).