Я хочу работать с токеном pkcs11 в java. Таким образом, я использовал «IAIK» в качестве java-обертки pkcs11. Я могу искать такие объекты, как ключи и сертификаты, но не могу узнать, какой ключ какому сертификату принадлежит. Я использовал «CryptoKi Manager» для поиска объектов в токене, и он показывает связь между сертификатом и ключом, как показано на рисунке ниже. Затем я изучил стандарт PKCS11, в нем говорилось, что есть поле с именем «certId», которое объявляет это соединение, но я не смог найти его в «IAIK». Поддерживает ли «IAIK» эту функцию в своем объекте «Сертификат»? Как?
Как пара закрытый ключ и сертификат совпадают в оболочке IAIK PKCS11?
Ответы (1)
Это соединение осуществляется через атрибут CKA_ID
со ссылкой на PKCS#11 версии 2.20:
Поле CKA_ID предназначено для различения нескольких ключей. В случае открытых и закрытых ключей это поле помогает обрабатывать несколько ключей, принадлежащих одному и тому же субъекту; идентификатор ключа для открытого ключа и соответствующего ему закрытого ключа должен совпадать. Идентификатор ключа также должен быть таким же, как у соответствующего сертификата, если он существует. Однако Cryptoki не обеспечивает соблюдение этих ассоциаций. (Дальнейшие комментарии см. в Разделе 10.6.)
Обратите внимание, что эта ассоциация не принудительная (YMMV), но вменяемые реализации ведут себя именно так.
Используйте Key.getId() и X509PublicKeyCertificate .getID() в оболочке PKCS#11.
С IAIK-провайдером (обратите внимание, что вам нужна лицензия) используйте IAIKPKCS11Key.getKeyID() для сопряжения объектов открытого и закрытого ключей. Я не знаю, как получить значение CKA_ID
из сертификатов, полученных из TokenKeyStore.
Удачи!