UBUNTU 12.04 32bit и Рутокен ЭЦП
Приобрел пару токенов Рутокен ЭЦП для бесчеловечных опытов над ними под linux. Пока не получается уговорить токен работать под ubuntu 12.04
Все используемые пакеты взяты из состава дистрибутива. Выявлено три проблемы, для одной из которых есть решение.
Проблема 1: Токен то виден софтвером, то не виден, и чаще всего не виден. 
Виновником является pcscd, который запускается в системе с параметром --auto-exits.
Решение: запретить автозавершение демона. В моем случае демон просто был запущен в терминале с параметром -f
Проблема 2: не работает в связке с openssl. 
Сценарий: ключевая пара создается в токене, далее при помощи openssl генерируется запрос на сертификат, готовый сертификат X509 размещается в токене.
Сценарий ломается в момент приготовления запроса на сертификат:
# Форматирование токена
$ pkcs15-init --erase-card
$ pkcs15-init --create-pkcs15 --so-pin "admin-1234" --so-puk ""
$ pkcs15-init --store-pin --label "User" --auth-id 02 --pin "7890" --puk "" --so-pin "admin-1234"
# Генерация ключевой пары
$ pkcs15-init --generate-key rsa/2048 --auth-id 02 --pin "7890"
# Дамп токена
$ pkcs15-tool -D
Using reader with a card: Generic CCID Reader 00 00
PKCS#15 Card [Rutoken ECP]:
    Version        : 0
    Serial number  : 000000002CC18B75
    Manufacturer ID: Aktiv Co.
    Last update    : 20120616123105Z
    Flags          : EID compliant
PIN [Security Officer PIN]
    Object Flags   : [0x3], private, modifiable
    ID             : 01
    Flags          : [0x99], case-sensitive, unblock-disabled, initialized, soPin
    Length         : min_len:8, max_len:32, stored_len:32
    Pad char       : 0x00
    Reference      : 1
    Type           : ascii-numeric
PIN [User]
    Object Flags   : [0x3], private, modifiable
    ID             : 02
    Flags          : [0x19], case-sensitive, unblock-disabled, initialized
    Length         : min_len:4, max_len:32, stored_len:32
    Pad char       : 0x00
    Reference      : 2
    Type           : ascii-numeric
Private RSA Key [Private Key]
    Object Flags   : [0x3], private, modifiable
    Usage          : [0x4], sign
    Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    ModLength      : 2048
    Key ref        : 1 (0x1)
    Native         : yes
    Path           : 3f001000100060020001
    Auth ID        : 02
    ID             : e104850aadc59a9442cae976f758870c3c34269a
    GUID           : {e104850a-adc5-9a94-42ca-e976f758870c}
Public RSA Key [Private Key]
    Object Flags   : [0x2], modifiable
    Usage          : [0x4], sign
    Access Flags   : [0x0]
    ModLength      : 2048
    Key ref        : 0
    Native         : no
    Path           : 3f0050000200
    ID             : e104850aadc59a9442cae976f758870c3c34269a
# Генерация запроса на сертификат
$ openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:opensc-pkcs11.so
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
OpenSSL> req -engine pkcs11 -new -key slot_1-id_e104850aadc59a9442cae976f758870c3c34269a -keyform engine -x509 -out cert.pem -text
engine "pkcs11" set.
PKCS#11 token PIN: 
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]:Moscow
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:iAr
Common Name (e.g. server FQDN or YOUR name) []:User
Email Address []:long@iAr.com
3073771720:error:8000A005:Vendor defined:PKCS11_rsa_sign:General Error:p11_ops.c:131:
3073771720:error:0D0DC006:asn1 encoding routines:ASN1_item_sign_ctx:EVP lib:a_sign.c:314:
error in req
OpenSSL> 
Собственно все, дальше пока пройти не удалось. Если у кого есть идеи, то буду весьма признателен.
Проблема 3. Ключи и сертификаты успешно залиты в токен, но аутентификация не работает.
Сценарий: ключевые пары, запрос на сертификат, сертификат - все сгенерено где-то на стороне, приехало к токену в виде трех файлов в PEM формате key.pem, cert.pem, cacert.pem. Ключи и сертификаты заливаются в токен. Настраивается pam аутентификация через pam_p11.
Сценарий отрабатывает до конца, токен система видит, ПИН запрашивается, но аутентификация не проходит. При подключения токена к firefox видны оба сертификата: и персональный и УЦ, после сдандартных пассов с сертификатом УЦ, персональный даже успешно проходит проверку.
# Форматирование токена
$ pkcs15-init --erase-card
$ pkcs15-init --create-pkcs15 --so-pin "admin-1234" --so-puk ""
$ pkcs15-init --store-pin --label "User" --auth-id 02 --pin "7890" --puk "" --so-pin "admin-1234"
# Загрузка ключей и сертификатов
$ pkcs15-init --store-certificate cacert.pem --authority
$ pkcs15-init --store-private-key key.pem --auth-id 02 --id 45 --pin "7890"
$ pkcs15-init --store-certificate cert.pem --auth-id 01 --id 45 --pin "7890"
# Дамп содержимого токена
$ pkcs15-tool -D
Using reader with a card: Generic CCID Reader 00 00
PKCS#15 Card [Rutoken ECP]:
    Version        : 0
    Serial number  : 000000002CC18B75
    Manufacturer ID: Aktiv Co.
    Last update    : 20120616131959Z
    Flags          : EID compliant
PIN [Security Officer PIN]
    Object Flags   : [0x3], private, modifiable
    ID             : 01
    Flags          : [0x99], case-sensitive, unblock-disabled, initialized, soPin
    Length         : min_len:8, max_len:32, stored_len:32
    Pad char       : 0x00
    Reference      : 1
    Type           : ascii-numeric
PIN [User]
    Object Flags   : [0x3], private, modifiable
    ID             : 02
    Flags          : [0x19], case-sensitive, unblock-disabled, initialized
    Length         : min_len:4, max_len:32, stored_len:32
    Pad char       : 0x00
    Reference      : 2
    Type           : ascii-numeric
Private RSA Key [Private Key]
    Object Flags   : [0x3], private, modifiable
    Usage          : [0x4], sign
    Access Flags   : [0x0]
    ModLength      : 2048
    Key ref        : 1 (0x1)
    Native         : yes
    Path           : 3f001000100060020001
    Auth ID        : 02
    ID             : 45
Public RSA Key [Public Key]
    Object Flags   : [0x2], modifiable
    Usage          : [0x4], sign
    Access Flags   : [0x0]
    ModLength      : 2048
    Key ref        : 0
    Native         : no
    Path           : 3f0050000200
    ID             : 45
X.509 Certificate [Certificate]
    Object Flags   : [0x2], modifiable
    Authority      : yes
    Path           : 3f0050000300
    ID             : 58413358ef962c7fb205b222c4d713f11d733549
    GUID           : {58413358-ef96-2c7f-b205-b222c4d713f1}
    Encoded serial : 02 09 00CD17FC562F4D30AB
X.509 Certificate [Certificate]
    Object Flags   : [0x2], modifiable
    Authority      : no
    Path           : 3f0050000301
    ID             : 45
    Encoded serial : 02 01 01
# Подготовка инфраструктуры для pam_p11
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ pkcs15-tool -r 45 > ~/.eid/authorized_certificates
# Проверка
$ sudo -s
Password for token Rutoken ECP (User):
[sudo] password for xxx:
#
Была попытка использовать токен, но попытка не удалась. Смотрим логи syslog, auth.log:
Jun 16 18:07:04 long-d pcscd: dyn_unix.c:81:DYN_GetAddress() IFDHCreateChannelByName: /usr/lib/pcsc/drivers/openct-ifd.bundle/Contents/Linux/openct-ifd.so: undefined symbol: IFDHCreateChannelByName
Jun 16 18:07:09 long-d sudo: pam_p11_opensc(sudo:auth): fatal: pkcs11_sign failed
Jun 16 18:07:10 long-d ifdhandler[19315]: packet too large for buffer
Не густо, но понятно, что не удалась попытка подписать сообщение. Дальше в этом посте описание безуспешных попыток что-либо подписать с помощью токена, дамп сертификата, который залит в токен.
# Тест токена
$ pkcs11-tool --module opensc-pkcs11.so --login --pin 7890 --slot 1 -t
C_SeedRandom() and C_GenerateRandom():
  seeding (C_SeedRandom) not supported
  seems to be OK
Digests:
  all 4 digest functions seem to work
  MD5: OK
  SHA-1: OK
  RIPEMD160: OK
Signatures (currently only RSA signatures)
  testing key 0 (Private Key) 
error: PKCS11 function C_SignInit failed: rv = CKR_KEY_TYPE_INCONSISTENT (0x63)
Aborting.
# Проверка возможностей токена
$ pkcs11-tool --module opensc-pkcs11.so --login --pin 7890 --slot 1 -M
Supported mechanisms:
  SHA-1, digest
  SHA256, digest
  SHA384, digest
  SHA512, digest
  MD5, digest
  RIPEMD160, digest
  GOSTR3411, digest
  GOSTR3410, keySize={256,256}, hw, decrypt, sign, verify
  RSA-X-509, keySize={256,2048}, hw, decrypt, sign, verify
  RSA-PKCS, keySize={256,2048}, hw, decrypt, sign, verify
  SHA1-RSA-PKCS, keySize={256,2048}, sign, verify
  SHA256-RSA-PKCS, keySize={256,2048}, sign, verify
  MD5-RSA-PKCS, keySize={256,2048}, sign, verify
  RIPEMD160-RSA-PKCS, keySize={256,2048}, sign, verify
  RSA-PKCS-KEY-PAIR-GEN, keySize={256,2048}, generate_key_pair
# Проверим как работает хэш
$ pkcs11-tool --module opensc-pkcs11.so --login --pin 7890 --slot 1 -h -m GOSTR3411 -i index.txt -o index.txt.hash
$ pkcs11-tool --module opensc-pkcs11.so --login --pin 7890 --slot 1 -h -m SHA-1 -i index.txt -o index.txt.sha1 
# Проверим подпись
$ pkcs15-crypt --sign --sha-1 --pkcs1 -k 45 -p 7890 -i index.txt.sha1
Using reader with a card: Generic CCID Reader 00 00
Compute signature failed: Card command failed
УПС...
Дамп сертификата:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RU, ST=Moscow, L=Moscow, O=Test corp., OU=iAr, CN=Test CA/emailAddress=ca@iAr.com
        Validity
            Not Before: Jun 16 13:04:52 2012 GMT
            Not After : Jun 16 13:04:52 2013 GMT
        Subject: C=RU, ST=Moscow, L=Moscow, O=Test corp., OU=iAr, CN=User/emailAddress=user@iAr.test.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:aa:6d:11:62:57:45:4d:9a:a7:bf:51:2f:d8:af:
                    7f:a5:12:3e:71:ce:8b:06:0b:33:30:22:dd:b6:e5:
                    b1:04:80:1b:a8:89:46:9d:e9:e7:ca:33:d1:68:fa:
                    f0:74:3d:96:8a:5f:d5:76:65:ad:c6:cc:d6:e3:bf:
                    42:7d:ce:25:40:a0:d1:2c:0f:2f:6d:01:d2:2f:76:
                    cd:74:6d:c4:f3:06:bb:9a:65:51:d1:45:b4:6c:82:
                    1d:9f:da:8a:5f:6b:63:8b:4c:6d:03:ab:df:bc:5e:
                    cd:51:bb:96:f0:37:11:45:ec:bf:ba:5d:65:40:05:
                    49:35:72:1d:0c:26:28:42:4f:6e:3b:54:04:2d:86:
                    6a:2c:01:8c:4b:a0:d8:b9:04:84:b5:2d:7b:79:09:
                    b6:64:bd:16:3f:ac:c8:42:65:ad:67:ca:65:69:c9:
                    e4:df:4f:bc:74:ec:41:2e:59:14:1d:19:c5:9f:8d:
                    94:86:49:67:62:72:ec:55:2b:81:2e:83:c1:cb:20:
                    6c:bc:77:09:00:c5:63:1e:fa:1c:da:58:2c:a2:c8:
                    a8:54:70:d9:cb:0f:02:6c:79:da:b2:7f:6c:0a:36:
                    f0:4e:a0:31:91:d9:77:c5:f0:97:2a:5f:50:07:6d:
                    55:90:84:39:57:5f:04:c4:20:db:8d:90:46:6b:c1:
                    d4:09
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Client, S/MIME, Object Signing
            X509v3 Subject Key Identifier: 
                20:1D:D4:42:BB:4B:A4:5A:4B:B8:06:A9:8A:85:B1:CB:A4:34:C3:E9
            X509v3 Authority Key Identifier: 
                keyid:61:9F:2F:DA:35:AE:AC:71:D7:C8:48:E4:90:AC:93:7C:25:F0:B0:7E
                DirName:/C=RU/ST=Moscow/L=Moscow/O=Test corp./OU=iAr/CN=Test CA/emailAddress=ca@iAr.com
                serial:CD:17:FC:56:2F:4D:30:AB
            X509v3 Issuer Alternative Name: 
                email:ca@iAr.com
            X509v3 Subject Alternative Name: 
                email:user@iAr.test.com
            X509v3 Key Usage: 
                Digital Signature, Key Encipherment
    Signature Algorithm: sha1WithRSAEncryption
         9f:6d:1e:bc:0f:7d:b9:4e:24:34:ee:ee:bc:41:ff:64:2d:63:
         4a:c1:72:6a:fa:a3:e0:05:4b:8d:6e:0d:a5:8c:b5:3d:f4:93:
         a8:63:2e:56:1a:36:b2:43:1f:bb:ac:ee:bb:4d:24:22:16:34:
         b5:7f:24:6c:e0:8a:a4:d8:e6:11:a3:73:fc:bb:db:77:98:51:
         de:18:12:48:cf:05:16:7e:d0:48:69:bf:19:07:d1:a1:b3:07:
         21:0e:3f:72:6d:ad:b8:68:41:22:52:c9:23:c8:f8:d6:6e:4b:
         40:4c:43:26:f0:83:6d:a3:8f:32:d9:1a:f6:09:14:26:c5:9d:
         d8:cc:1f:cd:2c:53:62:84:47:17:25:f6:4a:99:31:5c:bd:57:
         c2:41:a2:b0:e4:f3:35:34:bd:e5:f4:af:8f:e2:e9:cf:b4:1b:
         54:32:cc:39:c2:a0:33:ac:6c:97:87:a5:0b:e0:4d:65:4f:83:
         2a:c4:fd:2a:29:33:40:23:82:ab:0d:26:52:45:a7:e5:bc:e6:
         80:eb:23:65:a4:41:ad:ca:64:5b:3e:3c:40:56:42:62:1c:56:
         e5:15:75:f8:e6:df:35:3f:fc:c8:8d:be:e0:0a:89:16:0d:19:
         f8:1a:34:ab:5a:41:50:5f:d6:48:ef:88:bd:d7:18:32:9f:7c:
         06:20:9f:1e