Chapter 3. Automatically provisioning and onboarding RHEL for Edge devices with FDO client and server


You can use the go-fdo-client and go-fdo-server RPMs to deploy a Go-based implementation of the FIDO Device Onboarding (FDO) client and server. This FIDO Device Onboarding protocol version enables secure, automated, zero-touch provisioning of edge devices.

Important

These Go-based implementations are not compatible with the original FDO RPMs and container images that remain in Technology Preview. Do not use the go-fdo-* packages alongside the fdo-* packages or containers.

3.1. The FDO trust model process overview

FIDO Device Onboarding (FDO) automatically and securely integrates new devices into your Internet of Things (IoT) infrastructure. FDO verifies device authenticity, protects the configuration process, and synchronizes each device with your existing infrastructure upon installation.

FDO provides the following capabilities:

  • A zero-touch procedure for onboarding a new device to the owner’s management platform at scale.
  • Cryptographic verification of the device’s authenticity and ownership before the exchange of sensitive information.
  • Tool for device provisioning across untrusted networks by using a securely encrypted communications channel.
  • Application of ownership credentials and configuration during device onboarding rather than at device manufacture (late binding).

FDO is a two-phase process:

  1. Device initialization: The device manufacturer performs the first phase. During this phase, the manufacturer configure the device to perform onboarding after purchase. On completion of this phase:

    • The device stores a set of credentials to prove its identity.
    • The manufacturer creates an ownership voucher, which is a digital document that proves the ownership chain of the device.
    • The device receives a globally unique identifier (GUID).
  2. Transfer of ownership: The second phase occurs after the device is purchased. During this phase, the device is onboarded to the new owner’s infrastructure.

3.2. Components of the FDO system

FIDO Device Onboarding (FDO) onboarding employs a device-side client application and three specialized FDO servers: Manufacturing, Rendezvous, and Owner.

Device client

This application is installed on the device and performs the following operations:

  • During device manufacture, the client application initializes the device’s FDO state with the help of the Manufacturing server.
  • When the final owner installs the device, the client application performs the onboarding process in concert with the Rendezvous and Owner FDO servers.
Manufacturing server
Deployed at the device manufacturer’s site, this server is responsible for the FDO Device Initialization protocol, which prepares the device for the FDO onboarding process and creates the Ownership Voucher. The device client initiates device initialization. Once device initialization completes, the Manufacturing server has no further involvement with the onboarding process.
Rendezvous server
To enable late binding of device ownership, which is required when the device’s ownership is unknown during manufacturing, the device requires a discovery service at the start of onboarding to securely identify its owner. The Rendezvous server provides this discovery service. The device client contacts the Rendezvous server at the start of the onboarding process to retrieve the network addresses for the Owner server.
Owner server
The device owner’s organization deploys the Owner server. It is responsible for integrating the new device into the owner’s IoT infrastructure. When the device is installed and first booted at the owner’s facility, the device client connects to the Owner server and initiates the final phase of onboarding. The FDO onboarding process completes once the Owner server finishes provisioning the device for use.

3.3. The FDO workflow

The FDO workflow consists of two primary stages that move a device from manufacturing to a fully configured, operational state.

  1. Device initialization (FDO DI protocol)

    1. The device client contacts the manufacturer server.
    2. The client and server generate credentials, which are stored on the device by the client.
    3. The manufacturer server produces the ownership voucher containing the network address of the rendezvous server, or Owner server in the case of rendezvous (RV) bypass.
    4. The manufacturer server assigns a globally unique identifier (GUID) to the device.
    5. Device initialization completes, and the device is ready for onboarding at the owner’s facility.
  2. On-site onboarding (FDO protocols TO0, TO1, TO2)

    1. Before the first boot of the device, the server administrator uploads the ownership voucher to the Owner server.
    2. The upload causes the Owner server to extract the rendezvous server’s network address from the ownership voucher.
    3. The Owner server contacts the rendezvous server and, by using the ownership voucher, proves it is the legitimate owner of the corresponding device.
    4. The Owner server provides the rendezvous server with its network addresses so that the device client can contact the Owner server.
    5. The rendezvous server stores the Owner server information for eventual use by the device client.
    6. On first boot, the device client retrieves the rendezvous server network address from its on-board device credentials and contacts the rendezvous server.
    7. The rendezvous server looks up the device’s ownership voucher and associated owner network addresses and returns them to the device client.
    8. The device client disconnects from the rendezvous server and attempts to connect to the Owner server by using the supplied network addresses.
    9. The device client and Owner server establish mutual trust by authenticating each other by using information from the ownership voucher and device credentials.
    10. The device client and Owner server establish a securely encrypted communications channel.
    11. The Owner server provisions the device over the secure channel by exchanging ServiceInfo key-value data.
    12. The device client uses the ServiceInfo data to implement the desired device configuration.
    13. On completion of the configuration process, the device is operational, and the FDO workflow ends.

3.4. Cryptographic credentials for FDO

To use the FIDO Device Onboarding (FDO) process, you must provide cryptographic credentials, such as certificates and private keys, to meet its security guarantees. The party deploying FDO must provide these certificates; the FDO packages do not provide them.

The FDO protocol operation requires the following certificates and private keys:

Manufacturer certificate and key
Issued by the manufacturer. The manufacturer server uses it only during device initialization and does not share it.
Owner certificate and key
Issued by the owner organization. The Owner server requires the private key, and the public certificate is provided to the manufacturer server to use when extending the ownership voucher.
Device CA certificate and key
Issued by the manufacturer to certify that the device is legitimate. The manufacturer server uses the certificate and private key during device initialization, and the certificate is provided to the Owner server for verifying the device’s identity.
TLS certificates
All FDO servers support network access by using HTTP. You can configure servers to enable HTTPS for security purposes. If you enable HTTPS, you must provide additional certificates for server authentication. These certificates are separate from the certificates required by FDO. For more information, see the server configuration documentation.
Database support
All FDO servers require a database to persist state across restarts. You can configure the FDO servers to use either SQLite or PostgreSQL as the database implementation. For more information about FDO server database configuration, see the server configuration documentation.

Generate self-signed test certificates by using the go-fdo-server utility script. This utility is intended for development and testing environments where the Manufacturer, Rendezvous, and Owner servers all reside on the same physical or virtual host.

Warning

These certificates are suitable for testing and demonstration purposes only. They use a shared directory structure that is not suitable for production or distributed environments.

Prerequisites

  • RHEL 10 Linux system in image mode (bootc)
  • go-fdo-server RPMs installed locally: The certificate generation script is a component of the server package
  • Network connectivity between the device and FDO servers

Procedure

  • Generate all the required keys and certificate files:

    $ sudo /usr/libexec/go-fdo-server/generate-go-fdo-server-certs.sh

    This script writes the generated keys and certificate files into the /etc/pki/go-fdo-server/ directory and sets the appropriate permissions in the following files:

  • manufacturer-example.key:: The manufacturer private key file.
  • manufacturer-example.crt:: The manufacturer public certificate file.
  • owner-example.key: The owner private key file.
  • owner-example.crt: The owner public certificate file.
  • device-ca-example.key: The device CA private key file.
  • device-ca-example.crt: The device CA public certificate file.

Next steps

  • Add the required keys and certificate files to the server configurations.

3.6. Installing the FDO Manufacturing server

Install the go-fdo-server-manufacturer RPM package to deploy the Manufacturing server. This service is responsible for performing device initialization and issuing the initial Device Credential.

Prerequisites

  • A registered RHEL 10 system
  • Subscriptions or repositories enabled that include the FDO server packages

Procedure

  1. Install the Manufacturing server package:

    $ sudo dnf install go-fdo-server-manufacturer
  2. Verify that the Manufacturing server’s systemd unit file and the default configuration directories were created:

    $ sudo systemctl list-unit-files | grep go-fdo-server-manufacturer
    go-fdo-server-manufacturer.service disabled disabled
  3. Configure certificates by moving the test certificates generated in the previous section to the manufacturer’s configuration path.
  4. After configuration, enable and start the service:

    $ systemctl enable --now go-fdo-server-manufacturer

3.7. Configuring the FDO Manufacturing server

Configure the FIDO Device Onboard (FDO) Manufacturing server by modifying the YAML-formatted initialization file and setting the required file permissions. This process ensures the server has the necessary operational parameters and security controls to generate and sign device credentials.

Prerequisites

  • You have installed the FDO Manufacturing server RPM packages.
  • You have obtained the required certificates and keys from your issuing organization.
  • You have administrative (sudo) access to the server.

Procedure

  1. Install the required credentials by moving all certificates and keys provided by your organization into the /etc/pki/go-fdo-server/ directory.
  2. Secure the certificate and key files. Restricted permissions are required to protect the integrity of the credentials. Set the ownership and permissions for the private keys so they are accessible only by the go-fdo-server-manufacturer user:

    $ sudo chown go-fdo-server-manufacturer:go-fdo-server /etc/pki/go-fdo-server/device-ca.key /etc/pki/go-fdo-server/manufacturer.key
    $ sudo chmod 600 /etc/pki/go-fdo-server/device-ca.key /etc/pki/go-fdo-server/manufacturer.key
  3. Modify the /etc/go-fdo-server/manufacturing.yaml configuration file to define your operational parameters.

    Note

    Access to this file is restricted to the go-fdo-server group by default.

  4. Define the server parameters. Ensure the following items are correctly mapped in your YAML file:

    Database (db)
    The path to the server’s database.
    Networking (http)
    The server’s HTTP endpoint IP and port.
    Manufacturer Key
    The path to the manufacturer’s private key.
    Device CA
    The paths to the Device CA certificate and private key.
    Owner Certificate

    The path to the Owner server’s public certificate.

    Example manufacturing.yaml configuration

    log:
      level: info
    db:
      type: sqlite
      dsn: file:/var/lib/go-fdo-server-manufacturer/db.sqlite
    http:
      ip: 0.0.0.0
      port: "8038"
    manufacturing:
      key: /etc/pki/go-fdo-server/manufacturer.key
      device_ca:
        cert: /etc/pki/go-fdo-server/device-ca.crt
        key: /etc/pki/go-fdo-server/device-ca.key
    owner:
      cert: /etc/pki/go-fdo-server/owner.crt

3.8. Running the FDO Manufacturing server

The FIDO Device Onboarding (FDO) Manufacturing server provides an HTTP interface for administrative tasks and device communication. Network accessibility is mandatory to process initialization requests, manage device credentials, and facilitate the Device Initialization (DI) protocol.

Prerequisites

  • The go-fdo-server-manufacturer RPM package is installed.
  • Test certificates are generated and stored in the /etc/pki/go-fdo-server/ directory.
  • The server configuration file is updated with valid paths and port settings.
  • You have root privileges.

Procedure

  1. Open the Manufacturer server’s default port in the firewalld service:

    $ sudo firewall-cmd --add-port=8038/tcp --permanent
    Note

    If you customized the http.port parameter in your configuration file, use that port number instead of the default.

    If you change the default port, you must relabel the new port in SELinux to enable the go-fdo-server service to bind to it. Failure to do so might cause the service to fail to start or be blocked by security policies.

    To enable traffic on a custom port, such as port 8040, run the following command to install the policycoreutils-python-utils package to use the semanage command.

    $ sudo semanage port -a -t fdo_port_t -p tcp 8040
  2. Reload the firewall to apply the changes:

    $ sudo firewall-cmd --reload
  3. Enable and start the manufacturer server by using the systemd system and service manager:

    $ sudo systemctl enable --now go-fdo-server-manufacturer.service

    This ensures the server starts automatically upon system reboot.

  4. Verify the manufacturer server status:

    $ systemctl status go-fdo-server-manufacturer.service
    ● go-fdo-server-manufacturer.service - Go FDO manufacturer server
         Loaded: loaded (/usr/lib/systemd/system/go-fdo-server-manufacturer.service; enabled; preset: disabled)
         Active: active (running) since Fri 2026-03-20 16:15:47 EDT; 38s ago
    ...
  5. Optional: Verify that the server’s network endpoint is functioning and accessible by probing the serve’s /health API endpoint:

    $ curl http://<ip-address>:8038/health
    {"message":"the service is up and running","status":"OK","version":"1.0.0"}

    To validate that your firewalld configuration is correct, perform this check from a different computer on the network. Local requests typically bypass firewall filtering rules.

Check the HTTPS and database parameters required to secure network traffic and ensure reliable data persistence. Use these settings to harden your environment and maintain a stable connection between the application and your data layer.

3.9.1. HTTPS requirements

To enable HTTPS, you must provide paths for both the certificate and the private key. Providing only one will result in a connection error.

http.cert
Path to the server certificate.
http.key
Path to the certificate’s private key.

3.9.2. Database connection (db.dsn)

The syntax for the Data Source Name (db.dsn) depends entirely on the db.type you select:

Expand
Database type (db.type)Connection string syntax (db.dsn)

SQLite

file:_<database_file>_.db

PostgreSQL

host=<hostname> port=<port_number> user=<username> password=<password> dbname=<database_name>

3.10. Installing the FDO Rendezvous server

Install the go-fdo-server-rendezvous RPM package to deploy the Rendezvous server. This server acts as the directory that redirects devices to their assigned Owner server during onboarding.

Prerequisites

  • You have a registered bootc Red Hat Enterprise Linux (RHEL) 10 system.
  • You have sudo privileges.
  • You have access to the repositories containing the FDO server packages.

Procedure

  1. Install the Rendezvous server package:

    $ sudo dnf install go-fdo-server-rendezvous

    The package installs several files, creates the go-fdo-server group and go-fdo-server-rendezvous user, and installs a systemd service for running the Rendezvous server.

3.11. Running the FDO Rendezvous server

The Rendezvous server acts as the central directory during the onboarding process. Its HTTP endpoint must be accessible by the device, the Owner server, and for administrative management.

Prerequisites

  • You have installed the go-fdo-server-rendezvous RPM locally.
  • You have configured the rendezvous-server.conf.d file, specifically the http.port (default is 8041).
  • You have administrative access.

Procedure

  1. Open the server’s HTTP port in the firewalld service:

    $ sudo firewall-cmd --add-port=8041/tcp --permanent
    $ sudo firewall-cmd --reload
  2. Enable and start the Rendezvous server by using the systemd service:

    $ sudo systemctl enable --now go-fdo-server-rendezvous.service
  3. Verify the server status:

    $ sudo systemctl status go-fdo-server-rendezvous.service
    ● go-fdo-server-rendezvous.service - Go FDO Rendezvous server
         Loaded: loaded (/usr/lib/systemd/system/go-fdo-server-rendezvous.service; enabled; preset: disabled)
         Active: active (running) since Fri 2026-03-20 17:21:34 EDT; 16h ago
  4. Optional: Verify that the server’s network endpoint is functioning and accessible:

    $ curl http://192.168.124.132:8041/health

    Example output

    {"message":"the service is up and running","status":"OK","version":"1.0.0"}

    To validate that your firewalld configuration is correct, perform this check from a different computer on the network. Local requests typically bypass firewall filtering rules.

    Expand
    ParameterDescription

    log.level

    The logging level. Allowed values: debug, info (default), warn, and error.

    db.type

    The database type. Allowed values: sqlite and postgres.

    db.dsn

    The database connection string (for example, file:database.db for SQLite, or host=localhost port=5432 user=postgres password=secret dbname=mydb for PostgreSQL).

    http.ip

    The HTTP server IP address or hostname.

    http.port

    The HTTP server port (string).

    http.cert

    Optional: The path to the certificate file to use for server authentication.

    http.key

    Optional: The path to the private key file of the cert certificate.

3.12. Advanced Rendezvous configuration (TO0)

For most deployments, the default Rendezvous settings are sufficient. To manage server load and device check-in frequency, tune the Transfer of Ownership Protocol 0 (TO0) wait intervals.

The following table describes the TO0 wait interval parameters.

Expand
ParameterDescription

rendezvous.to0_min_wait

Optional: The minimum wait time, in seconds, that a device must wait between TO0 requests. If a device attempts to check in more frequently than this value, the request fails. Default: 0 (no minimum wait).

rendezvous.to0_max_wait

Optional: The maximum wait time, in seconds, allowed for a TO0 entry. This defines the upper boundary for the device’s check-in interval. Default: 3600 (1 hour).

3.13. Installing the FDO Owner server

Install the go-fdo-server-owner RPM package to deploy the Owner server for performing device onboarding.

Procedure

  1. Install the go-fdo-server-owner package:

    $ sudo dnf install go-fdo-server-owner

    The package installs several files, creates the go-fdo-server group and go-fdo-server-owner user, and installs a systemd service for running the Owner server.

  2. Verify that the Owner server’s systemd unit file is available:

    $ sudo systemctl list-unit-files | grep go-fdo-server-owner
    go-fdo-server-owner.service disabled

3.14. Configuring the FDO Owner server

To configure the FDO Owner server, modify the YAML-formatted configuration file and ensure that the server has access to the necessary certificates and keys. The server reads this file during initialization to establish database connections, network endpoints, and security credentials.

Prerequisites

  • You have installed the go-fdo-server-owner RPM package.
  • You have obtained the required FDO certificates and keys from your issuing organization.
  • You have installed the certificates and keys into the /etc/pki/go-fdo-server directory.

Procedure

  1. Open the /etc/go-fdo-server/owner.yaml configuration file in a text editor.
  2. Provide values for the following mandatory configuration items:

    • Database configuration: The connection details for the server’s database.
    • HTTP endpoint address: The address where the server listens for requests.
    • Device CA certificate path: The path to the Device CA certificate file.
    • Owner server public certificate path: The path to the Owner server’s public certificate file.
    • Owner server private key path: The path to the Owner server’s private key file.
  3. Optional: Add a list of FDO ServiceInfo Modules (FSIM) to the configuration if you require specific device provisioning during onboarding.
  4. Save the changes and close the file.
  5. Set the ownership on the owner.key file to the go-fdo-server-owner user and the go-fdo-server group:

    $ sudo chown go-fdo-server-owner:go-fdo-server /etc/pki/go-fdo-server/owner.key
  6. Set the permissions on the owner.key file to restrict access:

    $ sudo chmod 600 /etc/pki/go-fdo-server/owner.key

3.15. FDO ServiceInfo Modules (FSIMs)

FDO ServiceInfo Modules (FSIMs) enable automated device provisioning during the TO2 protocol exchange. FSIMs deliver credentials, configurations, and scripts to change devices from a factory-default state to a fully operational, managed asset within the owner’s infrastructure.

With FIDO Device Onboard (FDO), you can perform administrative operations from the Owner server by using FDO ServiceInfo Modules (FSIMs). For example, you can use FSIMs to download files to the device, upload files from the device, and run commands on the device.

The following FSIMs are available to the Owner server:

  • fdo.download: Download files to the device’s file system.
  • fdo.upload: Upload files from the device’s file system.
  • fdo.wget: Download files from an HTTP server to the device’s file system.
  • fdo.command: Run commands on the device.

The go-fdo-client must have the necessary privileges to perform these functions on behalf of the Owner server. For example, when downloading files to the device’s file system, the device client must have permission to create and write the file to the destination directory.

FSIMs run during onboarding after the device client and Owner server establish mutual trust, and the secure communications channel is active. This ensures that FSIM operations can perform privileged actions on the device securely.

To use FSIMs, you must specify them in the Owner server’s configuration file. The configuration file supports an ordered list of FSIM configuration entries. The server performs FSIMs in the listed order during onboarding.

The fdo.download FSIM
The fdo.download FSIM downloads a file from the Owner server’s file system to the device’s file system. The Owner server downloads the file over the secure communications channel, guaranteeing that sensitive content is protected.
The fdo.upload FSIM
The fdo.upload FSIM uploads a file from the device’s file system to the Owner server’s file system. The device uploads the file over the secure communications channel, guaranteeing that sensitive content is protected. The Owner server saves the file to a directory that is unique to the device.
The fdo.wget FSIM
The fdo.wget FSIM downloads a file to the device’s file system. The source of the file is an HTTP server. The fdo.wget FSIM has much faster download performance than fdo.download, making it a better choice for downloading large files, such as container images.

The fdo.wget FSIM does not download the file over the secure FDO communications channel. The device connects directly to the target HTTP server. The FDO protocol does not guarantee the security of the HTTP connection. If the file contains sensitive information, you must either encrypt it before downloading or transfer it by using a properly authenticated HTTPS connection.

The fdo.command FSIM
The Owner server uses the fdo.command FSIM to run programs on the device. The device client run these programs, which must be present on the device before you issue the fdo.command. The fdo.command FSIM supports passing arguments to the program and redirecting stdout and stderr back to the Owner server’s logs. The fdo.command FSIM supports adding shell scripts directly into the configuration file.

You can use FIDO Device Onboard (FDO) ServiceInfo Modules (FSIMs) to automate tasks on a device during the onboarding process, such as downloading files, running commands, or fetching large payloads. To use FSIMs, you must add an fsim section to your Owner server configuration file.

Prerequisites

  • You have administrative access to the Owner server.
  • The FDO Owner server is installed and the base configuration in /etc/go-fdo-server/owner.yaml is complete.
  • Any local scripts or files intended for download through the fdo.download module are stored in a directory accessible to the go-fdo-server user, such as /var/lib/go-fdo-server-owner/scripts/.

Procedure

  1. Open your Owner server configuration file (for example, /etc/go-fdo-server/owner.yaml) in a text editor.
  2. Define the fsim section and add the required modules. The following example configures a script download, a command execution, and a large file download by using fdo.wget:

    log:
      level: "info"
    
    db:
      type: "sqlite"
      dsn: "file:/var/lib/go-fdo-server-owner/db.sqlite"
    
    http:
      ip: "0.0.0.0"
      port: "8043"
    
    device_ca:
      cert: "/etc/pki/go-fdo-server/device-ca.crt"
    
    owner:
      cert: "/etc/pki/go-fdo-server/owner.crt"
      key: "/etc/pki/go-fdo-server/owner.key"
    
    fsim:
      - module: "fdo.download"
        files:
          - src: "/var/lib/go-fdo-server-owner/scripts/setup-env.sh"
            dst: "/usr/local/bin/setup-env.sh"
            permissions: "0755"
    
      - module: "fdo.command"
        commands:
          - command: ["/usr/local/bin/setup-env.sh", "--init"]
            description: "Initializing environment"
    
      - module: "fdo.wget"
        files:
          - src: "http://distribution.example.com/images/worker-payload.tar.gz"
            dst: "/var/tmp/worker-payload.tar.gz"
            may_fail: true
  3. Save the file and restart the Owner server service to apply the configuration:

    $ sudo systemctl restart fdo-owner-server

3.17. Running the FDO Owner server

For administrative management and device communication during the TO2 protocol, make the FDO Owner server HTTP endpoint accessible. Proper network routing is required to facilitate secure ownership transfer and run ServiceInfo provisioning modules.

Prerequisite

  • Network accessibility.

Procedure

  1. Ensure that the system firewall does not block the server’s HTTP endpoint by opening the server’s network port:

    $ sudo firewall-cmd --add-port=8043/tcp --permanent
  2. Restart the firewalld service:

    $ sudo systemctl restart firewalld
  3. Enable and start the Owner server by using the systemd service:

    $ sudo systemctl enable --now go-fdo-server-owner.service
  4. Verify that the server is active:

    $ sudo systemctl status go-fdo-server-owner.service
    ● go-fdo-server-owner.service - Go FDO owner server
         Loaded: loaded (/usr/lib/systemd/system/go-fdo-server-owner.service; enabled; preset: disabled)
         Active: active (running) since Sun 2026-03-22 16:35:04 EDT; 18s ago
    ...

Verification

  • Optional: Verify that the server’s network endpoint is functioning and accessible:

    $ curl http://192.168.124.132:8043/health
    {"message":"the service is up and running","status":"OK","version":"1.0.0"}

In RHEL 10 image mode, the operating system is immutable. To deploy the FDO client, define the package installation in the Containerfile used to build the bootable container image. This ensures that the client is baked into the file system at build time.

Important

FDO is supported only on a Red Hat Enterprise Linux (RHEL) 10 system in image mode (bootc).

Prerequisites

  • You have a Containerfile.
  • You have a RHEL 10 Linux system in image mode (bootc).
  • FDO servers (Manufacturer, Rendezvous, and Owner) are deployed and accessible.
  • You have network connectivity between the device and FDO servers.

Procedure

  1. Install the packages by using a Containerfile:

    FROM registry.redhat.io/rhel10/rhel-bootc:10.2
    #Install the go-fdo-client package using your distribution's package manager:
    RUN dnf install -y go-fdo-client && dnf clean all
    Note

    If you plan to use a Trusted Platform Module (TPM) for credential storage, you must also install tpm2-tools in the Containerfile. For more information, see <Using_a_TPM>.

  2. Build the container image:

    $ podman build -t quay.io/example/fdo-client-bootc:latest -f Containerfile .
  3. Push the container image to the registry:

    $ podman push quay.io/example/fdo-client-bootc:latest
  4. Reference the container image in your Kickstart file by using the ostreecontainer directive to deploy it on the target device.

3.19. Configuring the FDO client

To customize the behavior of the FIDO Device Onboard (FDO) client to suit your environment, manage how it interacts with the manufacturing and onboarding servers.

Configuring the behavior of the FDO client ensures that the device can securely authenticate and receive its intended credentials and software packages during the onboarding process.

Prerequisites

  • You installed the go-fdo-client package on the target device.
  • You have access to a command line with sufficient permissions to run the client.
  • Optional: You have a predefined configuration file in the YAML or TOML format.

Procedure

  1. Identify the required configuration parameters. To view a comprehensive list of all available flags and options for a specific subcommand, pass the --help flag:

    $ go-fdo-client <command> --help
  2. Create or edit a configuration file. You can use either the YAML (.yaml, .yml) or TOML (.toml) format. Ensure that any file paths defined within the configuration are either absolute or relative to your current working directory.
  3. Run the client by using a configuration file. Use the --config flag to point the client to your specific settings:

    $ go-fdo-client <command> --config /etc/fdo/config.yaml
    Note

    The file format is automatically detected by the extension provided in the --config path.

  4. Optional: Override settings by using CLI flags. The client resolves configuration values based on a specific hierarchy. If a value is defined in multiple places, the client applies them in the following order of precedence (from highest to lowest):

    • Positional arguments: Such as the server URL for device-init.
    • CLI flags: --key or --kex.
    • Configuration file values: Settings defined in your YAML or TOML file.
    • Default values: Built-in application defaults.

3.20. Using a TPM to store the device credentials

The FIDO Device Onboard (FDO) client can store the device credential in a Trusted Platform Module (TPM) instead of a file. This provides hardware-backed protection for credential secrets.

Prerequisites

  • You have a TPM 2.0 device such as /dev/tpmrm0.
  • You installed the tpm2-tools package in the bootc container image.
  • You have root privileges.

Procedure

  1. Initialize the device by using the TPM:

    $ sudo go-fdo-client device-init http://manufacturer.example.com:8038 --key ec256 --tpm /dev/tpmrm0
  2. Run the onboarding command by using the TPM:

    $ sudo go-fdo-client onboard --key ec256 --kex ECDH256 \ --tpm /dev/tpmrm0

3.21. Verifying the FDO device credential

Verify the FDO device credential to ensure that the initialization process is successful and that the device is ready for secure onboarding.

Prerequisites

  • You successfully initialized the device.
  • You installed the fdo-client or go-fdo-client package.
  • You have root privileges.

Procedure

  1. Verify the credential by using the command appropriate for your storage method:

    • For file-based storage:

      If the credential was stored in the boot directory during initialization, use the --blob flag to point to the file path.

      $ sudo go-fdo-client print --blob /boot/device_credential
    • For Trusted Platform Module (TPM)-based storage:

      If the device uses a Hardware Security Module (HSM) or TPM for enhanced security, use the --tpm flag and specify the TPM resource manager path.

      $ sudo go-fdo-client print --tpm /dev/tpmrm0

Verification

  1. Verify the following command output parameters to ensure the device is prepared for deployment:

    • The device’s public key information
    • Rendezvous server information
    • Ownership header status
  2. Ensure the output does not return an error, which indicates a corrupted or missing credential.

3.22. Clearing FDO device credentials

To decommission a device, repurpose it for a new environment, or troubleshoot failed onboarding attempts, clear the FDO device credentials.

By removing the FDO device credentials, you reset the device’s identity, ensuring that sensitive ownership metadata is cleared and the device is ready to be re-initialized from a clean state.

Prerequisites

  • You have root privileges.
  • Optional: For TPM-based clearing, you installed the tpm2-tools package.
  • All active onboarding processes are stopped.

Procedure

  • Clear the credential by using the method appropriate for your storage type:

    • For a file-based credential:

      Delete the credential blob from the /boot directory or the specific location defined during initialization.

      $ sudo rm /boot/device_credential
    • For a TPM-backed credential:

      If the credential is stored in the Trusted Platform Module (TPM) non-volatile (NV) memory, release the specific index, which is typically 0x01D10001 for FDO.

      $ sudo tpm2_nvundefine 0x01D10001

Verification

  • Run the print command. The command fails and returns a file not found or NV index not defined error, which confirms that the credential is cleared.

3.23. FDO troubleshooting reference

This reference identifies common issues and provides solutions for FIDO Device Onboard (FDO) initialization and onboarding. Use these resolutions and diagnostic commands to resolve configuration issues and ensure a successful ownership transfer.

Expand
Error / IssueCommon CauseResolution

TO1 failed

The Rendezvous (RV) server has no record of the device.

  1. Verify the transfer of the ownership voucher to the Owner server.
  2. Confirm the Owner server registered the device with the RV server.
  3. Verify the Owner server targets the correct RV address.
  4. Match the voucher GUID with the device GUID by using the go-fdo-client print command.

no rendezvous information found…​

Missing RV metadata in the device credential.

  1. Use the go-fdo-client print command to verify RV information in the credential.
  2. Configure the Manufacturer server with the correct RV data.
  3. Re-initialize the device.

TLS Errors

Self-signed certificates or untrusted Certificate Authority (CA) chains.

Use the --insecure-tls flag for the device-init or onboard commands. Use this flag only in test environments.

Failed to read credential from TPM

Missing or invalid credential in the Trusted Platform Module (TPM) non-volatile (NV) index.

Run the device-init --tpm command to provision the credential first.

Permission denied on /dev/tpmrm0

Insufficient user privileges for TPM access.

Run the command with sudo.

TPM NV index corrupted or inaccessible

Inconsistent TPM state.

  1. Clear the index by using the tpm2_nvundefine 0x01D10001 command.
  2. Re-run device-init.

3.23.1. Diagnostic commands:

To further investigate persistent issues, use the following commands to gather metadata or verbose logs.

Print device GUID and metadata:

For file-based credentials:

$ sudo go-fdo-client print --blob /boot/device_credential

For TPM-based credentials:

$ sudo go-fdo-client print --tpm /dev/tpmrm0

Enable verbose debugging:

Add the --debug flag to your command to inspect the HTTP request and response payloads between the client and servers:

$ sudo go-fdo-client onboard --blob /boot/device_credential --key ec256 --kex ECDH256 --debug
Note

Most TO1 failures result from timing issues or a mismatch between the Manufacturer’s programmed Rendezvous info and the location where the Owner server uploaded the voucher. Always verify that the "Rendezvous Server Info" in your manufacturing.yaml file matches the live RV server address.

Red Hat logoGithubredditYoutubeTwitter

Learn

Try, buy, & sell

Communities

About Red Hat

We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.

Making open source more inclusive

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. For more details, see the Red Hat Blog.

About Red Hat Documentation

Legal Notice

Theme

© 2026 Red Hat
Back to top