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