Настройка на PKCS#11#

Инсталиране на приложението Nitrokey#

Можете да получите модула NetHSM PKCS#11 като предварително компилиран двоичен файл или да го компилирате от изходния код.

Предварително компилирани двоични файлове#

  1. Изтеглете файла на модула, съответстващ на вашата система, от страницата releases на хранилището.

  2. Копирайте файла на модула в директорията, в която приложенията ви за PKCS#11 очакват да го намерят.

Компилиране от източника#

  1. Инсталирайте веригата от инструменти Rust.

  2. Изтеглете и извлечете изходния код от страницата с версиите на ` <https://github.com/Nitrokey/nethsm-pkcs11/releases>`__ или клонирайте хранилището на ` <https://github.com/Nitrokey/nethsm-pkcs11>`__.

  3. Изпълнете cargo build --release в директорията с източника.

Статична конфигурация на DNS#

По подразбиране модулът търси конфигурационни файлове в:

  • /etc/nitrokey/p11nethsm.conf

  • /usr/local/etc/nitrokey/p11nethsm.conf

  • $HOME/.config/nitrokey/p11nethsm.conf

Ако са налични няколко файла, конфигурациите ще бъдат обединени, така че слотовете на всички конфигурационни файлове да бъдат използвани от модула.

Можете ръчно да зададете местоположението на файла с конфигурацията (само този файл ще бъде прочетен) с променливата env P11NETHSM_CONFIG_FILE (например P11NETHSM_CONFIG_FILE=./p11nethsm.conf).

Формат на файла с конфигурацията#

Конфигурацията е във формат yaml:

# Set this option to true to enable the compatibility option for the C_SetAttributeValue() function.
# This allows the applications using the Java Sun PKCS11 module (like EJBCA) to generate keys.
# When using this, the names given to the keys will be ignored and the keys will have random names.
# Under the hood it will store in memory the name given to the key when calling C_SetAttributeValue(). When a certificate is uploaded it will check if the name was previously passed to C_SetAttributeValue() and translate it to the real name on the NetHSM.
enable_set_attribute_value: false

# Optional log level, acceptable  values are Trace, Debug, Info, Warn and Error
log_level: Debug

# By default, the module logs to both syslog and stderr, trying the sockets /dev/log, /var/run/syslog and finally /var/run/log
# A custom socket can be configured:
syslog_socket: /var/nethsm/log
# Instead of a socket, a custom UDP or TCP syslog can be configured:
# syslog_udp:
#    to_addr: 127.0.0:1:514
#    from_addr: 127.0.0:1:4789
# syslog_tcp: 127.0.0.1:601
# Only one option among "syslog_socket", "syslog_udp", "syslog_tcp" can be configured at the same time

# You can configure the syslog facility ( "kern", "user", "mail", "daemon", "auth", "syslog", "lpr", "news", "uucp", "cron", "authpriv", "ftp", "local0", "local1", "local2", "local3", "local4", "local5", "local6" or "local7"):
syslog_facility: "user"
# You can set the hostname (for use only with syslog_udp or syslog_tcp)
# syslog_hostname: "localhsm-pkcs11"
# You can set the process name (defaults to the process name obtained from the OS)
# syslog_process: "NetHSM Pkcs11"
# You can set the pid used in logs (defaults to the process id obtained from the OS)
# syslog_pid: 0
# You can also configure a custom file, or "-" for stderr.
# log_file: /tmp/p11nethsm.log

# Each "slot" represents a HSM cluster of server that share the same user and keys.
slots:
  - label: LocalHSM                        # Name your NetHSM however you want
    description: Local HSM (docker)        # Optional description

    # Users connecting to the NetHSM server
    operator:
      username: "operator"
      # If the password starts with `env:`, it will obtain the password from an environment variable:
      # password: "env:LOCALHSMPASS"
      password: "localpass"
    administrator:
      username: "admin"

    # List the NetHSM instances
    instances:
      - url: "https://keyfender:8443/api/v1"   # URL to reach the server
        # To avoid having to re-open connections on each requests, the module keeps a connection pool to each instance. If the module is used by a multithreaded application, multiple connections can be opened at the same time.
        # This configures the maximum number of connections in the pool at the same time.
        # Note that this does not limit the total number of open connections.
        # Having a degree of parrallelism that is higher than the max number of idle connection can lead overhead as those connections will be closed an re-opened frenquently
        max_idle_connections: 10
        # By default, the certificate of the HSM will be validated using the system's root certificate authority.
        # When the NetHSM uses a self-signed certificate, it can be verified against an allowed list of sha256 fingerprint of the NetHSM's certificate:
        sha256_fingerprints:
          - "31:92:8E:A4:5E:16:5C:A7:33:44:E8:E9:8E:64:C4:AE:7B:2A:57:E5:77:43:49:F3:69:C9:8F:C4:2F:3A:3B:6E"
        # Alternatively certificate checks can be skipped entirely with danger_insecure_cert option.
        # This should be avoided if possible and certainly not used with a productive NetHSM.
        # danger_insecure_cert: true
    # Configure the network retry mechanism. If absent, no retries are attempted on a network error
    retries:
      # The number of retries after a network error
      count: 3
      # The delay between retries, in integer seconds
      delay_seconds: 1
    # it is possible to configure idle connections to make use of TCP keepalives, preventing the closing of connections by a firewall or detecting such cases
    tcp_keepalive:
      # the number of seconds before keepalives packets start being sent
      # Corresponds to `TCP_KEEPIDLE` on Linux, `TCP_KEEPALIVE` on macOS, and the field keepalivetime of tcp_keepalive on Windows
      time_seconds: 600
      # the number of seconds between each keepalive packet
      # Corresponds to `TCP_KEEPINTVL` on Linux and macOS, and the field keepaliveinterval of tcp_keepalive on Windows
      interval_seconds: 60
      # the number of keepalive packets being sent without a response before the connection
      # is considered closed
      # Corresponds to `TCP_KEEPCNT` on Linux and macOS, and is not used on Windows
      retries: 3
    # Time a connection can spend idle before being closed
    connections_max_idle_duration: 1800
    # Configurable timeout for network operations. If a network operation takes more than, `timeout_seconds`, consider it failed. If `retries` is configured, it will be retried.
    # Defaults to infinite
    timeout_seconds: 10

Инстанции#

Ако в един и същи слот са изброени няколко екземпляра на NetHSM, тези екземпляри трябва да бъдат конфигурирани в клъстер. Удостоверенията на потребителите и ключовете трябва да са едни и същи за всички инстанции.

Модулът ще използва инстанциите по кръгов път, като при неуспех ще опита друга инстанция.

Надеждност на мрежата#

За да се подобри надеждността на модула PKCS#11, е възможно да се конфигурират таймаути, повторения, резервиране на инстанциите и поддържане на TCP.

Повторни опити#

Ако даден екземпляр на NetHSM е недостъпен, модулът PKCS#11 може да повтори изпращането на заявката до други екземпляри или до същия екземпляр (ако другите екземпляри също са недостъпни). Възможно е да се въведе забавяне между повторните опити.

  • Неуспешните екземпляри се маркират като недостижими и се опитват отново във фонова нишка, така че няма да бъдат изпробвани, освен ако всички екземпляри са недостижими.

  • Ако не може да бъде създадена фонова нишка (CKF_LIBRARY_CANT_CREATE_OS_THREADS), неуспешните екземпляри ще бъдат изпробвани по време на нормалните операции, което ще забави заявките. За да се сведе до минимум това, подобни „вградени“ проверки на състоянието са ограничени до 1 секунда таймаут и могат да бъдат опитани само 3 проверки на състоянието за една заявка (това е най-лошият случай, който може да бъде достигнат само ако голям брой инстанции се провалят).

Следователно:

  • Максималният брой заявки, изпратени за едно API повикване, е: retries.count + 1 + 3

  • Максималната продължителност (в най-лошия случай) преди достигане на таймаут за едно API повикване е: (retries.count + 1) * timeout_seconds + 3

  • Максималното времетраене за едно извикване на функция PKCS#11 ще варира, тъй като някои функции водят до множество извиквания на API в NetHSM.

TCP keepalive#

За да се подобри производителността, връзките се поддържат отворени с инстанциите на NetHSM, за да се избегне необходимостта от повторното им отваряне. Възможно е в мрежа със защитна стена тези неактивни връзки да бъдат затворени, което да доведе до изтичане на времето при следващия опит за връзка. За да се предотврати появата на бавни изчаквания и за да се открие по-рано, ако това се случи, е възможно да се конфигурира TCP keepalives за тях.

Потребители#

Потребителите оператор и администратор не са задължителни, но модулът няма да се стартира, ако няма конфигуриран потребител. Това е така, за да можете да конфигурирате модула само с потребител администратор, само с потребител оператор или и с двамата едновременно.

Когато са зададени двамата потребители, модулът ще използва оператора по подразбиране и ще използва потребителя администратор само когато действието го изисква.

The regular PKCS#11 user is mapped to the NetHSM operator and the PKCS#11 SO is mapped to the NetHSM administrator.

Пароли#

Паролата може да бъде предоставена по няколко начина:

  • В обикновен текст в конфигурацията password: "mypassword"

  • В променлива на средата, прочетена от модула с префикс env:: env:ENV_STORING_THE_PASSWORD

  • Чрез функцията за вход на pkcs11, пример за pcks11-tool: pkcs11-tool –module libnethsm_pkcs11.so -p opPassphrase За да предоставите паролата на администратора, вместо нея трябва да използвате --so-pin: pkcs11-tool --module libnethsm_pkcs11.so --login --login-type so --so-pin Administrator

Ако паролата на даден потребител не е зададена в конфигурационния файл, ще се изисква влизане в системата, за да се предостави паролата (3-ти метод).

Неработещ NetHSM се счита за слот, в който не е наличен токън.