Read Client Secret Expiration Command
The readclientsecretexpiration
command allows you to query the expiration date of a client secret from HelseID. This is useful for automated monitoring and scheduling of client secret renewals in systems like Octopus Deploy.
Purpose
This command enables automation of client secret management by providing programmatic access to secret expiration dates. It can be used to:
- Monitor client secret expiration dates
- Schedule automated secret renewals in CI/CD pipelines
- Set up alerts when secrets are approaching expiration
- Audit client secret status across multiple clients
Authentication
The command uses the client's existing private JWK (JSON Web Key) to authenticate with HelseID, similar to the update commands.
Parameters
Parameter name | Description | Required | Sample |
---|---|---|---|
ClientId | The Client's unique identifier found in Klient konfigurasjon in HelseId Selvbetjening | Yes | 37a08838-db82-4de0-bfe1-bed876e7086e |
ExistingPrivateJwkPath | Path to the existing private key file | No* | C:\keys\37a08838-db82-4de0-bfe1-bed876e7086e_private.json |
ExistingPrivateJwk | Private key string | No* | {"alg":"PS512","d":"xxx .....} |
*Either ExistingPrivateJwkPath or ExistingPrivateJwk must be provided.
Commands
Read expiration using private key file
helseid-cli readclientsecretexpiration --ClientId <CLIENT_ID> --ExistingPrivateJwkPath <PATH_TO_PRIVATE_KEY>
Read expiration using private key string
helseid-cli readclientsecretexpiration --ClientId <CLIENT_ID> --ExistingPrivateJwk <PRIVATE_KEY_JSON>
Using short parameter names
helseid-cli readclientsecretexpiration -c <CLIENT_ID> -ep <PATH_TO_PRIVATE_KEY>
Examples
Example 1: Read expiration from file
helseid-cli readclientsecretexpiration \
--ClientId "37a08838-db82-4de0-bfe1-bed876e7086e" \
--ExistingPrivateJwkPath "C:\keys\client_private.json"
Example 2: Read expiration with inline key
helseid-cli readclientsecretexpiration \
--ClientId "37a08838-db82-4de0-bfe1-bed876e7086e" \
--ExistingPrivateJwk '{"alg":"PS512","d":"...private key data..."}'
Working with Escaped JSON from HelseID API
Using HelseID API responses with PowerShell
When HelseID APIs return JWK data, it often comes with escaped quotes like: {\"kty\":\"RSA\",\"kid\":\"...\"}
Best practice: PowerShell variable (preserves API response exactly)
# Get JWK from API response - use as-is without modification
$apiJwkResponse = '{\"kty\":\"RSA\",\"kid\":\"my-key-2024\",\"d\":\"MIIEowIBAAKCAQEA...\",\"n\":\"xGHNF7qI...\",\"e\":\"AQAB\"}'
dotnet run -- readclientsecretexpiration --ClientId "my-client-id" --ExistingPrivateJwk $apiJwkResponse
Alternative: PowerShell here-string
# Wrap API response in here-string without modification
$json = @"
{\"kty\":\"RSA\",\"kid\":\"my-key-2024\",\"d\":\"MIIEowIBAAKCAQEA...\",\"n\":\"xGHNF7qI...\",\"e\":\"AQAB\"}
"@
dotnet run -- readclientsecretexpiration --ClientId "my-client-id" --ExistingPrivateJwk $json
Important: Avoid Direct Command Line Usage with Escaped JSON
# This will fail due to shell parsing issues:
dotnet run -- readclientsecretexpiration --ClientId "my-client-id" --ExistingPrivateJwk "{\"kty\":\"RSA\"}"
Output
The command outputs the expiration date in a human-readable format:
Successful response
Environment: Production
Client secret expiration date: 2025-06-27 14:30:00
Error response
Environment: Production
Failed to read client secret expiration: Unauthorized
No expiration date available
Environment: Production
Client secret expiration date not available in response
Exit Codes
0
: Success - expiration date retrieved successfully- Non-zero: Error occurred (authentication failure, network error, etc.)
Integration with Automation Systems
Octopus Deploy Integration
This command can be integrated into Octopus Deploy runbooks to monitor client secret expiration:
# PowerShell script step in Octopus Deploy
$clientId = "#{ClientId}"
$privateKeyPath = "#{PrivateKeyPath}"
$result = & helseid-cli readclientsecretexpiration -c $clientId -ep $privateKeyPath
if ($LASTEXITCODE -eq 0) {
Write-Host "Successfully retrieved expiration date: $result"
# Extract date and calculate days until expiry
if ($result -match "(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})") {
$expirationDate = [DateTime]::Parse($matches[1])
$daysUntilExpiry = ($expirationDate - (Get-Date)).Days
Write-Host "Days until expiry: $daysUntilExpiry"
if ($daysUntilExpiry -lt 30) {
Write-Warning "Secret expires soon - scheduling renewal"
# Add renewal logic here
}
}
} else {
Write-Error "Failed to retrieve expiration date: $result"
Exit 1
}
Bash Script Example
#!/bin/bash
# Capture exit code and output
output=$(helseid-cli readclientsecretexpiration --ClientId "$CLIENT_ID" --ExistingPrivateJwkPath "$KEY_PATH" 2>&1)
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "Output: $output"
# Extract date from output (assuming format: "Client secret expiration date: 2025-06-27 14:30:00")
expiration_date=$(echo "$output" | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}")
if [ ! -z "$expiration_date" ]; then
echo "Secret expires at: $expiration_date"
# Calculate days until expiration (requires date command)
expiry_seconds=$(date -d "$expiration_date" +%s)
current_seconds=$(date +%s)
days_until_expiry=$(( ($expiry_seconds - $current_seconds) / 86400 ))
echo "Days until expiry: $days_until_expiry"
if [ $days_until_expiry -lt 30 ]; then
echo "WARNING: Secret expires soon - schedule renewal!"
fi
fi
else
echo "Failed to read expiration: $output"
exit 1
fi
PowerShell Real-World Example with API Response
# Real-world example: Get JWK from HelseID API and check expiration
$clientId = "my-client-id"
# API response comes with escaped quotes - use as-is
$jwkFromApi = '{\"kty\":\"RSA\",\"kid\":\"my-key-2024\",\"d\":\"MIIEowIBAAKCAQEA...\"}'
# Pass API response directly without modification
$result = & helseid-cli readclientsecretexpiration --ClientId $clientId --ExistingPrivateJwk $jwkFromApi
if ($LASTEXITCODE -eq 0) {
Write-Host "Secret expiration retrieved: $result"
# Extract date and calculate days until expiry
if ($result -match "(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})") {
$expirationDate = [DateTime]::Parse($matches[1])
$daysUntilExpiry = ($expirationDate - (Get-Date)).Days
Write-Host "Expires: $expirationDate ($daysUntilExpiry days)"
if ($daysUntilExpiry -lt 30) {
Write-Warning "Secret expires soon - schedule renewal!"
# Add renewal logic or notification here
}
}
} else {
Write-Error "Failed: $result"
}
Notes
- The command uses the same authentication mechanism as other HelseID commands
- Requires appropriate permissions (
nhn:selvbetjening/client
scope) - Returns exit code 0 on success, non-zero on error for automation purposes
- Output format is designed to be easily parsed by automation scripts
- Expiration date enables precise date calculations and automation logic