рутокен ecp mac keychain

И новый вопрос.
Тут: http://dev.rutoken.ru/pages/viewpage.ac … Id=4227177 есть инструкция по работе с KeyChain. Однако возник вопрос о актуальности данной инструкции.
1. Пакета gemalto по указанной ссылке нет. При этом tokend видимо входит в состав пакета с динамической библиотекой для mac os x?
2. KeyChain определяет токен как RuToken ECP (ни слова о gemalto), но ps aux показывает, что запущен токенд гемальто:

(bash-3.2# ps aux | grep toke
_tokend           263   0,0  0,0  2472144   3524   ??  S     6:48     0:00.11 /System/Library/Security/tokend/RTPKCS11.tokend/Contents/MacOS/RTPKCS11 5 Aktiv Rutoken ECP 00 00 0c6409bb97f0000000000000000000000000000220000000f0000003b8b015275746f6b656e20445320c1000000000000000000000000000000000000)

Однако ключей/сертификатов KeyChain просто не видит. При этом:

localhost:~ darkstar$ pkcs11-tool --module=/usr/lib/librtpkcs11ecp.so -O
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:
  ID:         45
  Usage:      encrypt, verify, wrap
Certificate Object, type = X.509 cert
  label:
  ID:         45

Показывает пустой токен. Имеется ли у вас инструкция для macosx 10.9?

Re: рутокен ecp mac keychain

Каким-то неведомым образом сегодня оно само заработало, несмотря на то, что вчера вставлял-вытаскивал ключ много раз, а машину вообще не перезагружал. Все страньше и страньше.

(2014-03-19 12:42:16 отредактировано artscout)

Re: рутокен ecp mac keychain

Нет, все-таки одна небольшая проблемка есть. Порядок действий:
отформатировал рутокен в windows (кстати, а есть ли какие-либо сроки, когда будет доступна "родная" утилитка под мак?)
сгенерировал ключ rsa: pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45
далее в openssl генерирую сертификат:

OpenSSL> engine dynamic -pre SO_PATH:/Library/OpenSC/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/pkcs11/librtpkcs11ecp.dylib
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/Library/OpenSC/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:/usr/lib/pkcs11/librtpkcs11ecp.dylib
Loaded: (pkcs11) pkcs11 engine
OpenSSL> req -engine pkcs11 -new -key id_45 -keyform engine -x509 -out cert.pem -text -days 365
engine "pkcs11" set.
PKCS#11 token PIN:

сертификат сгенерирован, далее перекодирую в DER: openssl x509 -in cert.pem -inform pem -out cert.der -outform der
Записываю на токен: pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w cert.crt --id 45

И все бы хорошо, но виден только сам сертификат, ключ не видно. И, видимо, поэтому сертификат виден только при просмотре всех объектов и в список сертификатов "мои сертификаты" не попадает. Что тут можно сделать?

Re: рутокен ecp mac keychain

Вдогонку, pkcs11-tool тоже не показывает закрытые части, только публичный ключ и сам сертификат.

localhost:~ darkstar$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:
  ID:         45
  Usage:      encrypt, verify, wrap
Certificate Object, type = X.509 cert
  label:
  ID:         45

(2014-03-19 12:56:23 отредактировано artscout)

Re: рутокен ecp mac keychain

В конфигурации с использованием OpenSC + pkcs15 видно все, как в pkcs15-tool, так и в KeyChain. Но хочется работы именно с "родной" библиотекой, т.к. токен может использоваться еще в windows, с puttysc все работает прекрасно с токеном, инициализированным и настроенным как описано выше.

Re: рутокен ecp mac keychain

Доброго времени суток, artscout.

Действительно, инструкция по указанной вами ссылке немного устарела.
В настоящее время модуль Tokend устанавливается вместе с библиотекой librtpkcs11ecp.[dylib/so] посредством установщика библиотеки: https://www.rutoken.ru/support/download/get/?fid=19 .
Модуль Tokend -- наследство от Gemalto (http://smartcardservices.macosforge.org … end/PKCS11) -- имеет ряд ограничений, с которыми вы имели неудачу столкнуться. В частности, tokend, а в его задачу входит снабжение данными keychain-а, отображает только приватные ключи, для которых есть не корневой (not CA) сертификат x.509 с расширением keyUsage. Проверка выглядит примерно следующим образом (см. http://smartcardservices.macosforge.org … Token.cpp):

if (false == cert->isCA())
        {
            // If the current certificat is able to perform a cryptographic operation
            // attributes are taken from x.509 keyUsage extension
            if (cert->verify() || cert->verifyRecover() || cert->encrypt() || cert->wrap()) 
            {
                // Create a private key
            }
        }

Сертификат, созданный вами через openssl, не удовлетворяет ни первому, ни второму условию.

Вдогонку, pkcs11-tool не показывает приватные ключи в неавторизованной сессии, что вполне нормально. Так приватный ключ отображается:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -l user

(2014-03-21 11:35:08 отредактировано artscout)

Re: рутокен ecp mac keychain

Так. Вот тут я немножко не понял, что же мне дальше то делать? И почему self-signed certificate внезапно считается CA?

UPD

все. понял. действительно CA:TRUE. Пошел дальше разбираться

Re: рутокен ecp mac keychain

И благополучно запутался... ммм как же мне все правильно сделать? Создать отдельный CA, далее подсунуть csr подписаный ключом с токена в этот CA -это понятно. но как дальше на токен засовывать сертификат - ca то будет недоступен для проверки?

Re: рутокен ecp mac keychain

Здравствуйте, artscout.

Ваша задача может быть решена следующим образом.
1. Создадим CA

$ /usr/bin/openssl req -out ca.pem -new -x509
Generating a 1024 bit RSA private key
..............++++++
...........................................................................................................++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:a
Locality Name (eg, city) []:a
Organization Name (eg, company) [Internet Widgits Pty Ltd]:a
Organizational Unit Name (eg, section) []:a
Common Name (e.g. server FQDN or YOUR name) []:a
Email Address []:a

2. Создадим ключевую пару на токене:

$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:1024 -l --id 49 --label "I"

3. Создадим запрос на сертификат:

$ /usr/bin/openssl
openssl> engine dynamic -pre SO_PATH:/Library/OpenSC/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/librtpkcs11ecp.so
openssl> req -engine pkcs11 -keyform engine -key 49 -new -text -out newcert.csr -subj "/O=abc/O=users/O=abc/CN=Eugene Mironenko"

4. Создадим файл с расширением v3, где заполнена секция keyUsage:

$ echo "authorityKeyIdentifier=keyid,issuer">v3.ext
$ echo "basicConstraints=CA:FALSE">>v3.ext
$ echo "keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment">>v3.ext

и файл серийного номера

$ echo "00">file.srl

5. С помощью CA выпишем сертификат по запросу:

$ /usr/bin/openssl x509 -days 365 -req -in newcert.csr -extfile v3.ext -CA CA.pem -CAkey privkey.pem -CAserial file.srl -out cert.pem

6. Перекодируем сертификат:

$ /usr/bin/openssl x509 -in cert.pem -outform der -out cert.der

7. Записываем сертификат на токен:

$ pkcs11-tool --module  /usr/lib/librtpkcs11ecp.so -w cert.der --type cert --login --label "I" --id 49

Перетыкаем токен и смотрим в keychain.

Re: рутокен ecp mac keychain

Евгений, спасибо большое, сегодня попробую, если что сообщу =)

Re: рутокен ecp mac keychain

В общем сделал все описанным способом, сертификат/ключи опознаются (пришлось при этом добавить сертификат своего самосгенерированного CA в Keychain системы, чтобы сертификат проходил проверку). Далее начались следующие приключения:
Добавил сертификат с токена в sc_auth. Если перезагрузить MacOSX и на экране логина вставить токен, то все работает как надо - Password prompt меняется на PIN prompt и после введения оного благополучно входим в систему. Однако если мы заблокировали экран или пытаемся аутенфицироваться в процессе выполнения чего-либо, требующего привилегированного доступа - нас ждет полный облом, окно с вводом пароля/пин кода не появляется вообще, а в system.log появляется следующее сообщение:


Mar 27 11:46:44 localhost authorizationhost[17078]: ignorableRevocationStatusCode entered.
Mar 27 11:46:44 --- last message repeated 1 time ---
Mar 27 11:46:44 localhost authorizationhost[17078]: _CanIgnoreLeafStatusCodes return: true
Mar 27 11:46:44 localhost authorizationhost[17078]: -[__NSArrayM length]: unrecognized selector sent to instance 0x7f8f81e1c010
Mar 27 11:46:44 localhost authorizationhost[17078]: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM length]: unrecognized selector sent to instance 0x7f8f81e1c010'
        *** First throw call stack:
        (
                0   CoreFoundation                      0x00007fff8b19c25c __exceptionPreprocess + 172
                1   libobjc.A.dylib                     0x00007fff8e2d5e75 objc_exception_throw + 43
                2   CoreFoundation                      0x00007fff8b19f12d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
                3   CoreFoundation                      0x00007fff8b0fa3f2 ___forwarding___ + 1010
                4   CoreFoundation                      0x00007fff8b0f9f78 _CF_forwarding_prep_0 + 120
                5   CoreFoundation                      0x00007fff8b06fd48 CFStringCompareWithOptionsAndLocale + 72
                6   authorizationhost                   0x00000001061f43d9 SFBuiltinSmartCardSniffer_hint_user + 253
                7   CoreFoundation                      0x00007fff8b090b76 __CFDictionaryApplyFunction_block_invoke + 22
                8   CoreFoundation                      0x00007fff8b090b3c CFBasicHashApply + 124
                9   CoreFoundation                      0x00007fff8b090a8d CFDictionaryApplyFunction + 173
                10  authorizationhost                   0x00000001061f47a7 SFBuiltinSmartCardSniffer_hint_user + 1227
                11  authorizationhost                   0x00000001061f127c nullPluginCreate + 1345
                12  libdispatch.dylib                   0x00007fff92f0f2ad _dispatch_client_callout + 8
                13  libdispatch.dylib                   0x00007fff92f17b76 _dispatch_barrier_sync_f_slow_invoke + 46
                14  libdispatch.dylib                   0x00007fff92f0f2ad _dispatch_client_callout + 8
                15  libdispatch.dylib                   0x00007fff92f16f03 _dispatch_main_queue_callback_4CF + 333
                16  CoreFoundation                      0x00007fff8b103679 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
                17  CoreFoundation                      0x00007fff8b0be954 __CFRunLoopRun + 1636
                18  CoreFoundation                      0x00007fff8b0be0b5 CFRunLoopRunSpecific + 309
                19  Foundation                          0x00007fff900a8adc -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 253
                20  Foundation                          0x00007fff901914aa -[NSRunLoop(NSRunLoop) run] + 74
                21  authorizationhost                   0x00000001061f744b main + 284
                22  libdyld.dylib                       0x00007fff8b4125fd start + 1
        )
Mar 27 11:46:44 localhost ReportCrash[17079]: Metadata.framework [Error]: couldn't get the client port
Mar 27 11:46:44 localhost ReportCrash[17079]: DebugSymbols was unable to start a spotlight query: spotlight is not responding or disabled.
Mar 27 11:46:45 localhost com.apple.authd[37]: engine[17077]: evaluate returned -60008 returning errAuthorizationInternal
Mar 27 11:46:45 localhost com.apple.launchd[1] (com.apple.security.authhost.00000000-0000-0000-0000-0000000186A8[17078]): Job appears to have crashed: Abort trap: 6


куда по этому поводу писать я так и не нашел.

Re: рутокен ecp mac keychain

Здравствуйте, artscout.

Не могли бы вы подробней описать, как вы добились работы авторизации по смарткарте (пусть и рабочей не во всех режимах)? Меня в OS X 10.8 authorizationhost срезает на проверке цепочки сертификатов (хотя сертификат CA добавлен в System Keychain), с сообщениями:

authorizationhost[379]: validate chain started
authorizationhost[379]: validate chain completed with: 1

или

authorizationhost[379]: validate chain started
authorizationhost[379]: Certificate could not be verified: 5
authorizationhost[379]: validate chain completed with: 5

Было бы прекрасно, если бы вы поделились успешным опытом. Тем более, это может способствовать решению вашей проблемы.

(2014-04-25 17:52:53 отредактировано artscout)

Re: рутокен ecp mac keychain

Здравствуйте, Евгений.
Да все в общем-то просто, часть инструкции вы мне сами предоставили выше. Генерируем сертификат так, как описано выше. Далее необходимо экспортировать сертификат и ключ CA в формате pkcs12 и добавить их в связку "Система", далее сделать его доверенным. После чего проверка сертификата на токене проходит автоматически "на ура". Потом, соответственно, выполняем:

sc_auth hash
смотрим хеш сертификата на токене, выполняем
sc_auth accept -u <username> -h <hash>

Аутенфикация работает, но с ограничениями, описаными мною выше.