Industry
Use Case
Favorite Feature
A defense contractor develops mission-critical command and control software deployed in classified government and military facilities. Their customers require deployments in completely air-gapped environments with zero external network connectivity for security and regulatory compliance reasons. The vendor previously relied on expensive hardware dongles for license enforcement, but needed a solution that could validate entitlements offline while providing cryptographic proof of authenticity, binding licenses to specific hardware devices, and allowing secure license distribution through offline channels.
NetLicensing’s Node-Locked and offline licensing capabilities enabled the vendor to issue cryptographically signed license files that validate entirely on-device without any network connectivity, eliminating dongle costs while maintaining strong anti-piracy protection suitable for defense and highly regulated industries.
Defense contractors, healthcare providers, and financial institutions deploying software in air-gapped environments face a fundamental incompatibility between cloud-based licensing systems and network isolation requirements. The vendor’s customers operated in Sensitive Compartmented Information Facilities (SCIFs), classified networks, and offline research environments where any internet connectivity was prohibited by policy.
Their legacy licensing approach used hardware security dongles, which created significant operational friction: physical distribution took weeks through secure courier services, dongle failures required expensive field replacements, and multi-facility deployments meant managing hardware across geographically distributed secure locations. Additionally, regulatory compliance requirements (HIPAA, PCI-DSS, FedRAMP) mandated network isolation that made traditional cloud-based licensing impossible.
The vendor needed to eliminate hardware dongles entirely while maintaining equivalent security. This required: validating entitlements with zero network access, providing cryptographic proof that licenses were authentic and unmodified, binding licenses to specific hardware to prevent unauthorized sharing, supporting license updates through secure offline channels, and complying with government security standards for classified system deployments.
Node-Locked Licensing with Offline License Files forms the technical foundation. This model binds each license to specific hardware identifiers (CPU serial, motherboard ID, TPM module fingerprint) and encodes all entitlement information into a cryptographically signed license file that validates entirely offline.
Why this model fits: The vendor needs zero-trust, offline-first validation that cannot be bypassed through network access. Node-Locked prevents a single license from being transferred across devices. Cryptographic signing ensures license files cannot be modified without invalidating the signature. All validation logic runs locally on the customer’s disconnected system, eliminating any dependency on external infrastructure.
Mechanism: When the software starts, it computes a hardware fingerprint from multiple device identifiers, reads the local license file, verifies the cryptographic signature against the vendor’s embedded public key, and checks that the hardware fingerprint matches the license binding. Feature entitlements and expiration dates are read entirely from the local file, with no network calls.
CMDCTRL-001Command Control Suite2024.1PREDEFINED (each customer receives a unique secret code as an additional binding element)MOD-OFFLINE-001Air-Gapped Offline LicensingNode-LockedPREDEFINED (hardware fingerprints are treated as predefined node secrets)Create multiple templates representing different feature tiers:
Template 1: Basic Operations
LT-BASIC-OFFLINEBasic Operations LicenseFEATUREfeatureSet: basic-operationsmaxConcurrentSessions: 1offlineGracePeriod: 90 (days)Template 2: Advanced Intelligence
LT-ADVANCED-OFFLINEAdvanced Intelligence SuiteFEATUREfeatureSet: advanced-intelligence,data-analytics,predictive-modelingmaxConcurrentSessions: 2offlineGracePeriod: 90Template 3: Time-Limited Government Trial
LT-TRIAL-GOVTGovernment Evaluation LicenseTIMEVOLUMEtimeVolume: 30timeVolumePeriod: DAYtrialFeatures: all-featuresofflineGracePeriod: 30When a new government customer is onboarded:
# Step 1: Create Licensee (customer facility)
curl -X POST "https://go.netlicensing.io/core/v2/rest/licensee" \
-H "Authorization: Basic {base64_api_key}" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licensee.number=GOV-FACILITY-2024-001&licensee.name=Strategic Operations Center - DC&product=CMDCTRL-001&licensee.secret=PREDEFINED_SECRET_12345"
Response:
{
"licensee": {
"number": "GOV-FACILITY-2024-001",
"name": "Strategic Operations Center - DC",
"productNumber": "CMDCTRL-001",
"status": "active",
"licenseeSecret": "PREDEFINED_SECRET_12345"
}
}
Before deployment, capture hardware fingerprints from customer’s systems:
# Create a license bound to specific hardware
curl -X POST "https://go.netlicensing.io/core/v2/rest/license" \
-H "Authorization: Basic {base64_api_key}" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "license.licensee=GOV-FACILITY-2024-001&license.template=LT-ADVANCED-OFFLINE&license.startDate=2024-04-19T00:00:00Z&license.number=LIC-SCIF-HW-98765432"
Response:
{
"license": {
"number": "LIC-SCIF-HW-98765432",
"licensee": "GOV-FACILITY-2024-001",
"template": "LT-ADVANCED-OFFLINE",
"startDate": "2024-04-19T00:00:00Z",
"status": "active",
"properties": {
"featureSet": "advanced-intelligence,data-analytics,predictive-modeling",
"maxConcurrentSessions": "2",
"offlineGracePeriod": "90"
}
}
}
The vendor’s backend retrieves the license and exports it as a cryptographically signed offline file:
# Retrieve license details for offline export
curl -X GET "https://go.netlicensing.io/core/v2/rest/license/LIC-SCIF-HW-98765432" \
-H "Authorization: Basic {base64_api_key}"
The vendor’s internal system then:
.license file with embedded signatureExample generated license file (command-control.license):
{
"format": "OFFLINE_LICENSE_V1",
"licensee": "GOV-FACILITY-2024-001",
"features": ["advanced-intelligence", "data-analytics", "predictive-modeling"],
"hardwareBindings": {
"cpuSerial": "CPU-Z9X8W7V6U5T",
"motherboardId": "MOBO-A9B8C7D6E5",
"tpmModuleId": "TPM-F1E2D3C4B5"
},
"expirationDate": "2025-04-19",
"maxConcurrentSessions": 2,
"offlineGracePeriod": 90,
"issuedAt": "2024-04-19T10:30:00Z",
"signature": "HMAC_SHA256_BASE64_ENCODED_SIGNATURE_HERE"
}
The vendor delivers the license file to the customer through secure offline channels:
When the command and control software initializes on the customer’s air-gapped system:
# Application initialization (Python pseudocode)
import hashlib
import hmac
import json
from datetime import datetime
class OfflineLicenseValidator:
def __init__(self, vendor_public_key):
self.vendor_public_key = vendor_public_key
def get_hardware_fingerprint(self):
"""Compute device fingerprint from hardware identifiers"""
import subprocess
cpu_serial = subprocess.check_output(
["dmidecode", "-s", "processor-serial-number"]
).decode().strip()
motherboard_id = subprocess.check_output(
["dmidecode", "-s", "baseboard-serial-number"]
).decode().strip()
# TPM fingerprint from cryptographic key
tpm_id = self._read_tpm_module_id()
return {
"cpuSerial": cpu_serial,
"motherboardId": motherboard_id,
"tpmModuleId": tpm_id
}
def validate_license_file(self, license_path):
"""Validate offline license file"""
try:
with open(license_path, 'r') as f:
license_data = json.load(f)
# Verify format
if license_data.get("format") != "OFFLINE_LICENSE_V1":
return False, "Invalid license format"
# Verify signature
signature = license_data.pop("signature")
payload = json.dumps(license_data, sort_keys=True)
expected_sig = hmac.new(
self.vendor_public_key.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
if signature != expected_sig:
return False, "License signature invalid (tampering detected)"
# Verify hardware binding
current_hw = self.get_hardware_fingerprint()
license_hw = license_data["hardwareBindings"]
if not self._matches_hardware(current_hw, license_hw):
return False, "License not bound to this hardware"
# Verify expiration
expiration = datetime.fromisoformat(
license_data["expirationDate"]
)
if datetime.now() > expiration:
return False, "License expired"
# License valid
return True, {
"features": license_data["features"],
"expiresAt": license_data["expirationDate"],
"maxSessions": license_data["maxConcurrentSessions"]
}
except Exception as e:
return False, f"Validation error: {str(e)}"
def _matches_hardware(self, current, licensed):
"""Check if current hardware matches licensed binding"""
return (current["cpuSerial"] == licensed["cpuSerial"] and
current["motherboardId"] == licensed["motherboardId"] and
current["tpmModuleId"] == licensed["tpmModuleId"])
# Application startup
validator = OfflineLicenseValidator(vendor_public_key="VENDOR_PUBLIC_KEY_BASE64")
valid, result = validator.validate_license_file("/etc/cmdctrl/license.license")
if valid:
print(f"✓ License valid until {result['expiresAt']}")
print(f"✓ Features: {', '.join(result['features'])}")
app.initialize_with_features(result['features'])
else:
print(f"✗ License validation failed: {result}")
app.shutdown("License validation failed")
Licensees represent customer deployments (facilities, organizational units, or individual systems). In air-gapped scenarios, licensees are created in the vendor’s NetLicensing console, then hardware fingerprints are manually collected from customer facilities.
Creation Flow:
curl -X POST "https://go.netlicensing.io/core/v2/rest/licensee" \
-H "Authorization: Basic {api_key}" \
-d "licensee.number=GOV-SCIF-DENVER-2024&licensee.name=SCIF Denver Operations&product=CMDCTRL-001&licensee.secret=CUST_SECRET_CODE_ABC123"
Hardware Fingerprinting Collection (Customer-Side):
Customers capture hardware identifiers on their isolated systems and transmit only the fingerprints (no sensitive data) back to the vendor:
# Run on customer's air-gapped system (Linux example)
# Capture CPU serial
dmidecode -s processor-serial-number
# Capture motherboard ID
dmidecode -s baseboard-serial-number
# Capture TPM module fingerprint
tpm2_getcap handles-persistent | grep -A1 "0x81000001"
# Send only these identifiers back to vendor through secure channel
# Vendor then associates them with the Licensee in NetLicensing
Air-gapped deployments do not use the NetLicensing Shop or online payment systems, as customers have no internet connectivity. Instead:
Alternative Flow:
No payment integration with NetLicensing is required for air-gapped deployments. The vendor tracks entitlements through NetLicensing but handles payment separately through their standard enterprise software licensing process.
Offline Grace Period Handling
Government facilities may experience prolonged disconnection from vendor communication channels. The vendor implements a grace period where licenses continue functioning even if validation would fail:
def validate_with_grace_period(license_data, grace_days=90):
"""Allow limited operation after expiration during grace period"""
expiration = datetime.fromisoformat(license_data["expirationDate"])
grace_limit = expiration + timedelta(days=grace_days)
if datetime.now() <= grace_limit:
if datetime.now() > expiration:
# In grace period - log warning but allow continued operation
logger.warning(
f"License in grace period (expires {expiration}, "
f"grace ends {grace_limit})"
)
return True, "GRACE_PERIOD"
else:
return True, "VALID"
else:
# Grace period expired
return False, "EXPIRED_NO_GRACE"
License Renewal in Air-Gapped Environments
Renewals require physical license file exchange:
Device Hardware Changes
If customer hardware requires replacement (failed motherboard, system upgrade):
Audit Logging for Compliance
Maintain detailed audit logs for government compliance:
{
"auditEvent": {
"timestamp": "2024-04-19T15:30:00Z",
"eventType": "LICENSE_VALIDATION",
"licensee": "GOV-SCIF-DENVER-2024",
"license": "LIC-SCIF-HW-98765432",
"result": "VALID",
"validatedFeatures": ["advanced-intelligence", "data-analytics"],
"hardwareFingerprint": "HASH_OF_FINGERPRINT",
"systemUptime": "2847 hours"
}
}
No Network Retry Logic Required
Unlike online deployments, air-gapped validation does not require retry logic or fallback mechanisms. Validation is deterministic and offline:
Serialization and Tamper Detection
License files are JSON with HMAC-SHA256 signatures. Any modification (including whitespace changes) invalidates the signature and prevents the application from initializing.
The vendor successfully eliminated hardware dongles while maintaining stronger security through cryptographic validation and hardware binding:

Compliance & Licence Audit: Automated Overuse Detection and Audit-Ready Reporting
Detect overuse, enforce entitlement compliance, and produce audit-ready reports for enterprise and regulated customers

Multi-Product Bundle Licensing: Suite Management with Component Tracking
Sell product suites under one customer agreement while tracking usage and entitlements per component independently