Как установить sh TLS соединение с помощью HSM и OpenSsl - PullRequest
0 голосов
/ 03 февраля 2020

Фон

Я унаследовал задачу установить sh TLS 1.2 соединение с сервером с помощью криптографического токена программным путем. Токен, о котором идет речь, предназначен только для чтения - не позволяет извлекать закрытый ключ - смарт-карту. Этот токен был инициализирован в процессе производства. Токен содержит закрытый ключ вместе с сертификатом.

Токен поставляется с собственным модулем PKCS11.

Я настроил openssl для использования указанного модуля в движке:

[openssl_def]
engines = engine_section

[engine_section]
pkcs11 = pkcs11_section

[pkcs11_section]
engine_id = pkcs11
dynamic_path = /usr/lib/engines/engine_pkcs11.so
MODULE_PATH = TOKEN_PKCS11_LIB.so
init = 0

Я извлек сертификат из SmartCard и сохранил в sc_cert.pem.

Issue

Я попытался установить sh TLS-соединение с сервером с помощью командной строки:

 openssl s_client -engine pkcs11 -keyform engine -key "pkcs11:id=HEX;type=private" -cert sc_cert.pem -CAfile .../ca_bundle.pem -connect SERVER:PORT -state -tlsextdebug -debug -showcerts

После выполнения предыдущей команды я получаю следующий вывод:

engine "pkcs11" set.
PKCS#11 token PIN: 
No private keys found.
PKCS11_get_private_key returned NULL
cannot load client certificate private key file from engine
140540314130072:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:eng_pkey.c:124:
unable to load client certificate private key file

Кроме того, я попытался использовать PKCS11 URI-схему вариантов, чтобы указать ключевой элемент bu для безрезультатно.

Для подтверждения наличия закрытого ключа на карте я выполняю следующую команду:

pkcs11-tool -vvv -L --module TOKEN_PKCS1_LIB.so --pin PIN -O

Выход:

Available slots:
Slot 0 (0x1): ACS ...
manufacturer:  ...
hardware ver:  ...
firmware ver:  ...
flags:         token present, removable device, hardware slot
token label        : ...
token manufacturer : ...
token model        : ...
token flags        : login required, rng, token initialized, PIN initialized, other flags=0x40
hardware version   : ...
firmware version   : ...
serial num         : ...
pin min/max        : ...
Using slot 0 with a present token (0x1)
Public Key Object; RSA 2048 bits
    label:      LABEL
    ID:         ID_HEX
    Usage:      encrypt, verify
    Access:     none
Certificate Object; type = X.509 cert
    label:      LABEL
    subject:    DN: ...
    ID:         ID_HEX
Private Key Object; RSA 
    label:      LABEL
    ID:         ID_HEX
    Usage:      decrypt, sign
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

warning: PKCS11 function C_GetAttributeValue(ALWAYS_SENSITIVE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

Access:     sensitive

Примечание ID_HEX и LABEL для всех 3 - publi c, cert & private - имеют одинаковые значения.

Вопросы

Кажется, что по неизвестным мне причинам двигатель openssl не удается получить доступ к закрытому ключу.

Как мне настроить / вызвать openssl для использования моего токена в аутентификации TLS 1.2 (KeyExchange?)?

Что-то не так с моей конфигурацией?

Является ли проблема с моим ключевым URL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...