Complete command reference and usage guide for the IBM Confidential Computing Contract CLI.
- Introduction
- Installation
- Prerequisites
- Quick Start
- Command Reference
- Common Workflows
- CI/CD Integration
- Exit Codes
- Troubleshooting
- Examples
The Contract CLI automates the process of generating and managing contracts for provisioning IBM Confidential Computing services including IBM Confidential Computing Container Runtime, IBM Confidential Computing Container Runtime for Red Hat Virtualization Solutions, and IBM Confidential Computing Containers for Red Hat OpenShift Container Platform. It provides a comprehensive set of commands for:
- Generating signed and encrypted contracts
- Managing encryption certificates
- Validating contracts and network configurations
- Handling attestation records
- Working with container configurations
Download the latest release for your platform from the releases page.
- Linux: amd64, arm64, s390x, ppc64le
- macOS: amd64 (Intel), arm64 (Apple Silicon)
- Windows: amd64, arm64
# Check version
contract-cli --version
# View available commands
contract-cli --helpOpenSSL is required for all cryptographic operations. The CLI will use the openssl binary from your system PATH.
Installation:
- Linux:
apt-get install openssloryum install openssl - macOS:
brew install openssl - Windows: Download OpenSSL
If OpenSSL is not in your system PATH, configure the OPENSSL_BIN environment variable:
Linux/macOS:
export OPENSSL_BIN=/usr/bin/opensslWindows (PowerShell):
$env:OPENSSL_BIN="C:\Program Files\OpenSSL-Win64\bin\openssl.exe"# 1. Generate RSA key pair
openssl genrsa -out private.pem 4096
# 2. Create your contract YAML
cat > contract.yaml <<EOF
env: |
type: env
logging:
logRouter:
hostname: example.logs.cloud.ibm.com
iamApiKey: your-api-key
workload: |
type: workload
compose:
archive: your-archive
EOF
# 3. Validate the contract
contract-cli validate-contract --in contract.yaml --os hpvs
# 4. Generate signed and encrypted contract
contract-cli encrypt --in contract.yaml --priv private.pem --out encrypted-contract.yamlEncode text or JSON data to Base64 format. Useful for encoding data that needs to be included in contracts or configurations.
contract-cli base64 [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Input data to encode (text or JSON) (use '-' for standard input) |
--format |
string | No | Input data format (text or json) |
--out |
string | No | Path to save Base64 encoded output |
-h, --help |
- | No | Display help information |
Basic text encoding:
contract-cli base64 --in "Hello World" --format textJSON encoding:
contract-cli base64 --in '{"type": "workload"}' --format jsonSave to file:
contract-cli base64 --in "Hello World" --format text --out encoded.txtUsing standard input (pipe input):
echo "Hello World" | contract-cli base64 --in - --format textGenerate Base64-encoded tar.gz archive of docker-compose.yaml or pods.yaml. Creates a compressed archive of your container configuration files, encoded as Base64 for inclusion in Confidential Computing contracts. Supports both plain and encrypted output.
contract-cli base64-tgz [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to folder containing docker-compose.yaml or pods.yaml (use '-' for standard input) |
--output |
string | No | Output type: plain or encrypted (default: plain) |
--cert |
string | No | Path to encryption certificate (uses latest embedded certificate for the provided IBM Confidential Computing platform, if not specified) |
--os |
string | No | Target IBM Confidential Computing platform: ccrt, ccrv, ccco, or hpvs (default: hpvs) |
--ver |
string | No | Specific encryption certificate version (e.g., 26.2.0). Uses latest version if not specified. Use list-encryptioncert-versions to see available versions |
--out |
string | No | Path to save the output |
-h, --help |
- | No | Display help information |
Plain Base64 archive:
contract-cli base64-tgz --in ./compose-folderEncrypted archive with latest certificate:
contract-cli base64-tgz --in ./compose-folder --output encryptedEncrypted archive with custom certificate:
contract-cli base64-tgz \
--in ./compose-folder \
--output encrypted \
--cert encryption.crtFor HPCR-RHVS:
contract-cli base64-tgz \
--in ./pods-folder \
--output encrypted \
--os ccrvFor CCCO:
contract-cli base64-tgz \
--in ./pods-folder \
--output encrypted \
--os cccoSave to file:
contract-cli base64-tgz --in ./compose-folder --out archive.txtWith specific certificate version:
contract-cli base64-tgz \
--in ./compose-folder \
--output encrypted \
--os ccco \
--ver 25.12.0Using standard input (pipe input):
echo "pods-folder" | contract-cli base64-tgz --in -Generate a contract YAML template for IBM Confidential Computing deployments. Returns a pre-filled YAML scaffold for the workload section, env section, or a combined contract containing both. Use this as a starting point when authoring a new contract.
contract-cli contract-template [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--type |
string | No | Template type to generate: env, workload, or contract (default: contract) |
--os |
string | No | Target platform (default: hpvs). See OS values table below. |
--out |
string | No | Path to save the generated template (prints to terminal if not specified) |
-h, --help |
- | No | Display help information |
| Value | Platform | Workload template | Env template |
|---|---|---|---|
hpvs |
IBM Hyper Protect Virtual Servers | compose + play + volumes | standard (syslog, env vars, volumes) |
ccrt |
IBM Confidential Computing Container Runtime | compose + play + volumes | standard |
ccrv |
IBM CCRT for Red Hat Virtualization | play only (no compose) | standard |
ccco-peerpod |
IBM CCCO Peer Pod | confidential-containers (no volumes) | logRouter only |
ccco-bmtl |
IBM CCCO Baremetal | confidential-containers + volumes | logRouter + volumes + host-attestation |
Generate combined contract template (default):
contract-cli contract-templateGenerate workload-only template:
contract-cli contract-template --type workloadGenerate env-only template:
contract-cli contract-template --type envGenerate template for CCRT:
contract-cli contract-template --type contract --os ccrtSave combined template to file:
contract-cli contract-template --out contract-template.yamlGenerate CCRV workload template:
contract-cli contract-template \
--type workload \
--os ccrv \
--out ccrv-workload-template.yamlGenerate CCCO Peer Pod workload template:
contract-cli contract-template \
--type workload \
--os ccco-peerpod \
--out ccco-peerpod-workload.yamlGenerate CCCO Baremetal combined template:
contract-cli contract-template \
--type contract \
--os ccco-bmtl \
--out ccco-bmtl-contract.yamlDecrypt encrypted attestation records generated by Confidential Computing instances. Attestation records are typically found at /var/hyperprotect/se-checksums.txt.enc and contain cryptographic hashes for verifying workload integrity.
Optionally verify the signature of decrypted attestation records by providing both --signature and --attestation-cert flags together.
contract-cli decrypt-attestation [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to encrypted attestation file (use '-' for standard input) |
--priv |
string | Yes | Path to private key used for decryption |
--password |
string | No | Password for encrypted private key |
--out |
string | No | Path to save decrypted attestation records |
--signature |
string | No* | Path to signature file (se-signature.bin) |
--attestation-cert |
string | No* | Path to IBM attestation certificate file (PEM format) |
-h, --help |
- | No | Display help information |
* Both --signature and --attestation-cert must be provided together if signature verification is desired
Decrypt to console:
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private.pemDecrypt and save to file:
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private.pem \
--out decrypted-attestation.txtDecrypt and verify signature:
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private.pem \
--signature se-signature.bin \
--attestation-cert hpse-attestation.crtDecrypt, verify signature, and save to file:
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private.pem \
--out decrypted-attestation.txt \
--signature se-signature.bin \
--attestation-cert hpse-attestation.crtUsing standard input:
cat se-checksums.txt.enc | contract-cli decrypt-attestation \
--in - \
--priv private.pemUsing password-protected private key:
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private-encrypted.pem \
--password "your-secure-password" \
--out decrypted-attestation.txtUsing password from environment variable:
export PRIVATE_KEY_PASSWORD="your-secure-password"
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private-encrypted.pem \
--password "$PRIVATE_KEY_PASSWORD" \
--out decrypted-attestation.txtDownload encryption certificates from the IBM Confidential Computing Repository. Retrieves the latest or specific versions of encryption certificates required for contract encryption and workload deployment.
contract-cli download-certificate [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--version |
strings | Yes | Specific certificate versions to download (comma-separated, e.g., 1.0.21,1.0.22) |
--format |
string | No | Output format for data (json, yaml, or text) |
--out |
string | No | Path to save downloaded encryption certificates |
-h, --help |
- | No | Display help information |
Download latest certificate:
contract-cli download-certificateDownload specific version:
contract-cli download-certificate --version 1.0.23Download multiple versions:
contract-cli download-certificate --version 1.0.21,1.0.22,1.0.23Save to file in YAML format:
contract-cli download-certificate \
--version 1.0.23 \
--format yaml \
--out certificates.yamlGenerates a signed contract from a contract with encrypted workload and env sections.
contract-cli sign-contract [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to encrypted IBM Confidential Computing contract YAML file (use '-' for standard input) |
--priv |
string | Yes | Path to private key for signing |
--password |
string | No | Password for encrypted private key |
--out |
string | No | Path to save signed and encrypted contract |
-h, --help |
- | No | Display help information |
Sign a contract:
contract-cli sign-contract --in contract.yaml --priv private.pemSign and save to file:
contract-cli sign-contract --in contract.yaml --priv private.pem --out signed-contract.yamlUsing standard input:
cat contract.yaml | contract-cli sign-contract --in - --priv private.pemUsing password-protected private key:
contract-cli sign-contract \
--in contract.yaml \
--priv private-encrypted.pem \
--password "your-secure-password" \
--out signed-contract.yamlGenerate a signed and encrypted contract for IBM Confidential Computing deployment. Supports optional contract expiry for enhanced security.
contract-cli encrypt [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to unencrypted IBM Confidential Computing contract YAML file (use '-' for standard input) |
--priv |
string | No* | Path to private key for signing |
--password |
string | No | Password for encrypted private key |
--cert |
string | No | Path to encryption certificate (uses latest embedded certificate for the provided IBM Confidential Computing platform, if not specified) |
--os |
string | No | Target IBM Confidential Computing platform: ccrt, ccrv, ccco, or hpvs (default: hpvs) |
--ver |
string | No | Specific encryption certificate version (e.g., 26.2.0). Uses latest version if not specified. Use list-encryptioncert-versions to see available versions |
--out |
string | No | Path to save signed and encrypted contract |
--contract-expiry |
bool | No | Enable contract expiry feature |
--cacert |
string | No** | Path to CA certificate (required with expiry) |
--cakey |
string | No** | Path to CA key (required with expiry) |
--csr |
string | No** | Path to CSR file (required with expiry) |
--csrParam |
string | No** | Path to CSR parameters JSON |
--expiry |
int | No** | Contract validity in days (required with expiry) |
-h, --help |
- | No | Display help information |
* Generated automatically if not provided
** Required when --contract-expiry is enabled
Basic encryption:
contract-cli encrypt --in contract.yaml --priv private.pemWith custom certificate:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--cert encryption.crtSave to file:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--out encrypted-contract.yamlWith specific certificate version:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--os ccrt \
--ver 26.2.0With contract expiry:
contract-cli encrypt \
--contract-expiry \
--in contract.yaml \
--priv private.pem \
--cacert ca.crt \
--cakey ca.key \
--csr csr.pem \
--expiry 90For CCRV:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--os ccrvUsing password-protected private key:
contract-cli encrypt \
--in contract.yaml \
--priv private-encrypted.pem \
--password "your-secure-password" \
--out encrypted-contract.yamlFor CCCO:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--os cccoUsing standard input:
echo "test-string" | contract-cli encrypt \
--in - \
--priv private.pemEncrypt strings using the IBM Confidential Computing encryption format. Output format: hyper-protect-basic.<encrypted-password>.<encrypted-string>. Use this to encrypt sensitive data like passwords or API keys for contracts.
contract-cli encrypt-string [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | String data to encrypt (use '-' for standard input) |
--format |
string | No | Input data format (text or json) |
--cert |
string | No | Path to encryption certificate (uses latest embedded certificate for the provided IBM Confidential Computing platform, if not specified) |
--os |
string | No | Target IBM Confidential Computing platform: ccrt, ccrv, ccco, or hpvs (default: hpvs) |
--ver |
string | No | Specific encryption certificate version (e.g., 26.2.0). Uses latest version if not specified. Use list-encryptioncert-versions to see available versions |
--out |
string | No | Path to save encrypted output |
-h, --help |
- | No | Display help information |
Encrypt plain text:
contract-cli encrypt-string --in "my-secret-password"Encrypt JSON:
contract-cli encrypt-string \
--in '{"apiKey": "secret123"}' \
--format jsonWith custom certificate:
contract-cli encrypt-string \
--in "my-secret" \
--cert encryption.crtSave to file:
contract-cli encrypt-string \
--in "my-secret" \
--out encrypted-secret.txtWith specific certificate version:
contract-cli encrypt-string \
--in "my-secret-password" \
--os ccrv \
--ver 25.11.0Using standard input:
# Encrypt echo statement
echo "my-secret-password" | contract-cli encrypt-string --in -
# Encrypt file content
cat workload.yaml | contract-cli encrypt-string --in -Decrypt encrypted strings in IBM Confidential Computing format using an RSA private key. Supports both contract-basic (CCRT/CCRV) and hyper-protect-basic (CCCO/HPVS) encryption formats.
contract-cli decrypt [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to encrypted input file or encrypted string (use '-' for standard input) |
--priv |
string | Yes | Path to RSA private key file (PEM format) |
--password |
string | No | Password for encrypted private key |
--out |
string | No | Path to save decrypted output (prints to stdout if omitted) |
-h, --help |
- | No | Display help information |
Decrypt from file, output to stdout:
contract-cli decrypt --in encrypted.txt --priv private.keyDecrypt raw encrypted string:
contract-cli decrypt \
--in "hyper-protect-basic.xxx.yyy" \
--priv private.keySave decrypted output to file:
contract-cli decrypt \
--in encrypted.txt \
--priv private.key \
--out decrypted.txtWith password-protected private key:
contract-cli decrypt \
--in encrypted.txt \
--priv private.key \
--password "yourpassword"Using standard input:
cat encrypted.txt | contract-cli decrypt --in - --priv private.keyExtract a specific encryption certificate version from download-certificate output. Parses the JSON output from download-certificate and extracts the certificate for the specified version.
contract-cli get-certificate [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to download-certificate JSON output (use '-' for standard input) |
--version |
string | Yes | Certificate version to extract (e.g., 1.0.23) |
--out |
string | No | Path to save extracted encryption certificate |
-h, --help |
- | No | Display help information |
Extract specific version:
contract-cli get-certificate \
--in certificates.json \
--version 1.0.23Save to file:
contract-cli get-certificate \
--in certificates.json \
--version 1.0.23 \
--out cert-1.0.23.crtUsing standard input:
cat "cert.json" | contract-cli get-certificate --in - --version 1.0.23Retrieve IBM Confidential Computing Container Runtime image details from IBM Cloud. Parses image information from IBM Cloud API, CLI, or Terraform output to extract image ID, name, checksum, and version. Supports filtering by specific version.
contract-cli image [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to IBM Cloud images JSON (from API, CLI, or Terraform) (use '-' for standard input) |
--version |
string | No | Specific version to retrieve (returns latest if not specified) |
--format |
string | No | Output format for data (json, yaml, or text) |
--out |
string | No | Path to save image details |
-h, --help |
- | No | Display help information |
Get latest image:
contract-cli image --in ibm-cloud-images.jsonGet specific version:
contract-cli image \
--in ibm-cloud-images.json \
--version "1.0.23"Output in YAML:
contract-cli image \
--in ibm-cloud-images.json \
--format yamlSave to file:
contract-cli image \
--in ibm-cloud-images.json \
--out hpcr-image.jsonUsing standard input:
cat "ibm-cloud-images.json" | contract-cli image --in -List all available embedded encryption certificate versions for IBM Confidential Computing platforms. This command helps you discover which certificate versions are available before using the --ver flag with encryption commands. The embedded certificates are bundled with the CLI and don't require downloading from IBM Cloud.
contract-cli list-encryptioncert-versions [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--os |
string | No | Filter by platform (ccrt, ccrv, ccco, or hpvs). Shows all platforms if not specified |
--format |
string | No | Output format: json or yaml (defaults to json if not specified) |
--out |
string | No | Path to save output (prints to stdout if not specified) |
-h, --help |
- | No | Display help information |
List all available encryption certificate versions in JSON format (default):
contract-cli list-encryptioncert-versionsOutput:
{"ccco":["25.12.0","25.10.0"],"ccrt":["26.5.0","26.2.0"],"ccrv":["26.4.1","25.11.0"],"hpvs":["26.5.0","26.2.0"]}List all available encryption certificate versions in YAML format:
contract-cli list-encryptioncert-versions --format yamlOutput:
ccco:
- 25.12.0
- 25.10.0
ccrt:
- 26.5.0
- 26.2.0
ccrv:
- 26.4.1
- 25.11.0
hpvs:
- 26.5.0
- 26.2.0List versions for a specific platform in JSON:
contract-cli list-encryptioncert-versions --os ccrt --format jsonOutput:
{"ccrt":["26.5.0","26.2.0"]}List versions for HPVS platform in YAML:
contract-cli list-encryptioncert-versions --os hpvs --format yamlOutput:
hpvs:
- 26.5.0
- 26.2.0Save output to file:
contract-cli list-encryptioncert-versions --os ccrv --format yaml --out ccrv-versions.yaml- Discover Available Versions: Find out which encryption certificate versions are embedded in your CLI installation
- Version Selection: Choose a specific version for encryption operations using the
--verflag - Compatibility Check: Verify that a required certificate version is available before running automation scripts
- Documentation: Generate a list of supported versions for your deployment documentation
encrypt- Use--verflag to specify certificate version for contract encryptionencrypt-string- Use--verflag to specify certificate version for string encryptionbase64-tgz- Use--verflag with--output encryptto specify encryption certificate version
Validate an unencrypted contract against the IBM Confidential Computing schema. Checks contract structure, required fields, and data types before encryption to help catch errors early in the development process.
contract-cli validate-contract [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to unencrypted IBM Confidential Computing contract YAML file (use '-' for standard input) |
--os |
string | No | Target IBM Confidential Computing platform: ccrt, ccrv, ccco, or hpvs (default: hpvs) |
--type |
string | No | Contract section to validate: workload, env, or '' for both (default: '') |
-h, --help |
- | No | Display help information |
Validate full contract (both sections):
contract-cli validate-contract --in contract.yaml --os ccrtValidate only the workload section:
contract-cli validate-contract --in contract.yaml --os ccrt --type workloadValidate only the env section:
contract-cli validate-contract --in contract.yaml --os ccrt --type envValidate CCRV contract:
contract-cli validate-contract --in contract.yaml --os ccrvValidate CCCO contract:
contract-cli validate-contract --in contract.yaml --os cccoUsing standard input:
cat contract.yaml | contract-cli validate-contract --in - --os ccrtValidate network-config YAML file against the schema. Validates network configuration for on-premise deployments, ensuring all required fields are present and properly formatted.
contract-cli validate-network [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to network-config YAML file (use '-' for standard input) |
-h, --help |
- | No | Display help information |
Validate network configuration:
contract-cli validate-network --in network-config.yamlUsing standard input:
cat network-config.yaml | contract-cli validate-network --in -Validates encryption certificate for on-premise, VPC deployment. It will check encryption certificate validity, ensuring all required fields are present and properly formatted.
contract-cli validate-encryption-certificate [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to encryption certificate file (use '-' for standard input) |
-h, --help |
- | No | Display help information |
Validate encryption certificate configuration:
contract-cli validate-encryption-certificate --in encryption-cert.crtUsing standard input:
cat encryption-cert.crt | contract-cli validate-encryption-certificate --in -Generate sealed secrets for IBM Confidential Computing Containers for Red Hat OpenShift Container Platform (CCCO).
contract-cli sealed-secret [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Secret for sealing (provide as string or file path, use '-' for standard input) |
--type |
string | Yes | Type of secret: env for env section of contract or workload for workload section of contract |
--out |
string | No | 1 or 3 comma-separated output file paths (see Output format below). Omit to print JSON to stdout. |
--encryptionkey |
string | No | Path to RSA private key for encryption (generates new key if not provided) |
--signingkey |
string | No | Path to RSA private key for signing (generates new key if not provided) |
-h, --help |
— | No | Display help information |
The --out flag accepts 1 or 3 comma-separated file paths.
The mapping is fixed and positional:
--out <sealed-secret-file>,<decryption-key-file>,<verification-key-file>
position 1 position 2 position 3
sealed value private key public key
⚠️ Order matters. Position 2 is always the private decryption key and position 3 is always the public verification key. Swapping them will cause runtime failures.
1-value form — only the sealed secret file name is given; key files fall back to
sealed_decryption.pem and sealed_verification.pem in the same directory:
| File | Key type | Contents |
|---|---|---|
<your-file> |
— | Sealed secret value for use in the contract |
sealed_decryption.pem |
Private key | RSA private key for decryption — keep secure |
sealed_verification.pem |
Public key | RSA public key for signature verification |
3-value form — all three names are given explicitly:
| Position | File | Key type | Contents |
|---|---|---|---|
| 1 | <sealed-secret-file> |
— | Sealed secret value for use in the contract |
| 2 | <decryption-key-file> |
Private key | RSA private key for decryption — keep secure |
| 3 | <verification-key-file> |
Public key | RSA public key for signature verification |
The terminal always confirms what was written and explicitly labels private vs public:
Sealed value written to: sealed_secret.txt
Decryption key written to: (private) sealed_decryption.pem
Verification key written to: (public) sealed_verification.pem
JSON stdout (when --out is omitted):
{
"sealed_secret": "<sealed-secret-value>",
"decryption_key": "<RSA-private-key-PEM-with-escaped-newlines>",
"verification_key": "<RSA-public-key-PEM-with-escaped-newlines>"
}| JSON field | Key type | Description |
|---|---|---|
sealed_secret |
— | Sealed secret value for use in the contract |
decryption_key |
Private key | RSA private key for decryption (PEM, \n-escaped) — keep secure |
verification_key |
Public key | RSA public key for signature verification (PEM, \n-escaped) |
Note: PEM newlines are replaced with the literal
\nsequence so the value fits on a single JSON string line. To restore the original PEM for use with OpenSSL:echo '<value>' | sed 's/\\n/\n/g'
1-value form — key files use default names:
contract-cli sealed-secret \
--in "value123" \
--type env \
--out sealed_secret.txt
# sealed_secret.txt ← sealed value
# sealed_decryption.pem ← private key (position 2 default)
# sealed_verification.pem ← public key (position 3 default)3-value form — all file names explicit:
contract-cli sealed-secret \
--in "value123" \
--type env \
--out sealed_secret.txt,my_decryption.pem,my_verification.pem
# sealed_secret.txt ← position 1 sealed value
# my_decryption.pem ← position 2 private key (keep secure)
# my_verification.pem ← position 3 public keyGenerate sealed secret for workload section:
contract-cli sealed-secret \
--in workload-secret-data \
--type workload \
--out sealed_workload.txt,sealed_decryption.pem,sealed_verification.pemGenerate sealed secret from file:
contract-cli sealed-secret \
--in secrets.txt \
--type env \
--out sealed_secret.txt,sealed_decryption.pem,sealed_verification.pemGenerate sealed secret with custom encryption and signing keys:
openssl genrsa -out encryption.pem 2048
openssl genrsa -out signing.pem 2048
contract-cli sealed-secret \
--in "value123" \
--type env \
--encryptionkey encryption.pem \
--signingkey signing.pem \
--out sealed_secret.txt,sealed_decryption.pem,sealed_verification.pemRead secret from stdin:
echo "value123" | contract-cli sealed-secret \
--in - \
--type envPrint all values as JSON to stdout (omit --out):
contract-cli sealed-secret \
--in "value123" \
--type envGenerate an OPA v1 Rego policy from a Kubernetes pod specification for use with IBM Confidential Computing Containers (CCCO). The generated policy enforces container image and command validation via the Kata Agent Policy engine.
Use --format to control what is written to stdout or to file:
--format |
stdout | with --out |
|---|---|---|
base64 (default) |
prints IBM CC base64 policy only | writes <stem>_base64 only |
text |
prints plain Rego policy only | writes <stem>.rego only |
both |
prints both | writes both files |
No separate base64 encoding step is required.
contract-cli rego-generator [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to Kubernetes resource YAML file (use - for standard input) |
--out |
string | No | Output stem used for file names (e.g. policy or policy.rego). Prints to stdout if not specified. |
--format |
string | No | Output format: base64 (default), text, or both |
-h, --help |
- | No | Display help information |
| Kind | Pod spec location |
|---|---|
Pod |
directly |
Deployment |
spec.template |
StatefulSet |
spec.template |
DaemonSet |
spec.template |
CronJob |
spec.jobTemplate.spec.template |
Files written when --out policy is specified (stem policy):
--format |
Files written |
|---|---|
base64 (default) |
policy_base64 |
text |
policy.rego |
both |
policy.rego + policy_base64 |
The policy_base64 value maps directly to confidential-containers.regoValidator.policy in the contract workload section.
Print only the base64 policy to stdout (default):
contract-cli rego-generator --in pod.yamlPrint only the plain Rego source to stdout:
contract-cli rego-generator --in pod.yaml --format textPrint both the plain Rego source and the base64 policy to stdout:
contract-cli rego-generator --in pod.yaml --format bothSave only the base64 policy to file (default):
# Creates policy_base64 only
contract-cli rego-generator --in pod.yaml --out policySave only the plain Rego source to file:
# Creates policy.rego only
contract-cli rego-generator --in pod.yaml --out policy --format textSave both files (Rego source + base64):
# Creates policy.rego and policy_base64
contract-cli rego-generator \
--in deployment.yaml \
--out policy \
--format bothGenerate policy from stdin:
cat pod.yaml | contract-cli rego-generator --in -End-to-end: generate policy and embed in contract workload section:
# Step 1 — generate the base64 policy file (default format)
contract-cli rego-generator \
--in pod.yaml \
--out policy
# Output:
# Successfully generated Rego policy (base64): policy_base64
# Step 2 — read the ready-to-use base64 value (no manual encoding needed)
POLICY_B64=$(cat policy_base64)
# Step 3 — use in contract workload YAML under confidential-containers.regoValidator.policy
cat <<EOF > workload.yaml
type: workload
confidential-containers:
regoValidator:
policy: ${POLICY_B64}
EOFOutput format: The command outputs a complete OPA v1 Rego policy including:
CreateContainerRequest— wiring rule that requires bothallow_imageandallow_command- OCP baseline
allow_image/allow_command— admits Kata pause/infra containers - Per-container
allow_image()rules — anchored regex per unique image - Per-container
allow_command()rules — strict (withcount(args)and per-index checks) for containers with explicitcommand/args, permissive (image-only) for ENTRYPOINT-only containers - Named script validator functions for multiline shell script arguments
Create initdata annotation from signed and encrypted contract for IBM Confidential Computing Containers for Red Hat OpenShift Container Platform. Supports both Peer Pod and Baremetal solutions.
contract-cli initdata [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to signed & encrypted contract YAML file (use '-' for standard input) |
--sehdr |
string | No | Path to SE header binary file (.bin) for baremetal solution |
--out |
string | No | Path to store gzipped & encoded initdata value |
-h, --help |
- | No | Display help information |
Create initdata for Peer Pod solution without SE header binary:
contract-cli initdata --in signed_encrypted_contract.yamlCreate initdata for Baremetal solution with SE header binary:
contract-cli initdata \
--in signed_encrypted_contract.yaml \
--sehdr se-header.bin \
--out initdata.txtSave output to file for peerpod solution without SE header binary:
contract-cli initdata \
--in signed_encrypted_contract.yaml \
--out initdata-annotation.txtSave output to file for baremetal solution with SE header binary:
contract-cli initdata \
--in signed_encrypted_contract.yaml \
--sehdr se-header.bin \
--out initdata-annotation.txtUsing standard input:
cat signed_encrypted_contract.yaml | contract-cli initdata --in -- With
--sehdr, the command generates initdata for baremetal solution - Without
--sehdr, the command generates initdata for Peer Pod solution - The SE header binary file is automatically encoded to base64 before being included in the initdata
- Output is gzipped and base64 encoded, ready to use as an initdata annotation
# Step 1: Generate key pair
openssl genrsa -out private.pem 4096
# Step 2: Download encryption certificate
contract-cli download-certificate --version 1.0.23 --out certs.json
contract-cli get-certificate --in certs.json --version 1.0.23 --out cert.crt
# Step 3: Create docker-compose archive
contract-cli base64-tgz --in ./compose-folder --output encrypted --cert cert.crt --out archive.txt
# Step 4: Create contract YAML (with archive from step 3)
cat > contract.yaml <<EOF
env: |
type: env
logging:
logRouter:
hostname: logs.example.com
workload: |
type: workload
compose:
archive: $(cat archive.txt)
EOF
# Step 5: Validate contract
contract-cli validate-contract --in contract.yaml --os hpvs
# Step 6: Generate signed and encrypted contract
contract-cli encrypt --in contract.yaml --priv private.pem --cert cert.crt --out final-contract.yaml# Decrypt attestation from running instance
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private.pem \
--out attestation.txt
# Decrypt and verify signature
contract-cli decrypt-attestation \
--in se-checksums.txt.enc \
--priv private.pem \
--signature se-signature.bin \
--attestation-cert hpse-attestation.crt \
--out attestation.txt
# View decrypted attestation
cat attestation.txt# Download all available certificates
contract-cli download-certificate --out all-certs.json
# Extract specific version
contract-cli get-certificate \
--in all-certs.json \
--version 1.0.23 \
--out cert-1.0.23.crtThe CLI supports stdin input (--in -) for all commands, making it easy to integrate into CI/CD pipelines.
name: Generate Contract
on:
push:
branches: [main]
jobs:
generate-contract:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download contract-cli
run: |
curl -sL https://github.com/ibm-hyper-protect/contract-cli/releases/latest/download/contract-cli-linux-amd64 -o contract-cli
chmod +x contract-cli
- name: Validate contract
run: ./contract-cli validate-contract --in contract.yaml --os hpvs
- name: Generate signed and encrypted contract
run: |
./contract-cli encrypt \
--in contract.yaml \
--priv "${{ secrets.PRIVATE_KEY_PATH }}" \
--out encrypted-contract.yaml
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: encrypted-contract
path: encrypted-contract.yaml#!/bin/bash
set -euo pipefail
# Validate → Encrypt → Deploy pattern
if ! contract-cli validate-contract --in contract.yaml --os hpvs; then
echo "Contract validation failed" >&2
exit 1
fi
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--out encrypted-contract.yaml
echo "Contract generated successfully"| Code | Meaning |
|---|---|
0 |
Success |
1 |
General error (invalid input, missing files, encryption failure, etc.) |
All error messages are written to stderr. Successful output is written to stdout (unless --out is specified).
Error:
Error: openssl binary not found in PATH
Solution:
- Install OpenSSL for your platform
- Or set
OPENSSL_BINenvironment variable to the full path of OpenSSL
Error:
Error: contract validation failed
Solution:
- Run
validate-contractto see specific schema errors - Check contract structure matches IBM Confidential Computing requirements
- Ensure all required fields are present
Error:
Error: certificate version not found
Solution:
- Run
download-certificatewithout--versionto see available versions - Verify the version number format (e.g.,
1.0.23)
Error:
Error: permission denied reading file
Solution:
- Check file permissions:
chmod 600 private.pem - Ensure you have read access to input files
- Verify output directory is writable
Symptom: Commits show Unverified badge on GitHub even after configuring SSH signing locally.
Cause: The SSH key is added to GitHub as an Authentication Key only. GitHub requires a separate Signing Key entry to verify commit signatures.
Solution:
- Copy your public key:
cat ~/.ssh/id_ed25519.pub-
Go to GitHub → Settings → SSH and GPG keys → New SSH key
-
Fill in:
- Title:
Mac Signing(or any name) - Key type:
Signing Key← must be Signing Key, not Authentication Key - Key: paste the output from step 1
- Title:
-
Click Add SSH key
GitHub will now show Verified on all commits signed with that key — no new push needed.
Note: You can have the same key added twice — once as Authentication Key (for push/pull) and once as Signing Key (for commit verification).
The samples/ directory contains working examples:
- Contract - Basic contract structure
- Contract with Expiry - Contract with expiration
- Attestation Records - Example attestation files
- Certificate Examples - Encryption certificate samples
- Network Configuration - Network config examples
- Docker Compose - Compose file examples
- Signed & Encrypted Contract - Signed & Encrypted contract
- Contract Signing - Contract signing examples
- Main README - Project overview and quick start
- Contributing Guide - How to contribute
- Security Policy - Security best practices
- Changelog - Release history and version notes
- Confidential computing with LinuxONE
- IBM Confidential Computing Container Runtime
- IBM Confidential Computing Container Runtime for Red Hat Virtualization Solutions
- IBM Confidential Computing Containers for Red Hat OpenShift
- contract-go - Go library
- terraform-provider-hpcr - Terraform provider
- k8s-operator-hpcr - Kubernetes operator
Need Help?
- Open an issue
- Ask a question
- Check the troubleshooting section above