ruToken + linux

Добрый день, возможно ли записывать ключи на токен под линуксом?

pkcs15-init -p rutoken -vvv --generate-key rsa --auth-id 02 пишет

[pkcs15-init] card-rutoken.c:229:rutoken_check_sw: required access right not granted
[pkcs15-init] card-rutoken.c:547:rutoken_create_file: returning with: Security status not satisfied
Failed to generate key: Security status not satisfied

Re: ruToken + linux

olfway пишет:

Добрый день, возможно ли записывать ключи на токен под линуксом?

pkcs15-init -p rutoken -vvv --generate-key rsa --auth-id 02 пишет

[pkcs15-init] card-rutoken.c:229:rutoken_check_sw: required access right not granted
[pkcs15-init] card-rutoken.c:547:rutoken_create_file: returning with: Security status not satisfied
Failed to generate key: Security status not satisfied

Rutoken поддерживает генерацию только ГОСТ ключей (pkcs15-init поддерживает только RSA). Для этого необходимо использовать утилиту rutoken-tool
Пример:
rutoken-tool –g –k 1 –pin ‘12345678’

Re: ruToken + linux

Vladimir Ivanov пишет:

Rutoken поддерживает генерацию только ГОСТ ключей (pkcs15-init поддерживает только RSA). Для этого необходимо использовать утилиту rutoken-tool
Пример:
rutoken-tool –g –k 1 –pin ‘12345678’

Но можно, используя PKCS#11 (opensc-pkcs11.so), не аппаратно сгенерировать RSA пару:
pkcs11-tool -k --pin "12345678" --key-type rsa:2048

Re: ruToken + linux

Да, действительно, ключ сгенерировать получается

pkcs11-tool --keypairgen --key-type rsa:2048 --login --label "user" --id 1
Please enter User PIN:
Key pair generated:
Private Key Object; RSA
  label:      user
  ID:         01
  Usage:      decrypt, sign, unwrap
Public Key Object; RSA 2048 bits
  label:      user
  ID:         01
  Usage:      encrypt, verify, wrap

Но когда я пытаюсь сгенерировать запрос на сертификат получаю ошибку

openssl req -engine pkcs11 -keyform engine -key 1 -new -text -out newcert.csr -subj "CN=User"
engine "pkcs11" set.
PKCS#11 token PIN:
[opensc-pkcs11] card-rutoken.c:1202:sign_ext: error:80009404:PKCS11 library:PKCS11_rsa_encrypt:Not supported
[opensc-pkcs11] sec.c:53:sc_compute_signature: returning with: Internal error
[opensc-pkcs11] pkcs15-sec.c:273:sc_pkcs15_compute_signature: sc_compute_signature() failed: Internal error
14137:error:8000A005:lib(128):func(10):reason(5):p11_ops.c:97:
14137:error:0D0C3006:lib(13):func(195):reason(6):a_sign.c:276:

т.е. использовать сгенерёный ключ я не могу так как токен не поддерживает rsa?

Пробовал записать существующий сертификат на токен:

pkcs11-tool --write-object usercrt.der --type cert --login --id 1 --label "User VPN"
Please enter User PIN:
error: PKCS11 function C_CreateObject failed: rv = CKR_ATTRIBUTE_VALUE_INVALID (0x13)

В итоге хочется использовать токен для авторизации в OpenVPN, это возможно?

Или единственный вариант собирать openssl/openvpn с поддержкой ГОСТа?

Re: ruToken + linux

olfway пишет:

Но когда я пытаюсь сгенерировать запрос на сертификат получаю ошибку

openssl req -engine pkcs11 -keyform engine -key 1 -new -text -out newcert.csr -subj "CN=User"
engine "pkcs11" set.
PKCS#11 token PIN:
[opensc-pkcs11] card-rutoken.c:1202:sign_ext: error:80009404:PKCS11 library:PKCS11_rsa_encrypt:Not supported

Какие у Вас версии OpenSSL, OpenSC (rutoken) и "Engine PKCS#11"?

olfway пишет:

т.е. использовать сгенерёный ключ я не могу так как токен не поддерживает rsa?

Можете, только это будут не аппаратные операции.

olfway пишет:

Пробовал записать существующий сертификат на токен:

pkcs11-tool --write-object usercrt.der --type cert --login --id 1 --label "User VPN"
Please enter User PIN:
error: PKCS11 function C_CreateObject failed: rv = CKR_ATTRIBUTE_VALUE_INVALID (0x13)

Можно посмотреть на usercrt.der или на лог (при "debug = 4;" в etc/opensc.conf)? Rutoken должен поддерживать эту операцию.

olfway пишет:

В итоге хочется использовать токен для авторизации в OpenVPN, это возможно?
Или единственный вариант собирать openssl/openvpn с поддержкой ГОСТа?

Использовать RSA возможно, если совместимы версии OpenVPN и OpenSC.

Re: ruToken + linux

_S пишет:
olfway пишет:

Но когда я пытаюсь сгенерировать запрос на сертификат получаю ошибку

openssl req -engine pkcs11 -keyform engine -key 1 -new -text -out newcert.csr -subj "CN=User"
engine "pkcs11" set.
PKCS#11 token PIN:
[opensc-pkcs11] card-rutoken.c:1202:sign_ext: error:80009404:PKCS11 library:PKCS11_rsa_encrypt:Not supported

Какие у Вас версии OpenSSL, OpenSC (rutoken) и "Engine PKCS#11"?

openssl=0.9.8g
engine_pkcs11=0.1.4
openct=0.6.14 и opensc=0.11.4

_S пишет:
olfway пишет:

Пробовал записать существующий сертификат на токен:

pkcs11-tool --write-object usercrt.der --type cert --login --id 1 --label "User VPN"
Please enter User PIN:
error: PKCS11 function C_CreateObject failed: rv = CKR_ATTRIBUTE_VALUE_INVALID (0x13)

Можно посмотреть на usercrt.der или на лог (при "debug = 4;" в etc/opensc.conf)? Rutoken должен поддерживать эту операцию.

вывод с debug=4

Re: ruToken + linux

-----BEGIN CERTIFICATE-----
MIIE3zCCA8egAwIBAgIBAzANBgkqhkiG9w0BAQUFADCBmDELMAkGA1UEBhMCUlUx
DzANBgNVBAgTBlJ1c3NpYTEPMA0GA1UEBxMGTW9zY293MRcwFQYDVQQKEw5NYXRy
aXggVGVsZWNvbTEWMBQGA1UECxMNSVQgRGVwYXJ0bWVudDEaMBgGA1UEAxMRTWF0
cml4IFRlbGVjb20gQ0ExGjAYBgkqhkiG9w0BCQEWC3Jvb3RAbXR4LnJ1MB4XDTA4
MDIyODEwNTA1N1oXDTE4MDIyNTEwNTA1N1owejELMAkGA1UEBhMCUlUxDzANBgNV
BAgTBlJ1c3NpYTEPMA0GA1UEBxMGTW9zY293MRAwDgYDVQQKEwdDb21wYW55MQsw
CQYDVQQLEwJJVDENMAsGA1UEAxMEVXNlcjEbMBkGCSqGSIb3DQEJARYMdXNlckBt
YWlsLnJ1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3pCp+C48sCwd
x9q7/HZzhwY6fu7+9bvGF3xoqhurVe/5KKsLOkj3c2pbLmsEr04afPXqv9n6o4gJ
zr7X5xE9U0kwzLnqvg7lNgHhvQ7FI10OOhcBLiJbGTYmk1812urJ7tauA0tOTirv
aPKDuVXn7is08mbOop55nLUY8imX3X/d4b1KD8XLVjbgY7N+pn1YmR01/uimaYkX
QPhtCatKW21jmT9NDbELnaoX/9KUudC7l9yt4Jlezy58wTr3Dw4vnxIE6UhyLWUd
yNuaDA/rHQIeJJT0lkuf7KZpEQj2mG6Is3clopcMp1xYjinEyEiMzsHNo4MJ2N6q
Wn/ExXQbNQIDAQABo4IBTzCCAUswCQYDVR0TBAIwADAtBglghkgBhvhCAQ0EIBYe
RWFzeS1SU0EgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBSt26zoe/6V
fKCWNNDk6EvPLmX7fjCBzQYDVR0jBIHFMIHCgBRWiGMVT/gOzqrbIm1tXuBVy7xi
5aGBnqSBmzCBmDELMAkGA1UEBhMCUlUxDzANBgNVBAgTBlJ1c3NpYTEPMA0GA1UE
BxMGTW9zY293MRcwFQYDVQQKEw5NYXRyaXggVGVsZWNvbTEWMBQGA1UECxMNSVQg
RGVwYXJ0bWVudDEaMBgGA1UEAxMRTWF0cml4IFRlbGVjb20gQ0ExGjAYBgkqhkiG
9w0BCQEWC3Jvb3RAbXR4LnJ1ggkAqVFiPKeWNBQwEwYDVR0lBAwwCgYIKwYBBQUH
AwIwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4IBAQCzzjpFrZwNpKBoV9kq
NyPUx48g6syd0vlwDAFTTBHW/n8p1128PIzIb2/kyN/BH8UurhT9idU5/04sJ183
oTl3GNRtILzwLL29n2BFJoLzcEfXW+JR1ur36D7cozLNJHEK4/j2G048rP8tTZCx
NDYMLuFT+1gl0Qd/2NB4npCLCsXR3D7s0McreZ+7gOAki0Iat2LCpzK5D8/0UP0u
R2CvXpxl1Hz3tMh74/4l8zjrOV+RQuLIrmXNJbDH/4G1IW1TWeDNTZgJxQV8mk1c
uYiap5+MGuKUZyQUYDAyenAZDNJR39ISnUYodXMWLba8q8kHNbkDnkNiaiCfOTPG
tt6u
-----END CERTIFICATE-----

Re: ruToken + linux

openssl req -engine pkcs11 -keyform engine -key 1 -new -text -out newcert.csr -subj "/CN=User"
engine "pkcs11" set.
PKCS#11 token PIN:
[opensc-pkcs11] card-rutoken.c:1202:sign_ext: error:80009404:PKCS11 library:PKCS11_rsa_encrypt:Not supported
[opensc-pkcs11] sec.c:53:sc_compute_signature: returning with: Internal error
[opensc-pkcs11] pkcs15-sec.c:273:sc_pkcs15_compute_signature: sc_compute_signature() failed: Internal error
14137:error:8000A005:lib(128):func(10):reason(5):p11_ops.c:97:
14137:error:0D0C3006:lib(13):func(195):reason(6):a_sign.c:276:

у кого-нибудь это работает?

Re: ruToken + linux

olfway пишет:

у кого-нибудь это работает?

$pkcs11-tool --keypairgen --key-type rsa:2048 --login --label "user" --id 1
...
OpenSSL> engine dynamic -pre SO_PATH:/usr/local/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/local/lib/opensc-pkcs11.so
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/local/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:/usr/local/lib/opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
OpenSSL> req -engine pkcs11 -keyform engine -key 1 -new -text -out newcert.csr -subj "/CN=User"
engine "pkcs11" set.
PKCS#11 token PIN:
OpenSSL> version
OpenSSL 0.9.8g 19 Oct 2007

Для приведенного вами сертификата:

$openssl x509 -in cert1 -outform DER -out cert1.der
$pkcs11-tool --write-object cert1.der --type cert --login --id 1 --label "user"
Please enter User PIN:
Generated certificate:
Certificate Object, type = X.509 cert
  label:      user
  ID:         01

Re: ruToken + linux

opensc/openct с сайта или из дистрибутива?

Re: ruToken + linux

olfway пишет:

opensc/openct с сайта или из дистрибутива?

Пакеты собирал, патчи отсюда https://www.rutoken.ru/download/softwar … openct.zip
openct-0.6.14-0.6.14.rutoken-0.1.0.diff.gz
opensc-0.11.4-0.11.4.rutoken-0.2.2.diff.gz

olfway пишет:

Но когда я пытаюсь сгенерировать запрос на сертификат получаю ошибку
openssl req -engine pkcs11 -keyform engine -key 1 -new -text -out newcert.csr -subj "CN=User"
[opensc-pkcs11] card-rutoken.c:1202:sign_ext: error:80009404:PKCS11 library:PKCS11_rsa_encrypt:Not supported

Может при сборке OpenSC использовалась какая-то другая версия OpenSSL?

olfway пишет:

Пробовал записать существующий сертификат на токен
pkcs11-tool --write-object usercrt.der --type cert --login --id 1 --label "User VPN"
error: PKCS11 function C_CreateObject failed: rv = CKR_ATTRIBUTE_VALUE_INVALID (0x13)

Странно по логу, может поможет какая-то косвенно влияющая информация (версия токена, компилятора, параметры сборки, платформа и т. д.)?

(2008-04-02 17:30:09 отредактировано _S)

Re: ruToken + linux

Pavel Shramov пишет:
--- a/src/libopensc/card-rutoken.c
+++ b/src/libopensc/card-rutoken.c
@@ -1192,7 +1192,7 @@ static int sign_ext(sc_card_t *card, const u8 *data, size_t len, u8 *out, size_t
        ret = extract_key(card, &pkey);
        if (ret == SC_SUCCESS)
        {
-               r = RSA_private_encrypt(len, data, out, pkey->pkey.rsa, RSA_PKCS1_PADDING);
+               r = RSA_PKCS1_SSLeay()->rsa_priv_enc(len, data, out, pkey->pkey.rsa, RSA_PKCS1_PADDING);
                if ( r < 0)
                {
                        ret = SC_ERROR_INTERNAL;
@@ -1221,7 +1221,7 @@ static int decipher_ext(sc_card_t *card, const u8 *data, size_t len, u8 *out, si
        ret = extract_key(card, &pkey);
        if (ret == SC_SUCCESS)
        {
-               ret = RSA_private_decrypt(len, data, out, pkey->pkey.rsa, RSA_PKCS1_PADDING);
+               ret = RSA_PKCS1_SSLeay()->rsa_priv_dec(len, data, out, pkey->pkey.rsa, RSA_PKCS1_PADDING);
                if ( ret < 0)
                {
                        ret = SC_ERROR_INTERNAL;