背景
我继承了以编程方式使用加密令牌与服务器建立 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
.
问题
我尝试使用命令行建立与服务器的 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
注意所有 3 个的 ID_HEX 和 LABEL - public、cert 和 private - 是相同的值。
问题
似乎由于我不知道的原因,openssl 引擎无法访问私钥。
我应该如何配置/调用 openssl 以在 TLS 1.2 身份验证(KeyExchange?)中使用我的令牌?
我的配置有问题吗?
我的关键 URL 有问题吗?