Clients: PKCS#11 Library

1.0 Download

The Fortanix Data Security Manager (DSM) PKCS#11 library for all platforms can be downloaded here.

2.0 Supported Features

Create or Import

Supported algorithms for importing a key:

  • AES, DES, DES3 as HEX
  • EC, RSA as PEM
  • Cert
  • Pfx
  • Secret

Supported key sizes or curves:

  • AES - 128,192, or 256 bits
  • DES - 56 bits
  • DES3 - 112 or 168 bits
  • RSA - between 1024 and 8192 bits
  • EC - SecP192K1, SecP224K1, SecP256K1, NistP192, NistP224, NistP256, NistP384, NistP521, Gost256A, Ed25519, X25519, X448
  • DSA -
    • When key_size = 2048, the allowed values are 224 or 256 bits.
    • When key_size = 3072, the allowed value is 256 bits.
  • HMAC - between 112 and 8192 bits

Encrypt or Decrypt


Supported modes:

  • AES - CBC, CBC (no padding), CFB, GCM, GCM (no padding), OFB
  • DES, DES3 - ECB, CBC, CBC (no padding)

Sign or Verify


Supported modes:

Multipart Encrypt or Multipart Decrypt


Supported modes:


Message Digest  

Supported hash algorithms:

SHA1, SHA256, SHA384, and SHA512, SHA3_224, SHA3_256, SHA3_384, SHA3_512

Wrap Key


Symmetric keys, HMAC keys, opaque objects, and secret objects may be wrapped with symmetric or asymmetric keys.

Asymmetric keys may be wrapped with symmetric keys. But wrapping an asymmetric key with another asymmetric key is not supported.

Derive Key


Supported key sizes or curves:

  • AES - 128,192, or 256 bits
  • DES - 56 bits
  • DES3 - 112 or 168 bits
  • HMAC - between 1024 and 8192 bits
Agree Key


Supported key sizes or curves:

  • AES - 128,192, or 256 bits
  • EC - SecP192K1, SecP224K1, SecP256K1, NistP192, NistP224, NistP256, NistP384, NistP521
Export Key


Supported key sizes or curves:

  • AES and ARIA - 128,192, or 256 bits
  • DES - 56 bits
  • DES3 - 112 or 168 bits
  • HMAC - between 1024 and 8192 bits
  • RSA - between 1024 and 8192 bits
  • EC - SecP192K1, SecP224K1, SecP256K1, NistP192, NistP224, NistP256, NistP384, NistP521
  • HMAC - between 1024 and 8192 bits

3.0 Installation

The RPM and DEB installer copies the Fortanix DSM PKCS#11 shared object file (also called library or module) to /opt/fortanix/pkcs11/

The Windows installer installs the PKCS#11 Library, as well as the Fortanix CNG and EKM providers. The default installation location of PKCS#11 library is C:\Windows\Program Files\Fortanix\KmsClient\FortanixKmsPkcs11.dll.

For information on Apache HTTPD TLS and NGINX TLS, refer to Using Fortanix Data Security Manager for NGINX and Apache TLS Keys.

For information on MariaDB encryption, refer to Using Fortanix Data Security Manager for MariaDB Encryption at Rest.

4.0 Usage

You can verify that you can use the Fortanix DSM PKCS#11 library using the pkcs11-tool utility, which is distributed along with the OpenSC smart card library at

pkcs11-tool --module <module path> --show-info

The expected output is:

Cryptoki version 3.0
Manufacturer     Fortanix
Library          Fortanix Data Security Manager PKCS11 Library (ver 0.3)
Using slot 0 with a present token (0x1)
Cryptoki version numbers may differ.

Applications use the Fortanix DSM PKCS#11 library to interact with Fortanix DSM for key management and cryptographic operations. The PKCS#11 specification has notions of slots and tokens, which correspond to physical entities in an HSM. Multiple clients or applications connecting to a token on an HSM have equal access to the entire keyspace. However, Fortanix DSM allows access to several applications simultaneously while guaranteeing strong cryptographic separation of key spaces. This is equivalent to every application having access to its own HSM. Fortanix DSM PKCS#11 library implements this by mapping the application credential to the user PIN, and by having an arbitrarily large number of slots (numbered from 0), with a single token (numbered 1) already initialized. The number of slots defaults to 32 (numbered 0-31) and can be configured through the environment variable FORTANIX_PKCS11_NUM_SLOTS.

Administration of Fortanix DSM is done using the web UI and using the REST APIs, so the support for doing it through the PKCS#11 library is disabled. PKCS#11 security officer login is disabled, and will always fail with CKR_PIN_INCORRECT. Similarly, administrative functions such as C_InitTokenC_InitPIN, and C_SetPIN return errors such as CKR_PIN_INCORRECT or CKR_USER_NOT_LOGGED_IN.

The library can also be used by Java applications using the SunPKCS11 JCE provider. Some examples to build applications using this PKCS#11 library are provided in example code. Please look at our Knowledge Base to learn more about how to configure legacy applications with a PKCS#11 interface to use Fortanix DSM.

4.1 User PIN

When executing C_Login, the API key must be provided as the PIN. Alternatively, the PIN may point to a file to configure additional options. The PIN must have one of the following formats:

  1. API key (a 164-character string), for example FEL/ME...j+bt7.
  2. file://path-to-configuration-file. The path may be absolute (e.g file:///home/fortanix/pkcs11.cfg) or relative (e.g. file://pkcs11.cfg). See below for the file format.
  3. env:environment-variable-name. The environment variable may contain the API key directly or specify a file as shown previously.

4.1.1 Configuration File Format

The configuration file may contain just the API key on a single line, or it may contain additional options as follows:

api_key = "FEL/ME...j+bt7"
= "<ENDPOINT URL>" or "<ENDPOINT IP>" # default is ""
fake_rsa_x9_31_keygen_support = false # default is false

ca_certs_file = "/path/to/certs.pem" # X.509 PEM CA certificates

cert_file = "/path/to/cert.pem" # X.509 PEM client certificate
key_file = "/path/to/key.pem" # PKCS#8 PEM client private key
app_id = "59be5a1e-8935-4a0a-a272-b0c8512d99f1"

prevent_duplicate_opaque_objects = true
retry_timeout_millis = 3000
max_concurrent_requests_per_slot = 0
exact_key_ops = true
signing_aes_key_as_hmac - false
opaque_objects_are_not_certificates = false
[log] system = true # Unix only, logs to syslog file = "/path/to/log/file"

[quorum_approval.wait_for_quorum_approval] enabled = true poll_interval_secs = 5
max_wait_for_secs = 100

Exactly one of api_key and app_id are required; the other fields are optional and may be omitted. For example, if you don’t want to configure logging, you can omit the entire [log] section.

For information on generating certificates, refer to Generating Certificates using a Fortanix Data Security Manager key.

By default, the trusted certificates used to verify the connection with the Fortanix DSM server are provided by the system. Additional trusted certificates may be specified by setting the ca_certs_file configuration option. It must point to a file containing one or more concatenated X.509 certificates in PEM format.

cert_file and key_file are currently only supported on Linux. If provided, the client certificate and key are used to authenticate to the server. If the app does not have an API key, app_id must be specified.

fake_rsa_x9_31_keygen_support = true allows the PKCS#11 mechanism CKM_RSA_X9_31_KEY_PAIR_GEN to be specified when generating RSA keys, even though Fortanix DSM always uses CKM_RSA_PKCS_KEY_PAIR_GEN. The generated key is fully functional but does not use the X9.31 generation procedure.

Setting the environment variable FORTANIX_PKCS11_FAKE_RSA_X9_31_KEYGEN_SUPPORT also allows this.

poll_interval_secs is the time gap between each quorum status check-in. The polling interval must not surpass 600 seconds (equivalent to 10 minutes).

max_wait_for_secs is the maximum duration for the client library to await a response from the server in seconds.

The PKCS#11 library additionally supports the following:

  • To prevent creating duplicate opaque objects, set prevent_duplicate_opaque_objects = true in the config file. This would skip creating new Opaque objects if there is an existing Opaque object with the same CKA_LABEL. The default value for prevent_duplicate_opaque_object is false .
  • To configure the error retry limit, set retry_timeout_millis = xxxx in the config file. Where xxxx is the value of time in milliseconds. This is the maximum duration for which the PKCS#11 library will do any number of retries in case of API failures from the service. For example, retry_timeout_millis = 6000 sets the retry limit to 6 secs. The default value is 3000, which is 3 secs.
  • max_concurrent_requests_per_slot, which will limit the number of concurrent HTTP requests a client can make to Fortanix DSM per slot, which effectively limits the number of concurrent API calls a client can make. This can be used to prevent a client from consuming too many resources.
    If unset, the value will be inherited.  The default value is 0, which means to impose no limit.  Setting a value of 0 can override a limit imposed elsewhere.  For example, if the config file specifies a limit of 100, and the environment variable is set to 0, there will be no limit.
  • exact_key_ops, which will allow the user to explicitly specify the key operations when creating a key instead of the PKCS#11 having to specify the default key operations. For example, when creating an AES key using C_GenerateKey in “exact key ops” mode, the user needs to explicitly specify the key operations in the attribute template, as follows:
    CK_ULONG len = 16; // 128-bit AES key

    CK_ATTRIBUTE aesKeyTemplate[] = {
    {CKA_VALUE_LEN, &len, sizeof(len)},
    {CKA_ENCRYPT, &true, sizeof(true)},
    {CKA_DECRYPT, &true, sizeof(true)},
    {CKA_WRAP, &true, sizeof(true)},
    {CKA_UNWRAP, &true, sizeof(true)},
    {CKA_DERIVE, &true, sizeof(true)},
    {CKA_EXTRACTABLE, &true, sizeof(true)}
    The key created using the template above will contain exactly the key ops that the user specified in the template.
    • If, for instance, the user forgot to specify the CKA_ENCRYPT attribute in the template, the resulting key in Fortanix DSM would not have the ENCRYPT permission.
    • If the user does not specify any key operations (apart from APPMANAGEABLE, which corresponds to the PKCS #11 attributes CKA_MODIFIABLE or CKA_DESTROYABLE), then the PKCS #11 client assigns the following default key operations.
      • For RSA keys, the client assigns SIGN and VERIFY
      • For non-RSA keys, the client assigns the usual defaults such as ENCRYPT, DECRYPT, WRAPKEY, UNWRAPKEY, and so on minus APPMANAGEABLE
      • For non-key objects, we assign EXPORT.
  • oracle_tde_cache_config, enables prefetching of heartbeats in Oracle TDE (optional) by specifying the following in the config file:
    oracle_tde_cache_config = {}
    This is a table in toml representation and the above format expresses it as an inline table.
    Specifying oracle_tde_cache_config is the simplest way of enabling the feature and the default values are used for all configurations.  It is also possible to change the values of some configurations as shown below:
    cache_size = 100
    request_timeout = 2000


    • cache_size: This is the number of heartbeats that will be prefetched and stored. By default, its value is60 (this may change). So, a value of 60 means that 60 heartbeats will always be available for use, in case of a connectivity loss. Since by default, a heartbeat is fired every 3 seconds, 60 cache_size should provide a backup for 3 minutes. Setting cache_size to0 will throw an error.

    • request_timeout: The immediate heartbeat request is served from the cache but a prefetch request is always made to keep the prefetch cache full. But this prefetch request happens within the actual heartbeat request and will block it. It may take longer in case of network connectivity issues and may trigger heartbeat failure. So, you need to ensure this request is abandoned if it is taking extra time. request_timeout tells how long this prefetch request is allowed to block. By default, it is1.5seconds.
      The request_timeout can be set in the following ways:

      request_timeout = 2000 # this is in milliseconds, that is 2 seconds
      request_timeout = { secs = 1, nanos = 1} # 1 second + 1 nano second

      For more information on enabling prefetching of heartbeats, refer to Integrating Oracle TDE with Fortanix DSM.

4.1.2 Set the Value of the Client Config API

The client config API for fake_rsa_x9_31_keygen_support, signing_aes_key_as_hmac, exact_key_ops, prevent_duplicate_opaque_objects, opaque_objects_are_not_certificates, retry_timeout_millis, max_concurrent_requests_per_slot, and exact_key_ops can be set in three ways. In decreasing order of precedence, they are as follows:

  • Using environment variables
  • An option in the configuration file
  • The Client Configuration tab on the Account Settings page in the Fortanix DSM UI uses the Client Configuration API to add a field to Pkcs11ClientConfig. <TBD Link to the UI documentation page.>

4.2 Automatic Log Rotation

By default, logs are rotated every 1MB and we keep 5 copies of the log. To configure log rotation, add the following parameters to your config file under the log section:

  • file_size_kb 
  • max_files 

You can specify minimum log level by using the following parameter in the log section:

  • level  - Valid values for level  are error , warninfotrace, and debug. The default value is info.       

4.3 Logging

By default, our PKCS#11 library writes logs into Syslog on Linux (typically at /var/log/syslog on Ubuntu and /var/log/messages on CentOS) and to the file at %APPDATA%\Fortanix\KmsClient\pkcs11.log on Windows. Logs can also be redirected to another file in the filesystem specified in the configuration file described above. All the function calls made into the PKCS#11 library are logged in the log file along with their return value. The PKCS#11 log file is useful for debugging and troubleshooting. For additional logging, the environment variable FORTANIX_PKCS11_LOG_LEVEL can be set to debug.

4.4 Using OAuth with PKCS#11 Library

The following requirements must be satisfied in order to use the OAuth scheme with the PKCS#11 library:

  • A configuration file must exist either at the default location /etc/fortanix/pkcs11.conf or the path specified in the environment variable FORTANIX_PKCS11_CONFIG_PATH.
  • The configuration file must include the api_key and the following snippet:
api_endpoint = "<ENDPOINT URL>" or "<ENDPOINT IP>"
api_key = "...."

method = "user_credentials"
  • When calling C_Login(), the pin must be the base 64 encoded username: password of the user who wants to authorize the app.
  • The user authorizing the app must be in exactly one account or the configuration file should list the account id in the oauth section:
method = "user_credentials"
acct_id = "..."
  • The user authorizing the app must have a group administrator role in exactly one group. This is because the library would need to know how to specify a default group for the app when granting an OAuth authorization code.
  • The app must have OAuth enabled and it must include the following redirect URI in its settings: https://pkcs11-library.invalid. This can be set through the Fortanix DSM frontend on the app object.

4.5 Supported Functions and Mechanisms

For the list of all functions and mechanisms supported in the PKCS#11 library, refer to the article PKCS#11 Supported Functions and Mechanisms.

4.6 Connection Issues

A connection issue between the PKCS#11 library and Fortanix DSM may cause function calls to fail with the error code CKR_DEVICE_ERROR. This can be observed in the PKCS#11 log file. If that happens, check for the following:

  • Check your network connectivity to ensure that the PKCS#11 library is able to reach Fortanix DSM over TCP port 443.
  • Check if the FORTANIX_API_ENDPOINT environment variable is set correctly to point to your Fortanix DSM deployment.
  • If you need a web proxy to reach your Fortanix DSM deployment, you can configure it using the env variable FORTANIX_PROXY.

4.7 Login issues

A login failure may be caused by several issues. Follow the following steps to troubleshoot:

  • Check if the API Key being used is correct.
  • Check if the Fortanix DSM endpoint is set correctly. Fix the FORTANIX_API_ENDPOINT environment variable if API requests are going to an incorrect endpoint.
  • Some applications require the PIN for their PKCS#11 library to be limited to a maximum number of characters. The Fortanix DSM API Key is 165 characters long. If this is the case, store the API Key in an environment variable or a file and create a PIN using the appropriate prefix as explained above.

5.0 References

For more details on the PKCS#11 client configuration options, refer to the User's Guide: Client Configurations.

6.0 Troubleshooting

The following table describes the possible reasons for errors and exceptions and provides information about resolving them.



Issues while opening the HSM wallet

Ensure the following to troubleshoot:

  • The sqlnet.ora file you edited is the one being used by the database.
  • The directory permissions of the folder where the software wallet is stored is correct such that it is readable and writeable by oracle user.
  • You have only one PKCS11 library under the folder /opt/oracle/extapi/64/hsm/. Having multiple libraries under different sub-folders of this folder can cause Oracle to fail to load any library.

Failing to open HSM wallet (ORA-28353)

Look at the PKCS11 log file to check if C_Login is failing. A failing entry for C_Login will have non-zero status as follows:

2019-06-13T01:31:36.720632089-04:00 - Fortanix C_Login -> 160

DB wallet closes automatically while opening from Fortanix DSM.

Remove the quorum approval from the group/account and try again.

"certificate already in hash table" error in the PKCS11 log

backend error: ProviderError(NativeTlsError
(Ssl(ErrorStack([Error { code: 185057381, library: "x509 certificate routines", function: "X509_STORE_add_cert", reason: "cert already in hash table", file: "x509_lu.c", line: 370 }

Ensure that you remove the duplicate certificates from the local certificate store.

#/etc/pki/ca-trust/source/anchors (Local cert Store)

HSM heartbeat Failure error

Look at the PKCS11 log file to find which PKCS11 function is failing. Oracle performs continuous HSM heartbeat checks by performing a crypto operation with a key stored in HSM. To troubleshoot heartbeat check failure, please check the following:

  • Verify the information is correct as mentioned in the steps for troubleshooting C_Login failure.
  • Verify that the Oracle TDE master key in Fortanix DSM is enabled and exists.

PKCS library fails to open the PKCS11  configuration file and uses default configuration.

oracle[14045]: could not read  config file /root/.config/fortanix/pkcs11.conf, using default configuration...

Look for the PKCS11 errors in the log file, for example:

API failures from the PKCS#11 service

Configure the error retry limit by setting retry_timeout_millis = xxxx in the config file. Where xxxx is the value of time in milliseconds. This is the maximum duration for which the PKCS#11 library will do any number of retries in case of API failures. For example, retry_timeout_millis = 6000 sets the retry limit to 6 secs. The default value is 3000, which is 3 secs.


Please sign in to leave a comment.

Was this article helpful?
0 out of 0 found this helpful