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 Hyper Protect 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 (for encrypted output) |
--os |
string | No | Target Hyper Protect platform: hpvs, hpcr-rhvs, or hpcc-peerpod (default: hpvs) |
--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 hpcr-rhvsFor HPCC Peer Pods:
contract-cli base64-tgz \
--in ./pods-folder \
--output encrypted \
--os hpcc-peerpodSave to file:
contract-cli base64-tgz --in ./compose-folder --out archive.txtUsing standard input (pipe input):
echo "pods-folder" | contract-cli base64-tgz --in -Decrypt encrypted attestation records generated by Hyper Protect 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 Hyper Protect Repository. Retrieves the latest or specific versions of HPCR 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 if not specified) |
--os |
string | No | Target Hyper Protect platform: hpvs, hpcr-rhvs, or hpcc-peerpod (default: hpvs) |
--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 contract expiry:
contract-cli encrypt \
--contract-expiry \
--in contract.yaml \
--priv private.pem \
--cacert ca.crt \
--cakey ca.key \
--csr csr.pem \
--expiry 90For HPCR-RHVS:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--os hpcr-rhvsUsing password-protected private key:
contract-cli encrypt \
--in contract.yaml \
--priv private-encrypted.pem \
--password "your-secure-password" \
--out encrypted-contract.yamlFor HPCC Peer Pods:
contract-cli encrypt \
--in contract.yaml \
--priv private.pem \
--os hpcc-peerpodUsing 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 if not specified) |
--os |
string | No | Target Hyper Protect platform: hpvs, hpcr-rhvs, or hpcc-peerpod (default: hpvs) |
--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.txtUsing 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 -Extract 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 HPCR 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 HPCR 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 -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 Hyper Protect platform: hpvs, hpcr-rhvs, or hpcc-peerpod (default: hpvs) |
-h, --help |
- | No | Display help information |
Validate HPVS contract:
contract-cli validate-contract --in contract.yaml --os hpvsValidate HPCR-RHVS contract:
contract-cli validate-contract --in contract.yaml --os hpcr-rhvsValidate HPCC Peer Pods contract:
contract-cli validate-contract --in contract.yaml --os hpcc-peerpodUsing standard input:
cat contract.yaml | contract-cli validate-contract --in - --os hpvsValidate 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 -Create initdata annotation from signed and encrypted contract for IBM Confidential Computing Containers for Red Hat OpenShift Container Platform (Peer Pod) solution.
contract-cli initdata [flags]| Flag | Type | Required | Description |
|---|---|---|---|
--in |
string | Yes | Path to signed & encrypted contract YAML file (use '-' for standard input) |
--out |
string | No | Path to store gzipped & encoded initdata value |
-h, --help |
- | No | Display help information |
Create initdata from signed & encrypted contract:
contract-cli initdata --in signed_encrypted_contract.yamlUsing standard input:
cat signed_encrypted_contract.yaml | contract-cli initdata --in -# 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
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 HPCC 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