Застряв в подписании (Authenticode) с помощью токенов PKCS # 11, и учитывая удивительно слабую поддержку драйверов от поставщика (SafeNet), мы подписываем код Windows для Linux.
Все это работает нормально, используя все наши токены на нескольких серверах сборки. Тем не менее, у меня есть один токен, который не работает, в зависимости от используемого механизма. В Java с использованием Jsign и поставщика SunPKCS11 все отлично работает с этим токеном.
Однако из osslsigncode подпись завершается неудачно с помощью этого токена:
Unable to enumerate certificates
PKCS11_get_private_key returned NULL
Failed to load private key 9df65894eb084ba3140555614123992:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:eng_pkey.c:124:
Failed
Разница между рабочим токеном и нерабочим токеном заключается в том, что нерабочий токен включает в себя не только сертификат, но и его цепочку доверия:
# pkcs11-tool --module libeToken.so --list-objects
Using slot 0 with a present token (0x0)
Certificate Object, type = X.509 cert
label: te-69f298db-2f32-4a94-82ea-3e11829b26cd
ID: 9df65894eb084ba3
Certificate Object, type = X.509 cert
label:
Certificate Object, type = X.509 cert
label:
Используя p11tool, два пустых сертификата выше показывают как:
Type: X.509 Certificate
Label:
Flags: CKA_CERTIFICATE_CATEGORY=CA;
ID:
Мои другие токены, все из которых работают нормально, не включают эти сертификаты CA. Этот токен был создан недавно, поэтому может случиться так, что либо микропрограмма токена отличается от моих других, либо процесс установки токена изменился с тех пор, как я создал другие рабочие токены. Сертификат одинаков для всех, рабочий и нерабочий.
Я подтвердил (через gdb), что правильный ключ ID передается в ENGINE_load_private_key.
Я не уверен, кто в этом случае владеет API ENGINE - это проблема с токеном? (SafeNet) Это проблема с OpenSC? и т. д. Было бы полезно найти какой-то другой инструмент, использующий API таким же образом, чтобы я мог подтвердить, связана ли проблема с кодом osslsign (который не поддерживается активно) или с одним из нижних уровней в этой карточной башне.
P.S. Я использовал PKCS # 11 Spy, и он показывает перечисление всех сертификатов в цепочке, поэтому он находит пару ключей (по идентификатору), но затем завершается ошибкой - нет ошибок в PKCS # 11 Spy - все CKR_OK.
P.P.S. Для решения вопроса о том, имеет ли этот токен также закрытый ключ ...
Using slot 0 with a present token (0x0)
Logging in to "Code Signing Token 11".
Please enter User PIN:
Private Key Object; RSA
label:
ID: 9df65894eb084ba3
Usage: decrypt, sign, unwrap
Certificate Object, type = X.509 cert
label: te-69f298db-2f32-4a94-82ea-3e11829b26cd
ID: 9df65894eb084ba3
Certificate Object, type = X.509 cert
label:
Certificate Object, type = X.509 cert
label: