Re: TLS с помощью RSA ключа на Рутокен ЭЦП

OpenSSL> req -engine rtengine -new -key 0:3132 -keyform engine -x509 -out cert.crt -outform DER
engine "rtengine" set.
Can't open C:\Program Files\Common Files\SSL/openssl.cnf for reading, No error
11904:error:02001003:system library:fopen:No such process:crypto\bio\bss_file.c:69:fopen('C:\Program Files\Common Files\SSL/openssl.cnf','r')
11904:error:2006D080:BIO routines:BIO_new_file:no such file:crypto\bio\bss_file.c:76:
error in req

Эта ошибка как раз подтверждает, что утилита req не может существовать без openssl.cnf. Просто если вы загружаете rtengine через dynamic engine, в openssl.cnf не должно быть упоминаний/загрузки rtengine, но могут быть все прочие настройки.

(2024-09-16 19:33:01 отредактировано Ахат)

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

Добавил в конфиг:

# Настройки создания запросов на сертификат
[req]
prompt = no
distinguished_name = req_distinguished_name
req_extensions = ext

# Сведения о владельце сертификата
[req_distinguished_name]
countryName = RU
commonName = Ivanov
emailAddress = ivanov@mail.ru
stateOrProvinceName = Moscow

# Расширения сертификата
[ext]
subjectSignTool = ASN1:FORMAT:UTF8,UTF8String:СКЗИ \"Рутокен ЭЦП 2.0\"
extendedKeyUsage=emailProtection
keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment

Самоподписанный успешно создался:

c:\test\openssl_1.1>.\openssl.exe
OpenSSL> req -engine rtengine -new -key pkcs11:id=12 -keyform engine -x509 -out cert.crt -outform DER
engine "rtengine" set.
Enter PKCS#11 token PIN:
OpenSSL> exit

Но если задавать переменную OPENSSL_CONF и такой конфиг, то ломается pkcs11-tool:

C:\distr\OpenSC Project\OpenSC\tools>.\pkcs11-tool.exe --module rtPKCS11ECP.dll -T
Auto configuration failed
4480:error:25078067:DSO support routines:WIN32_LOAD:could not load the shared library:.\crypto\dso\dso_win32.c:172:filename(c:\test\openssl_1.1\rtengine.dll)
4480:error:25070067:DSO support routines:DSO_load:could not load the shared library:.\crypto\dso\dso_lib.c:244:
4480:error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:.\crypto\engine\eng_dyn.c:450:
4480:error:0E07606D:configuration file routines:MODULE_RUN:module initialization error:.\crypto\conf\conf_mod.c:235:module=engines, value=engine_section, retcode=-1

Если не задавать OPENSSL_CONF, то pkcs11-tool работает, но после добавления сертификата не видит публичный RSA ключ как отдельный объект:

C:\distr\OpenSC Project\OpenSC\tools>.\pkcs11-tool.exe --module rtPKCS11ECP.dll -l -y cert -w C:\test\openssl_1.1\cert.crt --id 3132
Using slot 0 with a present token (0x0)
Logging in to "Rutoken ECP <no label>".
Please enter User PIN: Created certificate:
Certificate Object, type = X.509 cert
  label:
  ID:         3132

C:\distr\OpenSC Project\OpenSC\tools>.\pkcs11-tool.exe --module rtPKCS11ECP.dll -O
Using slot 0 with a present token (0x0)
Public Key Object; GOSTR3410
  PARAMS OID: 06072a850302022400
  VALUE:      9e46b532be4c3124fd6b9aadf518fd343ea7738a2f49cd2d7d7bc6681f9c61d7
              a88a788152af3b51bcf6cbd62c28d6336f39f0da9ca2cb4a120a42933358357f
  label:      24071601
  ID:         24071601
  Usage:      verify
Public Key Object; GOSTR3410
  PARAMS OID: 06072a850302022400
  VALUE:      9e8d052fff3a9acf168c1718a694fbfb22df5939c461ce03794abfec58000452
              b633898b2276e12b3c165f41d2c1a22187e5b2a8b1070e14cd456e5829f78f2e
  label:      24071602
  ID:         24071602
  Usage:      verify
Certificate Object, type = X.509 cert
  label:      24071601
  ID:         24071601
Certificate Object, type = X.509 cert
  label:
  ID:         3132

- по данному выводу не ясно есть ли соответствующие ключи или сертификат без ключей.
В ПУР данный сертификат отображается в разделе Сертификаты с ключами.
Но бывает, что в ПУР RSA сертификат (не данный, другой) тоже не отображается в разделе "Сертификаты с ключами", а отображается в разделе "Сертификаты", при этом ключевая пара есть. Это зависит только от версии ПУР?

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

Но если задавать переменную OPENSSL_CONF и такой конфиг, то ломается pkcs11-tool:

Это интересное поведение. Не подскажете версию opensc? Мой pkcs11-tool (opensc 0.25.1) как будто не зависит от переменной OPENSSL_CONF.

Если не задавать OPENSSL_CONF, то pkcs11-tool работает, но после добавления сертификата не видит публичный RSA ключ как отдельный объект:

Еще одно интересное поведение. Как появились RSA-ключи на токене? Существовал ли изначально публичный ключ или был только приватный? Есть вывод pkcs11-tool -O -l до импорта сертификата?

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

Не подскажете версию opensc?

Да, древняя, за 2012 год. На свежей в линуксе:

$ pkcs11-tool --module librtpkcs11ecp.so -O
Using slot 0 with a present token (0x0)
Public Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022400
  VALUE:      9e46b532be4c3124fd6b9aadf518fd343ea7738a2f49cd2d7d7bc6681f9c61d7
              a88a788152af3b51bcf6cbd62c28d6336f39f0da9ca2cb4a120a42933358357f
  label:      24071601
  ID:         24071601
  Usage:      verify
  Access:     local
Public Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022400
  VALUE:      9e8d052fff3a9acf168c1718a694fbfb22df5939c461ce03794abfec58000452
              b633898b2276e12b3c165f41d2c1a22187e5b2a8b1070e14cd456e5829f78f2e
  label:      24071602
  ID:         24071602
  Usage:      verify
  Access:     local
Certificate Object; type = X.509 cert
  label:      24071601
  subject:    DN: SNILS=11223344595/......
  serial:     7C00159B7EEC95EF69F8C1798A000800159B7E
  ID:         24071601
Certificate Object; type = X.509 cert
  label:      
  subject:    DN: C=RU, CN=Ivanov/emailAddress=ivanov@mail.ru, ST=Moscow
  serial:     5F197D3E4598875D2BB0897B36D27A8D19B2F17F
  ID:         3132
Public Key Object; RSA 2048 bits
  label:      
  ID:         3132
  Usage:      encrypt, verify, wrap
  Access:     local

Как появились RSA-ключи на токене?

Ключи появились по https://dev.rutoken.ru/pages/viewpage.a … =132777032

pkcs11-tool --module rtpkcs11ecp.dll --keypairgen --key-type rsa:2048 -l --id 3132

В винде s_client почему-то требует доверия к сертификату:

OpenSSL> s_client -host localhost -port 8443 -cert c:\test\openssl_1.1\cert.crt -keyform engine -key "pkcs11:id=12" -engine rtengine
engine "rtengine" set.
Enter PKCS#11 token PIN:
unable to load certificate
9976:error:0909006C:PEM routines:get_name:no start line:crypto\pem\pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
error in s_client

Данный сертификат добавил в Доверенные корневые виндового хранилища, результат не поменялся.
В линуксе такой ошибки не было, хотя там использовалась не rtengine, а libp11 и libpkcs11 из https://github.com/OpenSC/libp11/tree/master - это сказано в инструкции https://dev.rutoken.ru/pages/viewpage.a … =132777032
Верно ли я понял, что rtengine-1.6 или новее можно использовать для RSA ключей вместо libp11+libpkcs11 и в линуксе?

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

> В винде s_client почему-то требует доверия к сертификату:

Скорее всего, ваш сертификат в der-кодировке, а s_client ожидает PEM. Примерно такая команда перекодирует в PEM:


openssl x509 -in c:\test\openssl_1.1\cert.crt -inform DER -out c:\test\openssl_1.1\cert.pem

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

Ахат пишет:

Верно ли я понял, что rtengine-1.6 или новее можно использовать для RSA ключей вместо libp11+libpkcs11 и в линуксе?

Да, верно. Функциональность rtengine одинакова вне зависимости от платформы. Только следует учитывать, что опции конфигурации OPENSSL и способ указания идентификаторов ключей у rtengine и у engine_pkcs11 могут отличаться. В отношении rtengine можно ориентироваться на https://dev.rutoken.ru/pages/viewpage.a … d=43450394

(2024-09-17 17:13:09 отредактировано Ахат)

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

Евгений Мироненко пишет:

>Скорее всего, ваш сертификат в der-кодировке, а s_client ожидает PEM. Примерно такая команда перекодирует в PEM:


openssl x509 -in c:\test\openssl_1.1\cert.crt -inform DER -out c:\test\openssl_1.1\cert.pem

Да, помогло, благодарю за ответы. Дальше ошибка "ee key too small", хотя ключи 2048 бит.

c:\test\openssl_1.1>.\openssl.exe x509 -in c:\test\openssl_1.1\cert.crt -inform DER -out c:\test\openssl_1.1\cert.pem

c:\test\openssl_1.1>set OPENSSL_CONF=C:\test\openssl_1.1\openssl.cnf

c:\test\openssl_1.1>.\openssl.exe
OpenSSL> s_client -host localhost -port 8443 -cert c:\test\openssl_1.1\cert.pem -keyform engine -key "pkcs11:id=12" -engine rtengine
engine "rtengine" set.
Enter PKCS#11 token PIN:
error setting certificate
5564:error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small:ssl\ssl_rsa.c:301:
error in s_client
OpenSSL> exit

c:\test\openssl_1.1>type .\cert.pem
-----BEGIN CERTIFICATE-----
MIIDIzCCAgsCFF8ZfT5FmIddK7CJezbSeo0ZsvF/MA0GCSqGSIb3DQEBCwUAME4x
CzAJBgNVBAYTAlJVMQ8wDQYDVQQDDAZJdmFub3YxHTAbBgkqhkiG9w0BCQEWDml2
YW5vdkBtYWlsLnJ1MQ8wDQYDVQQIDAZNb3Njb3cwHhcNMjQwOTE2MTQzOTE1WhcN
MjQxMDE2MTQzOTE1WjBOMQswCQYDVQQGEwJSVTEPMA0GA1UEAwwGSXZhbm92MR0w
GwYJKoZIhvcNAQkBFg5pdmFub3ZAbWFpbC5ydTEPMA0GA1UECAwGTW9zY293MIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L/Ey8xkZIhycSTXT2dTJgbr
AcCc92o/UhhJfD23X8NrZd1Gkpon4pT2vVrOy1ZFwPmkQIBg78GMXnQZXDMdDxA7
nnhv6FDa49/HovdSit7dK5PUMxO183LZ+Ct34A16QVFuwbOyKxNI4Za07CeRElXo
B2S8iS2JoudH/jjwpWeIjrqZYgmvDPr5dJf74/dm8Camv2RpgC7uyMAsY4tsNcyM
eOGWy37jufz2yF4PKWfux8HcguzhLFyRvHUg3R7euoPN9LfJi0KT03uN1rbScWuk
puosnTOUB75LzFgv8VgW2o47rlw4cWVp2bJcH3q5AL1IrduTih8Gkz9qLD5enwID
AQABMA0GCSqGSIb3DQEBCwUAA4IBAQCEUJA2vEULb4LjluA01Y7YXUOkqyW2gmxg
TtnMJCkrjomHBIQ0AKwHhRisp4LVY1SKmRpstrq6HyKzP3WjnZtP/3lkCRHgjNrN
jNN72cLA+E8IFHu+wWPF71YrgQluFOYOSkmUMOsVHL3XF/x4JE2N/beErMEPfrDq
aWYqmFn0sIQzQxcLr9TcDz0KsuZ8+IOcVjjWBJExpobKdLiuZ16WCPZlGV6K8t3x
sRDFYMBAN4eKkU4mSHse6Mm2sXtpyOVljMWsJO+EItOzTyTWLeDnUjRCtRkb2EKV
297yZnrL2mXX6D+xqbDIW/NtgodyAk9VuVEpI58gN6i236UDnZLY
-----END CERTIFICATE-----

В сертификате нет использования ключа (KeyUsage и EKU), неужели из-за этого?

(2024-09-17 21:10:22 отредактировано Евгений Мироненко)

Re: TLS с помощью RSA ключа на Рутокен ЭЦП

Ахат пишет:

Да, помогло, благодарю за ответы. Дальше ошибка "ee key too small", хотя ключи 2048 бит.

Есть подозрения, что в современном openssl security level по умолчанию установлен в значение 2, поэтому эффективное значение безопасности ключа в битах должно быть не меньше 128, что соответствует длине ключа как минимум 3072 (см. https://github.com/openssl/openssl/blob … C5-L337C20 https://github.com/openssl/openssl/blob … fy.c#L3597 https://github.com/openssl/openssl/blob … tls1.h#L31 https://github.com/openssl/openssl/blob … lib.c#L385 https://github.com/openssl/openssl/blob … fy.c#L3624)

В этом ответе есть рекомендации по установке security level ниже через конфиг openssl: https://askubuntu.com/a/1233456

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

s_client -host localhost -port 8443 -cert c:\test\openssl_1.1\cert.pem -keyform engine -key "pkcs11:id=12" -engine rtengine -cipher "DEFAULT:@SECLEVEL=1"

(см. https://github.com/openssl/openssl/issues/3619)