Skip to content

jeffcaldwellca/mkcertWeb

Repository files navigation

mkcert Web UI

A secure, modern web interface for managing SSL certificates using the mkcert CLI tool. Generate, download, and manage local development certificates with enterprise-grade security and an intuitive web interface.

✨ Key Features

  • πŸ” SSL Certificate Generation: Create certificates for multiple domains and IP addresses
  • πŸ›‘οΈ Enterprise Security: Command injection protection, path traversal prevention, and comprehensive rate limiting
  • πŸ“‹ Multiple Formats: Generate PEM, CRT, and PFX (PKCS#12) certificates
  • πŸ”’ Flexible Authentication: Basic auth and enterprise SSO with OpenID Connect
  • πŸ“§ Email Notifications: Automated SMTP alerts for expiring certificates
  • πŸ“Š Certificate Monitoring: Automatic monitoring with configurable warning periods
  • πŸ—οΈ Modular Architecture: Clean, maintainable codebase with utility-based design
  • 🌐 HTTPS Support: Auto-generated SSL certificates for secure access
  • πŸ“Š Certificate Management: View, download, archive, and restore certificates
  • 🎨 Modern UI: Dark/light themes with responsive design
  • 🐳 Docker Ready: Complete containerization with docker-compose
  • πŸ“ˆ Monitoring Ready: Standardized logging and structured API responses

πŸ“· Screenshots

mkcert Web UI Interface

Modern web interface showing certificate generation and management features

πŸš€ Quick Start

Using Docker (Recommended)

# Clone and start
git clone https://github.com/jeffcaldwellca/mkcertWeb.git
cd mkcertWeb
docker-compose up -d

# Access at http://localhost:3000

Local Installation

# Prerequisites: Node.js 16+, mkcert, OpenSSL
npm install
mkcert -install    # First time only
npm start

For detailed setup instructions, see DOCKER.md

βš™οΈ Configuration

Essential Environment Variables

# Server Configuration
PORT=3000                    # HTTP server port
ENABLE_HTTPS=true            # Enable HTTPS server
HTTPS_PORT=3443              # HTTPS server port

# Authentication 
ENABLE_AUTH=true             # Enable user authentication
AUTH_USERNAME=admin          # Username for basic authentication
AUTH_PASSWORD=admin123       # Password for basic authentication

# OpenID Connect SSO (Optional)
ENABLE_OIDC=false            # Enable OIDC SSO authentication
OIDC_ISSUER=                 # OIDC provider URL
OIDC_CLIENT_ID=              # OIDC client ID
OIDC_CLIENT_SECRET=          # OIDC client secret

# Email Notifications
EMAIL_NOTIFICATIONS_ENABLED=true
SMTP_HOST=smtp.gmail.com                # Your SMTP server
SMTP_PORT=587                           # SMTP port (587 for TLS, 465 for SSL)
SMTP_SECURE=false                       # Use SSL (true for port 465)
SMTP_USER=your-email@domain.com         # SMTP username
SMTP_PASSWORD=your-app-password         # SMTP password
EMAIL_FROM=mkcert@yourcompany.com       # From address for notifications
EMAIL_TO=admin@company.com,ops@company.com  # Comma-separated recipients

# Certificate Monitoring
CERT_MONITORING_ENABLED=true
CERT_CHECK_INTERVAL=0 8 * * *           # Cron schedule (daily at 8 AM)
CERT_WARNING_DAYS=30                    # Days before expiry to send warnings
CERT_CRITICAL_DAYS=7                    # Days before expiry for critical alerts

Supported Email Providers

Gmail:

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
# Note: Use App Passwords instead of your regular password

Outlook/Office 365:

SMTP_HOST=smtp-mail.outlook.com
SMTP_PORT=587
SMTP_SECURE=false

Corporate Exchange:

SMTP_HOST=mail.yourcompany.com
SMTP_PORT=587
SMTP_SECURE=false

For complete configuration options including rate limiting and advanced settings, see the .env.example file.

πŸ“š Usage

Getting Started

  1. Access: Navigate to http://localhost:3000
  2. Login: Use configured credentials (default: admin/admin)
  3. Generate: Enter domains (one per line) and select format
  4. Download: Get certificates in PEM, CRT, or PFX format
  5. Manage: View, archive, or restore certificates

API Usage

# Generate certificate
curl -X POST http://localhost:3000/api/execute \
  -H "Content-Type: application/json" \
  -d '{"command":"generate","input":"localhost example.com"}'

# List certificates
curl http://localhost:3000/api/certificates

# Download certificate file
wget http://localhost:3000/download/localhost.pem -O localhost.pem

# Email and monitoring API endpoints
curl http://localhost:3000/api/email/status
curl http://localhost:3000/api/monitoring/status
curl http://localhost:3000/api/monitoring/expiring

πŸ”’ Security Features

Enterprise-Grade Security

  • πŸ›‘οΈ Command Injection Protection: Strict allowlist-based command validation prevents malicious shell injection
  • πŸ” Path Traversal Prevention: Comprehensive file access validation prevents directory traversal attacks
  • πŸ“ Input Sanitization: All user inputs validated and sanitized before processing
  • 🚫 Filename Validation: Prevents malicious filename patterns and null byte attacks

Multi-Tier Rate Limiting

  • CLI Operations: 10 per 15 minutes (prevents command abuse)
  • API Requests: 100 per 15 minutes (prevents API flooding)
  • Authentication: 5 attempts per 15 minutes (prevents brute force)
  • General Access: 200 requests per 15 minutes (overall protection)

Additional Security

  • πŸ”‘ Enterprise SSO: OpenID Connect integration with role-based access
  • 🌐 HTTPS Support: Auto-generated trusted certificates with secure headers
  • πŸ“Š Audit Logging: Comprehensive logging of security events and blocked attempts
  • πŸ”„ Auto-Recovery: Graceful error handling prevents service disruption

πŸ”— API Reference

Key Endpoints

Method Endpoint Description
GET /api/status System status and mkcert installation
POST /api/generate Generate new certificates
GET /api/certificates List all certificates
GET /download/:filename Download certificate files
GET /api/email/status Email configuration status
POST /api/email/test Send test email
GET /api/monitoring/status Certificate monitoring status
GET /api/monitoring/expiring List expiring certificates

Example Certificate Generation

curl -X POST http://localhost:3000/api/generate 
  -H "Content-Type: application/json" 
  -d '{"domains":["localhost","127.0.0.1"],"format":"pem"}'

πŸ“ Project Structure

mkcertWeb/
β”œβ”€β”€ server.js                 # Main application entry point
β”œβ”€β”€ package.json             # Dependencies and scripts  
β”œβ”€β”€ src/                     # Modular application source
β”‚   β”œβ”€β”€ config/             # Configuration management
β”‚   β”œβ”€β”€ security/           # Security utilities
β”‚   β”œβ”€β”€ middleware/         # Express middleware
β”‚   β”œβ”€β”€ routes/             # Route handlers
β”‚   β”œβ”€β”€ services/           # Email and monitoring services
β”‚   └── utils/              # Utility functions
β”œβ”€β”€ public/                  # Frontend static assets
β”œβ”€β”€ certificates/            # Certificate storage
β”œβ”€β”€ .env.example            # Environment configuration template
└── DOCKER.md               # Docker deployment guide

### πŸ”§ Certificate Management

- **πŸ“‹ View Details**: Domain coverage, expiry dates, file sizes
- **⬇️ Download**: Individual files, ZIP bundles, or PFX format  
- **πŸ”‘ PFX Generation**: Create password-protected PKCS#12 files on-demand
- **πŸ—‘οΈ Delete**: Remove certificates (root certificates are protected)
- **πŸ“Š System Status**: View Root CA information and installation status

### 🌐 Advanced Usage

For production deployments, reverse proxy configurations, and advanced Docker setups, see [DOCKER.md](DOCKER.md).

## πŸ”— API Reference

The application provides REST API endpoints for programmatic access. When authentication is enabled, establish a session first via `POST /login`.

### Key Endpoints

| Method | Endpoint | Description |
|--------|----------|-------------|
| `GET` | `/api/status` | System status and mkcert installation |
| `POST` | `/api/generate` | Generate new certificates |
| `GET` | `/api/certificates` | List all certificates |
| `GET` | `/api/download/bundle/:folder/:certname` | Download certificate bundle |
| `POST` | `/api/generate/pfx/*` | Generate PFX file on-demand |

Example certificate generation:
```bash
# Generate certificate via API
curl -X POST http://localhost:3000/api/generate \
  -H "Content-Type: application/json" \
  -d '{"domains":["localhost","127.0.0.1"],"format":"pem"}'

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/new-feature
  3. Commit changes: git commit -am 'Add new feature'
  4. Push to branch: git push origin feature/new-feature
  5. Submit a pull request

πŸ“„ License

This project is licensed under the GPLv3 License - see the LICENSE file for details.

πŸ™ Acknowledgments

  • mkcert - Simple tool for making locally-trusted development certificates
  • Express.js - Web application framework
  • Node.js - JavaScript runtime

πŸ“ž Support

  1. Push to branch: git push origin feature/new-feature
  2. Submit a pull request

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ™ Acknowledgments

  • mkcert - Simple tool for making locally-trusted development certificates
  • Express.js - Web application framework
  • Node.js - JavaScript runtime

Local Development

# Clone and setup
git clone https://github.com/jeffcaldwellca/mkcertWeb.git
cd mkcertWeb
npm install

# Development modes
npm start                    # HTTP only (http://localhost:3000)
npm run https               # HTTP + HTTPS (http://localhost:3000 & https://localhost:3443)
npm run https-only          # HTTPS only with HTTP redirect (https://localhost:3443)
npm run dev                 # HTTP with auto-restart (nodemon)
npm run https-dev          # HTTPS with auto-restart (nodemon)

Authentication Setup

  1. Copy the example configuration:

    cp .env.example .env
  2. Enable authentication in .env:

    ENABLE_AUTH=true
    AUTH_USERNAME=your-username
    AUTH_PASSWORD=your-secure-password
    SESSION_SECRET=your-very-long-random-secret-key
  3. Start the server and access at http://localhost:3000

Security Notes:

  • When ENABLE_AUTH=false, authentication is completely disabled
  • When ENABLE_AUTH=true, all API routes are protected and require valid session authentication
  • Always use a strong, unique SESSION_SECRET in production environments
  • Consider using HTTPS when authentication is enabled for additional security

Testing

See TESTING.md for comprehensive testing procedures including installation verification, certificate generation testing, authentication testing, API endpoint validation, and security testing.

πŸ› Troubleshooting

Common Issues

Issue Solution
mkcert not found which mkcert && mkcert -version
Permission Denied sudo chown -R $(whoami):$(whoami) certificates/
Port Already in Use PORT=3001 npm start
CA Installation Issues mkcert -install && ls -la $(mkcert -CAROOT)
Browser Trust Issues Clear cache, restart browser after CA installation