1.0 Introduction
This article describes the steps to create an application image in the Fortanix Confidential Computing Manager (CCM). The users are provided the ability to quickly and easily navigate the interface to run containerized applications accordingly.
A Fortanix CCM image is a particular software release or a version of an application. Each image is associated with one enclave hash (MRENCLAVE).
When an image is first created in Fortanix CCM, it is unapproved. After configurable approval actions are taken, the image is considered approved. When an image is approved, Fortanix CCM knows that enclaves with the associated hash (MRENCLAVE) are trusted instances of the corresponding application, and will issue certs with the application’s domain name(s) to those enclaves.
2.0 Prerequisites
Ensure the following:
For Enclave OS applications - the Tag of the Docker image for the application.
For EDP applications - the
sigstruct.binfile is used to register the enclave with Fortanix CCM.For ACI applications - the Tag of the Docker image for the application.
For Azure Confidential Virtual Machines - a Confidential VM (CVM) is created in Azure, and the Fortanix attestation agent runs on it.
3.0 Create an Image for Enclave OS Applications
Before creating the image, ensure that you have created an Enclave OS application as mentioned in Add and Edit an Application.
Perform the following steps to create an image for the Enclave OS application:
Navigate to the Applications menu item in the CCM UI left navigation panel and select the required Enclave OS application for which you want to configure an application image.
On the following page, click the + ADD IMAGE button to configure the image of the Enclave OS application.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 1: Image tab
In the Image form, do the following:
In the Image Type section, the AWS Nitro Enclaves is selected by default.
In the Input image name section, add the required tag name.
In the Output image name section, add the required tag name and enter the REGISTRY CREDENTIALS. Here, the registry credentials are the credentials needed to access the private Docker registry where the image will be pushed. Since the input image is stored in a public registry, there is no need to provide credentials for the input image.
If you have added a registry in a particular account as described in Image Registry, then Use same credential as input image registry check box will be selected by default and the registry names for the output image will be filled automatically in the Add Registry Credentials fields.
If you have not saved any Registry Credentials, then manually enter the registry credentials for the Output image name.
In the Enclave Parameters section,
Memory size - Select the memory size from the drop-down to change the memory size of the Nitro.
CPU count - CPU count is the number of CPUs dedicated to an enclave out of all the CPUs available to the host machine.
NOTE
The Memory size and CPU count can be overridden at runtime with the following environment variables:
MEM_SIZECPU_COUNT
File persistence – This check box is selected by default. This feature allows you to save the filesystem changes to an encrypted container mount. It allows the Nitro system to access a managed Security-object in Fortanix DSM to be able to encrypt and decrypt the Linux Unified Key Setup (LUKS) overlay file system. For more information, refer to AWS Nitro File Persistence.
NOTE
For the File Persistence feature to work, you must configure the app certificate since when a Nitro image runs, it must be configured ahead of time to receive a certificate, which will authorize access to Fortanix DSM to obtain the keys for the Linux Unified Key Setup (LUKS) volume. Without the app certificate, this feature will not work.
Click SAVE to create the image.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 2: Add image
An image approval task is created and added which is visible on the Tasks page. You can approve the task to approve the application image.
For more information on how to approve the application image tasks for the Enclave OS application, refer to Domain and Application Image Approval.
After it is approved, a green tick will appear in the Approval status column for that image.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 3: Image created and approved
NOTE
The Source Image tag and Output Image tag are optional fields and by default, the tag value is “latest” internally. If the user is entering a different tag value, then it can either be different values or the same. Once an image of an application is created, it will be pushed to the specified location in the Output Image Name of the application.
4.0 Create an Image for EDP Applications
Ensure that you have created an EDP application as mentioned in Add and Edit an Application.
Perform the following steps to create an image for the EDP application:
Navigate to the Applications menu item in the CCM UI left navigation panel and select the required EDP application for which you want to configure an application image.
On the following page, click the + ADD IMAGE button to configure the image of the EDP application.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 4: Images tab
In the Add image form, fill in the following details:
Image Version: Enter the version of the image.
Image Type: Select Intel SGX or AWS Nitro Enclaves as the platform.
If you select the Image Type as Intel SGX, you have to add the Sigstruct details. The SIGSTRUCT for an enclave is generated when an application is signed. It is used to register the enclave with Fortanix Confidential Computing Manager.Enclave Configuration SIGSTRUCT: Three options are available to add SIGSTRUCT:
Upload Enclave SIGSTRUCT: To upload an enclave
sigstruct.binfile, click the UPLOAD button as shown in Figure 6. Here is a sample sigstruct.bin file.
ORPaste Base64-encoded Enclave SIGSTRUCT: You can also paste a Base64-encoded SIGSTRUCT binary in the text box provided.
OREnter Enclave SIGSTRUCT Parameters: Enter the following parameters:
⁃ MRENCLAVE: This is the identity or hash of the enclave.
⁃ MRSIGNER: This is the identity of the signer of the enclave.
⁃ ISVPRODID: This is the numeric product identifier to be assigned to the enclave. Choose a unique value in the range 0-65535 for each application.
⁃ ISVSVN: This is the numeric security version to be assigned to the enclave. Increment this value when a security-relevant change is made to the application.NOTE
The Enclave SIGSTRUCT Parameters section is automatically filled when you either upload a
sigstruct.binfile or paste a base64 encoded enclave SIGSTRUCT.
If you select the Image Type as AWS Nitro Enclaves, you have to add the Enclave Configuration JSON details which are unique enclave measurements that include a series of Hashes and Platform. The JSON measurements for an enclave are generated when an application is signed. It is used to register the enclave with Fortanix Confidential Computing Manager.
Enclave Configuration JSON: Three options are available to add measurements:
Upload Measurement JSON: To upload an enclave
measurement.jsonfile, click the UPLOAD button as shown in Figure 7.
ORPaste Measurement JSON: You can also paste the JSON enclave measurements in the text box provided.
OREnter Measurement: Enter the following parameters:
⁃ PCR0: This is the hash of the enclave image file.
⁃ PCR1: This is the hash of the Linux kernel and bootstrap.
⁃ PCR2: This is the Hash of the user application.NOTE
The Enter Measurement section is automatically filled when you either upload a
measurement.jsonfile or paste the JSON enclave measurements.

Figure 5: Create an EDP application image for Intel SGX platform

Figure 6: Create an EDP application Image for AWS Nitro platform
Click CREATE to create the EDP application image.
An image approval task is created and added, which is visible on the Tasks page. You can approve the task to approve the image.
For more information on how to approve the application image tasks for the EDP application, refer to Domain and Application Image Approval.After the image is approved, a green tick will appear in the Approval status column for that image.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 7: Image created and approved
5.0 Create Image for ACI Application
Ensure that you have created an ACI application as mentioned in Add and Edit an Application.
Perform the following steps to create an image for ACI application:
Navigate to the Applications menu item from the CCM UI left navigation panel and select the required ACI application for which you want to configure an application image.
On the following page, click the + ADD IMAGE button to configure the image of the ACI application.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 8: Image tab
On the Add image form, fill in the following details:
Tag: Enter the tag value of the docker image.
WARNING
If an image of an existing ACI application already has the same tag value as the current ACI application image, then it will give an error. Use a new tag value.
Add Registry Credentials: Enter the REGISTRY CREDENTIALS for the Input image name. Here, the registry credentials are the credentials needed to access the private docker registry where the image will be pulled. Since the input image is stored in a public registry, there is no need to provide credentials for the input image.
NOTE
If a registry credential is given, then the image name must have a domain. For example, if the image is from Docker Hub, then the domain prefix is not required. However, if a registry credential is given, then the image name must start with `docker.io/` or similar.
If you have added a registry in a particular account as described in the article Image Registry of Fortanix CCM, then the check box Use saved credentials will be selected by default.

Figure 9: Add saved registry credentials
Advanced Settings: It is recommended to always select the Wait for node registration to begin check box unless the application has special requirements. Selecting this checkbox does not allow the execution before the Fortanix ACI node agent has retrieved the signed app certificate from the Fortanix CCM backend cluster.
CPU Count: Enter the number of CPU cores. By default, the value is 1.
Memory in GB: Enter the amount of required RAM in GB units. By default, the value is 1.
Click the GENERATE SECURE POLICY button to initiate the build of the JSON Fortifier template, which is used to deploy the confidential ACI container group.
NOTE
The creation of an application image may take up to a few minutes.
An image approval task is created and added, which is visible on the Tasks page. You can approve the task to approve the image.
For more information on how to approve the application image tasks for the ACI application, refer to Domain and Application Image Approval.After the image is approved, a green tick will appear in the Approval status column for that image.

Figure 10: Image created and approved
6.0 Deploy the ACI Application Using Azure Portal
Perform the following steps to deploy the application image to Fortanix ACI either through the Azure Portal or with the Azure CLI:
Navigate to the Applications → Image menu item and select the required image from the list.
Click the POLICY tab to view the JSON Azure Resource Manager (ARM) template encoding of the security policy generated earlier in Section 5.0: Create an Image for ACI Application.

Figure 11: JSON ARM template
Click the DOWNLOAD button to save the ARM template for the deployment procedure.
For more information on how to deploy an ACI application, refer to the User's Guide: Deploying ACI Using Azure Portal.
7.0 Create an Image for Azure CVM Applications
Before creating the image, ensure that you have collected the required Platform Configuration Register (PCR) values from the Azure Confidential VM (CVM) environment.
For more information on deploying a CVM on Azure and obtaining PCR values for creating the application image, refer to the following guides:
Fortanix CCM Azure Confidential VM Attestation Setup Guide – Linux - https://support.fortanix.com/docs/azure-confidential-vm-setup-linux
Fortanix CCM Azure Confidential VM Attestation Setup Guide – Windows - https://support.fortanix.com/docs/azure-confidential-vm-setup-windows
Perform the following steps to create an image:
After you create an Azure CVM application, click the Applications menu item in the CCM UI left navigation panel and select the required Azure CVM application for which you want to configure an application image.
On the following page, click + ADD IMAGE to configure the image of the Azure CVM application.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 12: Image tab
On the Add Image form, fill in the following details:
Image Version: Enter a version identifier for the image in the format <image-version>.
Platform Configuration Register (PCR): Enter one or more PCR values collected from the Azure CVM. These values are verified during attestation to validate the integrity of the workload. You can enter values from PCR0 to PCR22 in 64-character hex string format only, depending on your security requirements.
NOTE
When entering PCR values copied from the VM console, remove the “0X” prefix from each value, if any.
No two application images in Fortanix CCM can use the exact same combination of PCR values. However, you can create multiple images as long as their PCR combinations differ.
For example:
Image 1: [pcr0 –
abc]Image 2: [pcr0 –
def]OR
Image 1: [pcr0 -
abc]Image 2: [pcr0 -
abc, pcr1 -xyz]
Coprocessers: Select an option to configure the NVIDIA Graphics Processing Unit (GPU) attestation setting:
Ignored: The VM must have a GPU, and the attestation agent collects GPU attestation data, but Fortanix CCM does not validate this attestation, it only checks that GPU attestation data is present. The actual attestation result is ignored during verification.
Required: The VM must have a GPU, and the attestation agent collects GPU attestation data, and Fortanix CCM validates this data using NVIDIA Remote Attestation Service (NRAS).
Disabled: The VM is not expected to have a GPU, and the attestation agent does not collect any GPU attestation data.
NOTE
For Fortanix CCM 4.6, only the “Disabled” option is supported, as NVIDIA attestation is not enabled in the agent.
Click CREATE to create the image.
An image approval task is created and added, which is visible on the Tasks page. You can approve the task to approve the image.
For more information on how to approve the application image tasks for the Azure CVM application, refer to Domain and Application Image Approval.
After the image is approved, a green tick will appear in the Approval status column for that image.
.png?sv=2022-11-02&spr=https&st=2025-12-13T15%3A21%3A52Z&se=2025-12-13T15%3A45%3A52Z&sr=c&sp=r&sig=pg%2B6DTIzNgN1%2FAF2s8cWMYzDjYSPjJbniuFtRdJWfxs%3D)
Figure 13: Image created and approved
7.1 How PCR Values Influence Image Attestation
During Azure CVM attestation, images are validated against their configured PCR values. When multiple images are enrolled, the attestation service evaluates PCRs in priority order to determine which image should be attested. The examples below illustrate how different PCR configurations affect this selection.
If you do not provide any PCR values for an image, the attestation will still succeed for this image only if there is no matching image determined by the PCR priority.
Example:
Image 1 = [pcr0 – not set]
Image 2 = [pcr1 -
xxx]Azure CVM = pcr0 -
aaa, pcr1 -bbb
In this case, Image 1 will be attested.
If multiple images are enrolled and at least one image has valid PCR values, the image without PCR values will not be considered.
Example:
Image 1 = [pcr0 – not set, pcr1 -
bbb]Image 2 = [pcr0 -
aaa, pcr1 –bbb]Azure CVM = pcr0 -
aaa, pcr1 -bbb
In this case, Image 2 will be attested.
The images with valid PCR values will be evaluated for attestation based on their priority order.
Example:
Image 1 = [pcr0 -
aaa, pcr1 -bbb]Image 2 = [pcr3 -
ddd, pcr4 -eee]Image 3 = [pcr7 -
hhh, pcr9 -jjj]Image 4 = [pcr9 -
jjj, pcr10 -lll, pcr11 -mmm]The Azure CVM = pcr0 -
aaa, pcr1 -bbb, pcr2 -ccc, pcr3 -ddd, pcr4 -eee, pcr5 -fff, pcr6 -ggg, pcr7 -hhh, pcr8 -iii, pcr9 -jjj, pcr10 -lll, pcr11 -mmm
In this case, Image 1 will be attested because pcr0 and pcr1 have the highest priority.
The order in which the images were created does not affect the attestation decision.
If two images are enrolled - one without PCR values set and another that is not approved in Fortanix CCM, the attestation process will evaluate the available PCR values based on their priority order.
Example:
Image 1 = [pcr0 – not set, pcr1 -
bbb]Image 2 (unapproved) = [pcr0 -
aaa, pcr1 -bbb]Azure CVM = pcr0 -
aaa, pcr1 –bbb
In this case, Image 2 will be selected for attestation because it has PCR values of highest priority defined. However, the attestation will fail since Image 2 is not an approved build. To resolve this, either approve image 2 or delete it.
If two images are enrolled - one without PCR values set and another whose PCR values do not fully match the Azure CVM, the attestation process will evaluate the available PCR values based on their priority order.
Example:
Image 1 = [pcr0 – not set, pcr1 -
bbb]Image 2 = [pcr0 -
aaa, pcr2 -ccc]Azure CVM = pcr0 -
aaa, pcr1 –bbb
In this case, Image 2 will be selected for attestation because its highest-priority matching PCR (pcr0) aligns with the Azure CVM. However, the attestation will fail because the remaining PCRs do not match the Azure CVM PCR values. To resolve this, either delete Image 2, or create and approve Image 3, which is a copy of Image 1 but with pcr0 set so that it has a higher priority than Image 2.
Image 3 = [pcr0 -
aaa, pcr1 -bbb]
If all PCR values are invalid for an image (for example, set to all zeros), the attestation certificate is not generated. To determine the reason for the failure, you must check the agent logs. When run with
RUST_LOG=debug, the log will display the message‘Build with matching PCRs not found’.