
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
KeyMon is a modular, plugin-based command-line tool that extracts SSL certificate information from various sources and uploads them to your SSL Guardian dashboard for monitoring and management.
KeyMon uses a modular plugin system that makes it easy to collect certificates from any source. Each plugin handles a specific certificate source with its own parameters and logic.
npm install -g keymon
keymon --list-plugins
git clone https://github.com/ssl-guardian/keymon.git
cd keymon
chmod +x collectorjs
./collectorjs --list-plugins
Get Your Organization ID (org_id) and Token:
Set Environment Variables (recommended):
export SSL_GUARDIAN_TOKEN="your_token_here"
export SSL_GUARDIAN_ORG_ID="your_org_id_here"
export SSL_GUARDIAN_API_URL="https://app.sslguardian.io" # Optional
Domain Scanning:
keymon --plugin domain --domains example.com --token YOUR_TOKEN --org-id YOUR_ORG_ID
# or from source: ./collectorjs --plugin domain --domains example.com --token YOUR_TOKEN --org-id YOUR_ORG_ID
keymon --plugin domain --domains "example.com,api.example.com,www.example.com"
Java Keystore:
keymon --plugin keystore --keystores /path/to/keystore.jks --token YOUR_TOKEN --org-id YOUR_ORG_ID
keymon --plugin keystore --keystores /path/to/keystore.jks --password mypassword
Certificate Folder:
keymon --plugin cert-folder --folders /etc/ssl/certs/ --token YOUR_TOKEN --org-id YOUR_ORG_ID
PKI CA Bundle:
keymon --plugin pki-bundle --bundles /etc/ssl/internal-ca.pem \
--environment production --group "Internal Services" --token YOUR_TOKEN --org-id YOUR_ORG_ID
Kubernetes Secrets:
keymon --plugin k8s-secrets --namespace prod --token YOUR_TOKEN --org-id YOUR_ORG_ID
keymon --plugin k8s-secrets --kubeconfig /path/to/config --namespace default
Nginx Configuration:
keymon --plugin nginx --config-path /etc/nginx/sites-enabled/ --token YOUR_TOKEN --org-id YOUR_ORG_ID
AWS Certificate Manager:
keymon --plugin aws-acm --region us-east-1 \
--access-key-id YOUR_ACCESS_KEY --secret-access-key YOUR_SECRET_KEY \
--token YOUR_TOKEN --org-id YOUR_ORG_ID
Azure Key Vault:
keymon --plugin azure-keyvault --vault-name myvault \
--client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --tenant-id YOUR_TENANT_ID \
--token YOUR_TOKEN --org-id YOUR_ORG_ID
macOS Keychain:
keymon --plugin macos-keychain --token YOUR_TOKEN --org-id YOUR_ORG_ID
keymon --plugin macos-keychain --keychain login.keychain
Single Domain:
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID --domain example.com
Multiple Sources:
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID \
--domain example.com \
--keystore /path/to/keystore.jks \
--cert-folder /etc/ssl/certs/ \
--ca-bundle /etc/ssl/ca-bundle.pem \
--environment staging \
--group "Web Services"
List All Certificates:
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID --list
Filter by Source:
# List only keystore certificates
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID --list --source keystore
# List only domain certificates
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID --list --source domain
# List only Kubernetes certificates
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID --list --source k8s-secrets
Delete Certificate:
keymon --token YOUR_TOKEN --org-id YOUR_ORG_ID --delete 123
List Available Plugins:
keymon --list-plugins
# Set once
export SSL_GUARDIAN_TOKEN="your_token_here"
export SSL_GUARDIAN_ORG_ID="your_org_id_here"
# Then use without --token and --org-id
keymon --plugin domain --domains example.com
keymon --plugin keystore --keystores /path/to/keystore.jks
keymon --plugin k8s-secrets --namespace prod
# Legacy syntax also works
keymon --domain example.com
keymon --keystore /path/to/keystore.jks
| Plugin | Description | Parameters |
|---|---|---|
domain | Live HTTPS domain scanning | domains (required) |
keystore | Java keystores (.jks, .p12, .pfx) | keystores (required), password (optional) |
cert-folder | Certificate file directories | folders (required) |
pki-bundle | PKI CA bundles | bundles (required) |
k8s-secrets | Kubernetes TLS secrets | kubeconfig (optional), namespace (optional) |
nginx | Nginx configuration files | config-path (required) |
aws-acm | AWS Certificate Manager | access-key-id, secret-access-key (required), region (optional) |
azure-keyvault | Azure Key Vault | vault-name, client-id, client-secret, tenant-id (all required) |
macos-keychain | macOS Keychain | keychain (optional) |
postgres-tls | PostgreSQL TLS certificates | data-dir, cert-file, key-file (all optional) |
windows-certstore | Windows Certificate Store | store (optional), location (optional) |
| Option | Description | Required | Example |
|---|---|---|---|
--plugin PLUGIN | Use specific plugin | Yes* | --plugin domain |
--token TOKEN | SSL Guardian authentication token | Yes** | --token abc123... |
--org-id ORG_ID | Organization ID | Yes** | --org-id uuid-here |
--proxy URL | Proxy URL for HTTP/HTTPS requests | No | --proxy http://proxy:8080 |
--environment ENV | Environment tag for certificates | No | --environment production |
--group GROUP | Group tag for certificates | No | --group "Web Services" |
--list | List all certificates with status | No* | --list |
--delete ID | Delete certificate by ID | No* | --delete 123 |
--list-plugins | List available plugins | No* | --list-plugins |
*One of plugin, list, delete, or list-plugins is required
**Required unless set via environment variables
| Variable | Description | Default |
|---|---|---|
SSL_GUARDIAN_TOKEN | Authentication token | None |
SSL_GUARDIAN_ORG_ID | Organization ID | None |
SSL_GUARDIAN_API_URL | API endpoint | https://app.sslguardian.io |
HTTPS_PROXY | Proxy URL for HTTPS requests | None |
HTTP_PROXY | Proxy URL for HTTP requests | None |
KEYSTORE_PASSWORD | Keystore password | changeit |
example.com:8443)--plugin domain --domains "example.com,api.example.com"changeit)--plugin keystore --keystores /path/to/store.jks --password mypass--plugin cert-folder --folders /etc/ssl/certs/--plugin pki-bundle --bundles /etc/ssl/ca-bundle.pem--plugin k8s-secrets --namespace prod --kubeconfig /path/to/config--plugin nginx --config-path /etc/nginx/sites-enabled/--plugin aws-acm --region us-east-1 --access-key-id xxx --secret-access-key xxx--plugin azure-keyvault --vault-name myvault --client-id xxx --client-secret xxx --tenant-id xxx--plugin macos-keychain --keychain System.keychain--plugin postgres-tls --data-dir /var/lib/postgresql/data--plugin windows-certstore --store My --location CurrentUserFetching certificate info for: example.com
✓ Successfully fetched certificate for example.com
Extracting certificate info from keystore: /path/to/keystore.jks
✓ Successfully extracted 3 certificates from /path/to/keystore.jks
Scanning certificate folder: /etc/ssl/certs/
✓ Parsed certificate: internal.example.com
✓ Successfully scanned 1 certificates from /etc/ssl/certs/
Parsing PKI CA bundle: /etc/ssl/ca-bundle.pem
✓ Parsed PKI certificate: Internal Root CA
✓ Parsed PKI certificate: Internal Intermediate CA
✓ Successfully parsed 2 certificates from PKI bundle /etc/ssl/ca-bundle.pem
Submitting 6 certificates to SSL Guardian...
Submission results:
✓ Created: 4
✓ Updated: 2
✗ Errors: 0
Found 8 certificates:
ID Domain Status Days Source Issuer
──────────────────────────────────────────────────────────────────────────────────
123 example.com 🟢 valid 45 domain Let's Encrypt
124 api.example.com 🟡 warning 25 domain Let's Encrypt
125 internal.corp.com 🟢 valid 180 keystore Internal CA
126 Root CA 🟢 valid 3650 pki Self-signed
127 old.example.com 🔴 expired -5 file DigiCert
Found 2 certificates (filtered by source: keystore):
ID Domain Status Days Source Issuer
──────────────────────────────────────────────────────────────────────────────────
125 internal.corp.com 🟢 valid 180 keystore Internal CA
128 app.internal.com 🟡 warning 15 keystore Internal CA
All certificates are automatically tagged with:
--environment--group{
"source": "pki",
"environment": "production",
"group": "Internal Services",
"bundle_path": "/etc/ssl/ca-bundle.pem",
"bundle_index": 0
}
Every 6 hours with domain plugin:
keymon --plugin domain --domains example.com --cron "0 */6 * * *" --install-cron
Daily at midnight with Kubernetes:
keymon --plugin k8s-secrets --namespace prod \
--environment production --cron "0 0 * * *" --cron-name "daily-k8s-check" --install-cron
Weekly AWS ACM check:
keymon --plugin aws-acm --region us-east-1 --cron "0 0 * * 0" \
--cron-name "weekly-acm-check" --install-cron
Legacy syntax (still works):
keymon --domain example.com --keystore /path/to/keystore.jks \
--environment production --cron "0 0 * * *" --cron-name "daily-ssl-check" --install-cron
List all SSL Guardian cron jobs:
keymon --list-cron
Remove specific cron job:
keymon --cron-name "daily-ssl-check" --remove-cron
| Schedule | Description | Example Use Case |
|---|---|---|
0 */6 * * * | Every 6 hours | High-frequency monitoring |
0 0 * * * | Daily at midnight | Standard daily checks |
0 0 * * 0 | Weekly on Sunday | Weekly PKI updates |
0 0 1 * * | Monthly on 1st | Monthly compliance checks |
0 2 * * 1-5 | Weekdays at 2 AM | Business day monitoring |
KeyMon supports HTTP/HTTPS proxies for enterprise environments without direct internet access:
# Set proxy for all requests
export HTTPS_PROXY=http://proxy.company.com:8080
export HTTP_PROXY=http://proxy.company.com:8080
# Run KeyMon normally
keymon --plugin domain --domains example.com
# Specify proxy per command
keymon --plugin azure-keyvault --vault-name myvault \
--proxy http://proxy.company.com:8080 \
--client-id xxx --client-secret xxx --tenant-id xxx
# Proxy with authentication
export HTTPS_PROXY=http://username:password@proxy.company.com:8080
# Or via command line
keymon --proxy http://username:password@proxy.company.com:8080 --plugin domain --domains example.com
Multi-Environment Collection:
# Development environment
keymon --plugin domain --domains dev.example.com \
--environment development --group "Dev Services"
# Production Kubernetes
keymon --plugin k8s-secrets --namespace prod \
--environment production --group "Production Services"
# AWS Production
keymon --plugin aws-acm --region us-east-1 \
--environment production --group "AWS Services"
Infrastructure-Specific Collection:
# Web servers (Nginx)
keymon --plugin nginx --config-path /etc/nginx/sites-enabled/ \
--environment production --group "Web Servers"
# Database servers (PostgreSQL)
keymon --plugin postgres-tls --data-dir /var/lib/postgresql/data \
--environment production --group "Database Servers"
# Container orchestration (Kubernetes)
keymon --plugin k8s-secrets --namespace default \
--environment production --group "Container Platform"
Certificate Management Workflow:
# 1. List available plugins
keymon --list-plugins
# 2. Collect certificates from specific source
keymon --plugin k8s-secrets --namespace prod
# 3. List and review
keymon --list
# 4. Filter by plugin source
keymon --list --source k8s-secrets
# 5. Remove unwanted certificates
keymon --delete 123
Legacy Batch Processing (still works):
keymon --token TOKEN --org-id ORG_ID \
--domain api.example.com \
--keystore /opt/app/keystore.jks \
--cert-folder /etc/ssl/certs/ \
--ca-bundle /etc/ssl/internal-ca.pem \
--environment production \
--group "Production Services"
KeyMon integrates with SSL Guardian's REST API. All plugins submit certificates using the same API endpoints:
curl -X POST "https://app.sslguardian.io/v1/collector/submit" \
-H "Content-Type: application/json" \
-H "token: YOUR_TOKEN" \
-H "org-id: YOUR_ORG_ID" \
-d '{
"certificates": [
{
"domain": "example.com",
"issuer": "Let'\''s Encrypt",
"expiration_date": "2024-12-31T23:59:59Z",
"tags": {
"source": "domain",
"environment": "production",
"group": "Web Services"
}
}
]
}'
curl -X GET "https://app.sslguardian.io/v1/collector/certificates" \
-H "token: YOUR_TOKEN" \
-H "org-id: YOUR_ORG_ID"
curl -X DELETE "https://app.sslguardian.io/v1/collector/certificates/CERT_ID" \
-H "token: YOUR_TOKEN" \
-H "org-id: YOUR_ORG_ID"
KeyMon's plugin system makes it easy to add support for new certificate sources:
const BasePlugin = require('../lib/base-plugin');
class MyPlugin extends BasePlugin {
constructor() {
super();
this.name = 'my-plugin';
this.description = 'My custom certificate source';
this.requiredParams = ['param1'];
}
async collect(config) {
this.validateConfig(config);
// Your collection logic here
const certificates = [];
// Use this.createCertificate() to create certificate objects
certificates.push(this.createCertificate({
domain: 'example.com',
issuer: 'My CA',
expiration_date: new Date(),
valid_from: new Date(),
environment: config.environment,
group: config.group,
tags: { custom_tag: 'value' }
}));
return certificates;
}
}
module.exports = MyPlugin;
Save as plugins/my-plugin.js and use with:
keymon --plugin my-plugin --param1 value
Plugin not found:
# List available plugins
keymon --list-plugins
# Check plugin file exists (from source)
ls plugins/
Plugin parameter errors:
# Check plugin help
keymon --help
# Verify required parameters are provided
keymon --plugin domain --domains example.com
keystore plugin:
k8s-secrets plugin:
aws-acm plugin:
azure-keyvault plugin:
nginx plugin:
cert-folder/pki-bundle plugins:
brew install openssl (macOS) or apt-get install openssl (Ubuntu)General issues:
Add verbose logging by modifying the script or contact support for assistance.
See CHANGELOG.md for detailed release notes and version history.
We welcome contributions! To add a new plugin:
plugins/BasePlugin classcollect() methodSee PLUGINS.md for detailed plugin development guide.
Copyright © 2024 SSL Guardian. All rights reserved.
FAQs
Modular SSL certificate collector for SSL Guardian with plugin architecture
The npm package keymon receives a total of 1 weekly downloads. As such, keymon popularity was classified as not popular.
We found that keymon demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.