CiscoCertificates is a Windows toolset that automates the entire lifecycle of TLS certificates for Cisco Unified Communications (UC) and Expressway systems. It includes two components:
The automation engine handles the complete certificate lifecycle:
You configure it once (using the Config Editor or by editing appsettings.json), schedule it with Windows Task Scheduler, and it handles everything from that point on.
TLS certificate lifetimes are shrinking industry-wide. The CA/Browser Forum has voted to reduce maximum certificate lifetimes to 47 days by 2029. Let's Encrypt already issues 90-day certificates. Managing these manually across multiple Cisco UC clusters — where each product (CUCM, IM&P, CUC, CER) requires its own certificate with a device-generated CSR — becomes an unsustainable operational burden. This tool eliminates that burden entirely.
Cisco UC devices do not allow importing externally-generated private keys through their API. Instead, the device generates its own private key and Certificate Signing Request (CSR). The automation follows this device-CSR pattern:
"CsrDistribution": "multi-server", the CSR includes all cluster node hostnames in the SAN.Expressway uses a different approach — it accepts both the certificate and private key uploaded via SSH/SFTP:
| Requirement | Details |
|---|---|
| Operating System | Windows Server 2016+ or Windows 10/11 (x64) |
| .NET Runtime | .NET 8.0 Desktop Runtime (Windows x64). Download from https://dotnet.microsoft.com/download/dotnet/8.0. Not required if published as self-contained. |
| Network Access | Outbound HTTPS to Let's Encrypt (acme-v02.api.letsencrypt.org) and your DNS provider API |
| Cisco UC API | HTTPS access to each UC node on port 443 (Cisco Platform API v14+) |
| SSH Access | SSH on port 22 to UC nodes (for service restarts) and Expressway nodes (for cert deployment) |
/platformcom/api/v1/certmgr/)utils service restart)Let's Encrypt uses DNS-01 challenge to verify domain ownership. You need one of the following:
Zone.DNS.Edit permissionC:\CiscoCertAutomationThe folder should contain
CiscoCertificates.Automation.exe, CiscoCertificates.ConfigEditor.exe, appsettings.json, and supporting files.
C:\CiscoCertAutomation\CiscoCertificates.Automation.exe --helpYou should see the usage text with available mode switches.
CiscoCertificates.ConfigEditor.exe. The application window should open with the Fluent UI sidebar showing navigation items for each configuration section.
appsettings.json (see Section 6) to configure the automation for your environment.
Program Files so that the state directory (which stores certificates and account keys) is writable without elevation issues.The CiscoCertificates.ConfigEditor is a Windows desktop application that provides a visual interface for editing appsettings.json. It eliminates the need to edit JSON directly and validates your configuration as you work.
Launch CiscoCertificates.ConfigEditor.exe. The main window has three areas:
The title bar shows the currently loaded file name and an unsaved-changes indicator. A status bar at the bottom displays operation feedback.
appsettings.json file in your automation folder.appsettings.json.This page configures the ACME certificate authority connection. It has two sections:
acme-account-key.pemSelect your DNS provider from the dropdown at the top. The page dynamically shows configuration fields specific to the selected provider:
| Provider | Required Fields |
|---|---|
| Cloudflare | API Token, Zone ID (optional — auto-detected if not set) |
| DigitalOcean | API Token |
| Route 53 | Access Key ID, Secret Access Key, Hosted Zone ID, Region |
| Azure DNS | Tenant ID, Client ID, Client Secret, Subscription ID, Resource Group, DNS Zone Name |
| Google Cloud DNS | Project ID, Service Account JSON Key Path, Managed Zone |
| Command | Create Command, Delete Command, Shell Executable, Shell Arguments Template |
{recordName} and {recordValue} placeholders.This page uses a split-panel layout. The left panel shows a list of all UC nodes with Add and Remove buttons. The right panel shows the details of the selected node.
CUCM-PUB). Used in logs and reports. Must match the Node reference in certificate jobs.publisher or subscriber. Only publishers generate CSRs and receive cert uploads.cucm, cups, cuc, cer). Subscribers in the same group are polled for replication after the publisher gets its cert.false after deploying valid certs.Cluster Group value. For example, all CUCM nodes should use cucm, all IM&P nodes should use cups, etc.Similar split-panel layout as UC Nodes. Configure each Expressway server:
EXP-E){domain}, {certPath}, {keyPath}{domain}This is the most detailed page. Each job represents one certificate to issue and deploy. The left panel shows the job list; the right panel shows the selected job's configuration.
cucm-tomcat, cups-tomcat)DefaultRenewBeforeDays for this specific jobmulti-server (includes all cluster hostnames in the CSR) or this-server (publisher hostname only)A data grid showing which nodes receive the certificate. Use the Add/Remove buttons to manage targets. Each target has:
uc or expresswaytomcat, CallManager)Cisco Tomcat)tomcat)serverAuth, clientAuth) that the issued certificate must containConfigure email notifications. Settings cascade — additional fields appear as you enable features:
[CiscoCertAutomation])This page covers automation behavior settings organized into six cards:
| Card | Settings |
|---|---|
| Automation | Default renew before days, max parallel deployments, continue on target failure |
| State Management | Enable state tracking toggle, state directory path |
| Run Log | Run logging enabled toggle, log directory path |
| HTTP Client | HTTP timeout (seconds), HTTP retry count |
| Replication Verification | Max polling attempts, poll interval (seconds) |
| Service Restarts | Enable automatic restarts, fail-on-no-service toggle, SSH port, SSH timeouts, delay after restart, restart command template |
All configuration lives in appsettings.json. You can edit this file directly instead of using the Config Editor. The file has four main sections.
{
"Automation": {
"DefaultRenewBeforeDays": 30,
"MaxParallelDeployments": 2,
"ContinueOnTargetFailure": true,
"StateDirectory": "state",
"HttpTimeoutSeconds": 60,
"HttpRetryCount": 4,
"EnableStateTracking": true,
"RestartAutomation": {
"EnableUcAutomaticRestarts": true,
"FailWhenRestartRequiredButNoServiceDetected": true,
"UcSshPort": 22,
"UcSshCommandTimeoutSeconds": 120,
"UcSshConnectionTimeoutSeconds": 30,
"DelayAfterRestartSeconds": 15,
"UcRestartCommandTemplate": "utils service restart {service}"
}
}
}
| Setting | What It Does | Change? |
|---|---|---|
DefaultRenewBeforeDays | How many days before certificate expiry to trigger renewal. Let's Encrypt certs last 90 days, so 30 means it renews at day 60. | Default is fine |
ContinueOnTargetFailure | If one cluster fails, keep going with the others. | Default is fine |
StateDirectory | Where state files and cached certificates are stored. Relative to the app folder. | Default is fine |
EnableUcAutomaticRestarts | Automatically restart Cisco Tomcat after deploying. If false, you'll need to restart services manually. | Default is fine |
{
"Acme": {
"ContactEmail": "admin@example.com",
"AccountKeyPath": "acme-account-key.pem",
"DnsProvider": "Cloudflare",
"DnsPropagationWaitSeconds": 90,
"AuthorizationPollSeconds": 15,
"AuthorizationPollMaxAttempts": 20,
"Cloudflare": {
"ZoneId": "YOUR_ZONE_ID_HERE",
"TtlSeconds": 120,
"ApiToken": ""
},
"Command": {
"PresentCommand": ".\\scripts\\dns-present.ps1 -RecordName {recordName} -RecordValue {recordValue}",
"CleanupCommand": ".\\scripts\\dns-cleanup.ps1 -RecordName {recordName} -RecordValue {recordValue}",
"ShellExecutable": "powershell",
"ShellArgumentsTemplate": "-NoProfile -NonInteractive -Command '{command}'"
}
}
}
| Setting | What To Enter |
|---|---|
ContactEmail | Your real email address. Let's Encrypt uses this to warn you about expiring certs or policy changes. |
DnsProvider | Set to your DNS provider name: "Cloudflare", "Route53", "Azure", "GoogleCloud", "DigitalOcean", or "Command". |
Cloudflare.ZoneId | (Cloudflare only) Your Cloudflare Zone ID. Find it on the Overview page of your domain in the Cloudflare dashboard. |
Cloudflare.ApiToken | (Cloudflare only) A Cloudflare API Token with Zone.DNS.Edit permission. |
"DirectoryUrl": "https://acme-staging-v02.api.letsencrypt.org/directory" in JSON.Set "DnsProvider": "Command" and write two PowerShell scripts:
scripts\dns-present.ps1 — Creates a DNS TXT record. Receives -RecordName (e.g., _acme-challenge.server.example.com) and -RecordValue (the challenge token).scripts\dns-cleanup.ps1 — Deletes that same TXT record after validation.This is the largest section. It defines your Cisco nodes and the certificate jobs.
List every Cisco UC server in your environment, even subscribers (they're needed for replication verification):
"UcNodes": [
{
"Name": "CUCM-PUB",
"Host": "cucm-pub.example.com",
"ProductType": "Cisco Unified CM Publisher",
"ClusterRole": "publisher",
"ClusterGroup": "cucm",
"AllowUntrustedServerCertificate": true,
"AllowUntrustedSshHostKey": true,
"Username": "",
"Password": ""
},
{
"Name": "CUCM-SUB1",
"Host": "cucm-sub1.example.com",
"ProductType": "Cisco Unified CM Subscriber",
"ClusterRole": "subscriber",
"ClusterGroup": "cucm",
"AllowUntrustedServerCertificate": true,
"AllowUntrustedSshHostKey": true,
"Username": "",
"Password": ""
}
]
| Field | What It Does |
|---|---|
Name | A short label you choose (used in logs and reports). |
Host | The FQDN or IP of the server. Must be reachable on HTTPS (443) and SSH (22). |
ProductType | Descriptive label (CUCM, IM&P, CUC, CER). Used in reports only. |
ClusterRole | "publisher" or "subscriber". Only publishers generate CSRs and receive cert uploads. |
ClusterGroup | Groups nodes that belong to the same product cluster (e.g., "cucm", "cups", "cuc", "cer"). Subscribers in the same group are polled for replication after the publisher gets its cert. |
AllowUntrustedServerCertificate | Set to true if the UC node currently has a self-signed or expired HTTPS cert (common before first run). You can set this to false after deploying valid certs. |
AllowUntrustedSshHostKey | Set to true to accept any SSH host key. For production, set to false and provide SshHostKeyFingerprint. |
Username / Password | UC admin credentials. See Section 6.5 for secure alternatives. |
"ExpresswayNodes": [
{
"Name": "EXP-E",
"Host": "expressway.example.com",
"SshPort": 22,
"TlsPort": 443,
"AllowUntrustedSshHostKey": true,
"SshCommandTimeoutSeconds": 120,
"InstallCommandTemplate": "...",
"VerifyCommandTemplate": "...",
"Username": "",
"Password": ""
}
]
Each job represents one certificate to issue and deploy. You need one job per Cisco product cluster.
Example: CUCM Tomcat certificate
{
"Name": "cucm-tomcat",
"CommonName": "cucm-pub.example.com",
"SubjectAlternativeNames": [
"cucm-pub.example.com",
"cucm-sub1.example.com",
"cucm-sub2.example.com"
],
"RenewBeforeDays": 30,
"KeyAlgorithm": "RS256",
"UseDeviceCsr": true,
"CsrDistribution": "multi-server",
"Targets": [
{
"Service": "tomcat",
"Node": "CUCM-PUB",
"Type": "uc",
"RestartServices": [ "Cisco Tomcat" ]
}
],
"InstallChainAsTrust": true,
"TrustServices": [ "tomcat" ],
"TrustCertificateDescription": "Managed by CiscoCertificates.Automation"
}
| Field | What It Does |
|---|---|
Name | A unique label for the job. |
CommonName | The primary hostname on the certificate (usually the publisher FQDN). |
SubjectAlternativeNames | All hostnames that should be on the cert. Include the publisher AND all subscribers. |
KeyAlgorithm | "RS256" (RSA 2048) is recommended for Cisco compatibility. |
UseDeviceCsr | true for all UC jobs. false for Expressway. |
CsrDistribution | "multi-server" tells the publisher to include all cluster hostnames in the CSR. |
Targets | Which node to deploy to. For UC jobs, list only the publisher. Subscribers get the cert via replication. |
RestartServices | Which Cisco services to restart after deployment. |
InstallChainAsTrust | true to upload the Let's Encrypt CA chain as trusted certs. |
TrustServices | Which trust stores to upload the CA chain to (e.g., ["tomcat"]). |
cucm-tomcat, cups-tomcat, cuc-tomcat, cer-tomcatexpressway-e, expressway-cCallManager, tvs), add additional jobs targeting those services.{
"Notifications": {
"Enabled": true,
"SendSuccessSummary": false,
"SmtpHost": "smtp.example.com",
"SmtpPort": 587,
"FromAddress": "cert-automation@example.com",
"ToAddresses": [ "voip-team@example.com" ],
"UseStartTls": true,
"UseAuthentication": false,
"SubjectPrefix": "[CiscoCertAutomation]"
}
}
| Setting | What It Does |
|---|---|
Enabled | Set to false to disable all email notifications. |
SendSuccessSummary | When false, emails are only sent on failure. Set to true to get an email on every run. |
SmtpHost / SmtpPort | Your SMTP relay server. |
UseAuthentication | Set to true if your SMTP server requires login, then provide Username and Password. |
Every credential field supports two methods:
| Method | Example | Best For |
|---|---|---|
| Direct in appsettings.json | "Username": "admin" | Quick setup, lab environments |
| Environment variable | "UsernameEnvironmentVariable": "CISCO_UC_USER" | Production — keeps secrets out of config files |
The app checks in order: direct value → environment variable. The first non-empty value wins.
Follow these steps in order for your first deployment. Each step validates one piece of the puzzle before moving to the next.
Use the Config Editor (see Section 5) or a text editor to fill in your environment-specific values:
Set "AllowUntrustedServerCertificate": true on any UC nodes that currently have self-signed certs.
CiscoCertificates.Automation.exe --api-preflight
This validates:
Fix any errors before proceeding. Common issues: wrong hostname, firewall blocking port 443 or 22, incorrect credentials.
CiscoCertificates.Automation.exe --status-report
This reads the current certificate from each target and reports:
This confirms the app can successfully read certificates from your devices. No changes are made.
Switch the ACME provider to "Let's Encrypt Staging" in the Config Editor, or add the staging directory URL in JSON:
"DirectoryUrl": "https://acme-staging-v02.api.letsencrypt.org/directory"
Then run:
CiscoCertificates.Automation.exe --issue-only
This will:
If Step 4 succeeded, run the full production cycle (still using the staging server):
CiscoCertificates.Automation.exe --production
This performs the full deployment cycle including uploading the cert, installing trust chain, and restarting services. The cert won't be browser-trusted (it's from staging) but this validates the entire deployment pipeline end-to-end.
Switch back to "Let's Encrypt Production" in the Config Editor (or remove the staging DirectoryUrl from JSON).
Run the full production cycle:
CiscoCertificates.Automation.exe --production
This issues real, browser-trusted certificates and deploys them. After completion:
--status-report again to confirm the new thumbprints and expiration datesSee Section 9 for Task Scheduler setup. The app handles renewals automatically — it only issues a new cert when the existing one is within RenewBeforeDays of expiration.
CiscoCertificates.Automation.exe [mode] [options]
Exactly one mode is required. Modes are mutually exclusive.
| Switch | Aliases | What It Does | Makes Changes? |
|---|---|---|---|
--production | --prod | Checks each target's cert, and if it's within RenewBeforeDays of expiry, issues a new cert and deploys it. Skips targets that don't need renewal. | Yes — issues certs, deploys, restarts services |
--status-report | --status, --report, --report-only | Probes each target and reports the current certificate thumbprint, expiration date, and days remaining. Sends a summary email regardless of success/failure. | No — read only |
--issue-only | --issue, --acme-only | Always issues new certificates from Let's Encrypt (even if current certs aren't expiring). Saves them locally but does NOT deploy to any Cisco device. | Partial — issues certs, creates DNS records, but no Cisco changes |
--api-preflight | --preflight, --validate-api | Tests API connectivity, authentication, and SSH access to all configured targets. No certificates are issued or deployed. | No — read only |
--cleanup-dns | --cleanup | Removes stale _acme-challenge TXT records from the DNS provider. Useful if a previous run was interrupted before DNS cleanup. | Partial — DNS only |
You can also specify a mode using --mode <value> or --mode=<value> syntax (e.g., --mode production).
These can be combined with any mode:
| Option | Aliases | What It Does |
|---|---|---|
--dry-run | --dryrun | Issues from ACME and validates the certificate and trust stores, but skips deployment to devices. Can also be used standalone without a mode. |
--restart | --allow-restart | Allows automatic UC service restarts (e.g., Cisco Tomcat) after certificate deployment. Without this flag, certificates are deployed but services are not restarted. |
--name <job> | --job <job> | Runs only the specified job by name (e.g., --name cucm-tomcat). Without this, all configured jobs are processed. |
--help | -h, /? | Displays help text and exits. |
Any additional argument in the format --Section:Key=Value is passed to the .NET configuration system. For example:
CiscoCertificates.Automation.exe --production --Logging:LogLevel:Default=Debug CiscoCertificates.Automation.exe --production --Acme:DnsPropagationWaitSeconds=120
This overrides settings for a single run without changing appsettings.json.
taskschd.msc)CiscoCertificates.AutomationC:\CiscoCertAutomation\CiscoCertificates.Automation.exe--productionC:\CiscoCertAutomationRenewBeforeDays: 30 means the app starts renewing at day 60. Running daily gives you 30 days of automatic retries if something goes wrong.Create a second scheduled task for a weekly status report:
C:\CiscoCertAutomation\CiscoCertificates.Automation.exe--status-reportThis sends a summary email showing the current certificate status on all devices, giving you early warning if anything looks wrong.
When EnableStateTracking is true (the default), the app saves state in the state/ folder:
state/
acme-account-key.pem ← Your Let's Encrypt account key (auto-generated)
jobs/
cucm_tomcat/
state.json ← Thumbprint, expiry, per-target deployment status
certificate-chain.pem ← The last issued certificate chain
private-key.pem.protected ← DPAPI-encrypted private key (Expressway only)
cups_tomcat/
...
runs/
20260215-020000/ ← Artifacts from each run (timestamped)
cucm_tomcat/
certificate-chain.pem
private-key.pem.protected
acme-account-key.pem. This is your Let's Encrypt account key. If you delete it, the app will create a new account and your existing certificates can't be renewed through the old account. It's auto-generated on first run.If you need to force a completely new certificate (e.g., after adding a new SAN):
state\jobs\cucm_tomcat\--productionOr use --issue-only to issue without deploying.
Private keys stored on disk are encrypted using Windows DPAPI (DataProtectionScope.LocalMachine). This means:
| Symptom | Likely Cause | Fix |
|---|---|---|
| "Another instance is already running" | A previous run crashed or is still running | Check Task Manager for the process. A system-wide mutex prevents duplicate runs. |
| API preflight fails with 401 | Wrong username/password for UC node | Verify credentials. Check if the account is locked out on the UC server. |
| API preflight fails with connection refused | Firewall blocking port 443 or wrong hostname | Verify network connectivity: Test-NetConnection server.example.com -Port 443 |
| DNS challenge fails / ACME authorization timeout | TXT record not created or not propagated | Run nslookup -type=TXT _acme-challenge.yourdomain.com 8.8.8.8 to check if the record is visible. Increase DnsPropagationWaitSeconds if it's a timing issue. |
| SSH connection refused on UC node | SSH not enabled on CUCM or firewall | Verify SSH is enabled in CUCM Serviceability. Test with PuTTY or ssh admin@server.example.com. |
| Replication not verified after max attempts | Cisco DB replication is slow or broken | Check replication status in CUCM Admin. Increase ReplicationDelaySeconds or ReplicationVerifyMaxAttempts. |
| "Certificate was issued but no CERTIFICATE PEM blocks returned" | Let's Encrypt returned an unexpected response | Retry. If persistent, check Let's Encrypt status page. Try the staging server. |
| Cert deployed but browser still shows old cert | Cisco Tomcat wasn't restarted, or browser cache | Verify RestartServices includes "Cisco Tomcat". Clear browser cache or use an incognito window. |
| Email notification not received | SMTP config incorrect | Check SMTP host, port, and authentication settings. Test with Send-MailMessage from PowerShell. |
For detailed output, run with debug logging:
CiscoCertificates.Automation.exe --production --Logging:LogLevel:Default=Debug
Or set it permanently in appsettings.json:
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft": "Warning"
}
}
| Limit | Value |
|---|---|
| Certificates per Registered Domain | 50 per week |
| Duplicate Certificates | 5 per week (same exact set of hostnames) |
| Failed Authorizations | 5 per hour per account per hostname |
| New Orders | 300 per 3 hours |
With state tracking enabled and normal daily runs, you'll never come close to these limits. The app only requests a new cert when the current one is near expiry.
| Code | Meaning |
|---|---|
0 | Success — all jobs completed without errors |
1 | Invalid command-line arguments |
2 | One or more jobs failed |
3 | Another instance is already running (mutex lock) |
4 | All jobs succeeded but the notification email failed to send |
You can check the exit code in Task Scheduler's "Last Run Result" column, or in PowerShell with $LASTEXITCODE after a manual run.
| Key | Type | Default | Description |
|---|---|---|---|
DefaultRenewBeforeDays | int | 30 | Days before cert expiry to trigger renewal |
MaxParallelDeployments | int | 2 | Max concurrent deployments across clusters |
ContinueOnTargetFailure | bool | true | Continue to next job/target if one fails |
StateDirectory | string | "state" | Path for state files (relative to app folder) |
HttpTimeoutSeconds | int | 60 | HTTP request timeout for UC API calls |
HttpRetryCount | int | 4 | Number of retries on transient HTTP failures |
EnableStateTracking | bool | true | Persist state for cert reuse and deployment tracking |
ReplicationVerifyMaxAttempts | int | 10 | Max polls when verifying subscriber replication |
ReplicationVerifyPollSeconds | int | 30 | Seconds between replication polls |
| Key | Type | Default | Description |
|---|---|---|---|
EnableUcAutomaticRestarts | bool | true | Restart Cisco services after cert deployment |
FailWhenRestartRequiredButNoServiceDetected | bool | true | Fail if UC says restart needed but no service name detected |
UcSshPort | int | 22 | SSH port for UC nodes |
UcSshCommandTimeoutSeconds | int | 120 | Timeout for SSH commands on UC |
UcSshConnectionTimeoutSeconds | int | 30 | SSH connection timeout |
DelayAfterRestartSeconds | int | 15 | Wait time after service restart before next action |
UcRestartCommandTemplate | string | "utils service restart {service}" | SSH command template for restarting a service |
| Key | Type | Default | Description |
|---|---|---|---|
Enabled | bool | true | Enable run-level artifact logging |
Directory | string | "runs" | Directory for run artifacts |
| Key | Type | Default | Description |
|---|---|---|---|
DirectoryUrl | string | (LE production) | ACME directory URL |
ContactEmail | string | Email for Let's Encrypt account | |
AccountKeyPath | string | "acme-account-key.pem" | ACME account key file path |
DnsProvider | string | "Command" | "Cloudflare", "Route53", "Azure", "GoogleCloud", "DigitalOcean", or "Command" |
DnsPropagationWaitSeconds | int | 90 | Seconds to wait after creating DNS TXT record |
AuthorizationPollSeconds | int | 15 | Seconds between ACME authorization status checks |
AuthorizationPollMaxAttempts | int | 20 | Max authorization polls before timeout |
| Key | Type | Default | Description |
|---|---|---|---|
Name | string | Unique node label | |
Host | string | FQDN or IP address | |
ProductType | string | Descriptive product type | |
ClusterRole | string | "publisher" | "publisher" or "subscriber" |
ClusterGroup | string | null | Groups nodes into product clusters |
AllowUntrustedServerCertificate | bool | false | Accept untrusted HTTPS cert from UC API |
AllowUntrustedSshHostKey | bool | false | Accept any SSH host key |
SshHostKeyFingerprint | string | null | Expected SSH host key fingerprint |
| Key | Type | Default | Description |
|---|---|---|---|
Name | string | Unique job label | |
CommonName | string | Primary cert hostname (CN) | |
SubjectAlternativeNames | string[] | [] | All hostnames for the cert SAN |
RenewBeforeDays | int? | null | Override DefaultRenewBeforeDays for this job |
KeyAlgorithm | string | "RS256" | RS256, ES256, ES384, or ES512 |
UseDeviceCsr | bool | false | Generate CSR on the Cisco device (required for UC) |
CsrDistribution | string | "multi-server" | "multi-server" or "this-server" |
ReplicationDelaySeconds | int | 60 | Wait time after publisher deploy for DB replication |
InstallChainAsTrust | bool | false | Upload CA chain as trusted certs |
TrustServices | string[] | [] | Trust stores to upload CA chain to |
RequiredEnhancedKeyUsages | string[] | [] | EKU OIDs or names the cert must contain |
FailIfRequiredEkuMissing | bool | true | Fail if issued cert lacks required EKUs |
| Key | Type | Default | Description |
|---|---|---|---|
Type | string | "uc" or "expressway" | |
Node | string | Must match a UcNodes or ExpresswayNodes Name | |
Service | string | "tomcat" | UC cert service (e.g., "tomcat", "CallManager") |
Domain | string | null | Expressway domain for cert install |
RestartServices | string[] | [] | UC services to restart (e.g., ["Cisco Tomcat"]) |
| Key | Type | Default | Description |
|---|---|---|---|
Enabled | bool | true | Enable email notifications |
SendSuccessSummary | bool | false | Send email on success (default: failures only) |
SmtpHost | string | SMTP server hostname | |
SmtpPort | int | 587 | SMTP port |
FromAddress | string | Sender email address | |
ToAddresses | string[] | [] | Recipient email addresses |
UseStartTls | bool | true | Use STARTTLS for SMTP |
SkipTlsCertificateValidation | bool | false | Skip TLS cert validation for SMTP |
UseAuthentication | bool | false | Authenticate with SMTP server |
SubjectPrefix | string | "[CiscoCertAutomation]" | Email subject prefix |