libcurl: как использовать закрытый ключ TPM для взаимной аутентификации SSL

Я использую библиотеку C libcurl. Мне нужно сделать сшивание OCSP в сочетании с взаимной аутентификацией. Для этого я возьму модель на приведенных ниже примерах. Однако мне нужно, чтобы закрытый ключ моего клиентского сертификата хранился в микросхеме TPM. Вы знаете, как это сделать, используя tpm2-tss-engine? Спасибо за вашу помощь.

https://curl.haxx.se/libcurl/c/smtp-ssl.html https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html


person mistergreen    schedule 22.02.2020    source источник
comment
Это вопрос программирования для переполнения стека. И разделите на два вопроса, потому что аутентификация клиента OCSP и TLS с TPM не имеют ничего общего друг с другом. Вы можете поискать, как использовать TPM для аутентификации ssh, это то же самое. Существует оболочка API pkcs11 для TPM2, которая должна упростить работу. Вам нужно будет хранить закрытый ключ, зашифрованный с помощью TPM, так как у TPM недостаточно места для хранения.   -  person Z.T.    schedule 22.02.2020
comment
Самый первый вопрос: как libcurl (на C) может прочитать закрытый ключ сертификата в TPM для целей аутентификации.   -  person mistergreen    schedule 23.02.2020
comment
Весь смысл ключа в TPM заключается в том, что ключ никогда не может покинуть TPM удобным для использования способом. Доверенный платформенный модуль должен выполнять подписи. В openssl есть способ использовать механизмы, которые используют внешние устройства, такие как смарт-карты, для выполнения подписи с использованием ключей в устройствах, и это можно сделать во время рукопожатия. TPM сложен, вы не получите 1-минутного объяснения. Вам нужно много читать об этом.   -  person Z.T.    schedule 23.02.2020


Ответы (1)


Я смог использовать ключ, хранящийся в TPM, с openssl s_client (возможно, это возможно с curl), но я могу сделать запрос HTTPS и получить ответ.

openssl позволяет прочитать ключ из TPM. вы можете использовать команду s_client для подключения через TCP, а затем отправить свой HTTP-запрос.

Пример команды будет выглядеть так:

Файл: http_request.txt (с двумя символами новой строки в конце)

GET /url/path HTTP/1.0
Host: hostname.com


cat http_request.txt | \
openssl s_client \
  -nocommands \
  -ign_eof \
  -msgfile /dev/null \
  -quiet \
  -keyform engine \
  -engine pkcs11 \
  -cert mycertificate.pem \
  -CAfile root.ca.pem \
  -key 'pkcs11:model=SWTPM;manufacturer=Intel;token=mytoken;object=myobject;type=private;pin-value=mypin' \
  -connect hostname.com:443

Это позволяет мне использовать TPM для выполнения запросов к AWS IoT: iot:AssumeRoleWithCertificate предполагается, что ключ является файлом на диске: https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html

person Jeff Peters    schedule 21.05.2020
comment
Спасибо. Как указать дескриптор TPM? - person mistergreen; 22.05.2020
comment
p11tool --list-tokens Отобразятся все ваши токены, включая URL/дескриптор, если вы их уже создали. man7.org/linux/man-pages/man1/p11tool.1. html - person Jeff Peters; 22.05.2020
comment
Что, если, например, мой закрытый ключ находится на дескрипторе TPM 0x8100000009? - person mistergreen; 22.05.2020