Проблема с ENGINE_load_private_key и PKCS # 11 - PullRequest
1 голос
/ 03 июля 2019

Застряв в подписании (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:      

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Решением, по крайней мере, на данный момент, кажется, является просто удаление сертификатов CA из токена (через SAC Tools в Windows). После этого osslsigncode (через стек PKCS # 11) без проблем находит токен. Сертификаты CA не нужны для подписи, поэтому их удаление не представляет проблем.

0 голосов
/ 03 июля 2019

Похоже, вы НЕ авторизовались на токене. В pkcs11-tool используйте --login --pin <your-pin-code>, если вы хотите получить приватные объекты.

Следует отметить, что для подписи необходим соответствующий закрытый ключ (не сертификат).

...