Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline squadgazzz  
#1 Оставлено : 23 ноября 2020 г. 21:07:25(UTC)
squadgazzz

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2020(UTC)
Сообщений: 29

Сказал(а) «Спасибо»: 5 раз
Добрый день!
В системе установлен CSP 5.0.11823.
Использую Java CSP 5.0.40621-A и Java 11.
При создании GostCertificateRequest получаю следующую ошибку
Код:
java.security.InvalidKeyException: Key algorithm does not match the signature algorithm.
	at ru.CryptoPro.JCSP.Sign.CryptoProSign.engineInitSign(Unknown Source)
	at java.base/java.security.Signature.initSign(Signature.java:546)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.sign(Unknown Source)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.encodeAndSign(Unknown Source)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.encodeAndSign(Unknown Source)


Код использую следующий
Код:
val alias    = "mytestalias1"
val password = "123456"
val keyStore = KeyStore.getInstance("HDIMAGE", JCSP.PROVIDER_NAME)
keyStore.load(null, "123456".toCharArray)

val kg = KeyPairGenerator.getInstance(JCP.GOST_DH_2012_256_NAME, JCSP.PROVIDER_NAME)
kg.initialize(new CryptDhAllowedSpec())
val pair               = kg.generateKeyPair()
val jcpPrivateKeyEntry = new JCPPrivateKeyEntry(pair.getPrivate, Array.empty[Certificate], true)
keyStore.setEntry(alias, jcpPrivateKeyEntry, new KeyStore.PasswordProtection(password.toCharArray))

val certReq = new GostCertificateRequest(JCSP.PROVIDER_NAME)

certReq.setKeyUsage(KeyUsage.CRYPT_DEFAULT)
certReq.addExtKeyUsage(KeyUsage.INTS_PKIX_CLIENT_AUTH)
certReq.addExtKeyUsage(KeyUsage.INTS_PKIX_SERVER_AUTH)
certReq.setPublicKeyInfo(pair.getPublic)
certReq.setSubjectInfo("CN=Dragonov, OU=Sesurity, O=CryptoPro, C=RU")
certReq.encodeAndSign(pair.getPrivate) // ошибка

val certBytes   = certReq.getEncoded


Если в метод encodeAndSign передать название алгоритма JCP.GOST_SIGN_2012_256_NAME, то падает с ошибкой Unsupported method.

Отредактировано пользователем 23 ноября 2020 г. 21:08:51(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 23 ноября 2020 г. 21:30:21(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Здравствуйте.
Да, в encodeAndSign надо передать JCP.GOST_SIGN_2012_256_NAME

На счёт ошибки unsupported - при добавлении провайдеров первым идёт JCSP?
Offline squadgazzz  
#3 Оставлено : 23 ноября 2020 г. 22:01:33(UTC)
squadgazzz

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2020(UTC)
Сообщений: 29

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Да, в encodeAndSign надо передать JCP.GOST_SIGN_2012_256_NAME

На счёт ошибки unsupported - при добавлении провайдеров первым идёт JCSP?


Провайдеры добавляются следующим образом
Код:
  Security.addProvider(new JCSP())
  Security.addProvider(new RevCheck())
  Security.addProvider(new CryptoProvider())
  Security.addProvider(new Provider())

Отредактировано пользователем 23 ноября 2020 г. 22:11:57(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 23 ноября 2020 г. 22:12:41(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Тогда приведите пожалуйста, стек ошибки с Unsupported method
Такая ошибка возможна, если есть несоответствие в именах провайдеров при получении ключа и инициализации подписи, например, Signature от JCP, а ключ от JCSP.
Offline squadgazzz  
#5 Оставлено : 23 ноября 2020 г. 23:26:29(UTC)
squadgazzz

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2020(UTC)
Сообщений: 29

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
Тогда приведите пожалуйста, стек ошибки с Unsupported method


Код:
java.security.SignatureException: Unsupported method.
	at ru.CryptoPro.JCSP.Key.AbstractKeySpec.signature(Unknown Source)
	at ru.CryptoPro.JCP.Sign.cl_0.engineSign(Unknown Source)
	at java.base/java.security.Signature.sign(Signature.java:598)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.sign(Unknown Source)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.encodeAndSign(Unknown Source)


Offline Евгений Афанасьев  
#6 Оставлено : 24 ноября 2020 г. 10:40:12(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
В стеке ошибки есть ru.CryptoPro.JCP.Sign.cl_0.engineSign
То есть используется реализация подписи JCP, а не JCSP, если, например, в GostCertificateRequest не передать имя провайдера JCSP, а провайдер JCP при этом наверху списка провайдеров. Можете привести полный код с добавлением провайдеров и формированием запроса?
Offline squadgazzz  
#7 Оставлено : 24 ноября 2020 г. 11:04:43(UTC)
squadgazzz

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2020(UTC)
Сообщений: 29

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
В стеке ошибки есть ru.CryptoPro.JCP.Sign.cl_0.engineSign
То есть используется реализация подписи JCP, а не JCSP, если, например, в GostCertificateRequest не передать имя провайдера JCSP, а провайдер JCP при этом наверху списка провайдеров. Можете привести полный код с добавлением провайдеров и формированием запроса?


Код:
import java.io.ByteArrayInputStream
import java.security.cert.CertificateFactory
import java.security.{KeyPairGenerator, KeyStore, Security}
import java.security.cert.Certificate

import ru.CryptoPro.Crypto.CryptoProvider
import ru.CryptoPro.JCP.JCP
import ru.CryptoPro.JCP.KeyStore.JCPPrivateKeyEntry
import ru.CryptoPro.JCP.params.CryptDhAllowedSpec
import ru.CryptoPro.JCPRequest.{GostCertificateRequest, KeyUsage}
import ru.CryptoPro.JCSP.JCSP
import ru.CryptoPro.reprov.RevCheck
import ru.CryptoPro.ssl.Provider

object Generator extends App {
  Security.addProvider(new JCSP())
  Security.addProvider(new RevCheck())
  Security.addProvider(new CryptoProvider())
  Security.addProvider(new Provider())

  java.awt.Toolkit.getDefaultToolkit

  val alias    = "mondaytwothree20"
  val password = "123456"
  val keyStore = KeyStore.getInstance("HDIMAGE", JCSP.PROVIDER_NAME)
  keyStore.load(null, "123456".toCharArray)

  val kg = KeyPairGenerator.getInstance(JCP.GOST_DH_2012_256_NAME, JCSP.PROVIDER_NAME)
  kg.initialize(new CryptDhAllowedSpec())
  val pair               = kg.generateKeyPair()
  val jcpPrivateKeyEntry = new JCPPrivateKeyEntry(pair.getPrivate, Array.empty[Certificate], true)
  keyStore.setEntry(alias, jcpPrivateKeyEntry, new KeyStore.PasswordProtection(password.toCharArray))
  println(s"Saved alias $alias to keystore")

  val certReq = new GostCertificateRequest()
  certReq.setKeyUsage(KeyUsage.CRYPT_DEFAULT)
  certReq.addExtKeyUsage(KeyUsage.INTS_PKIX_CLIENT_AUTH)
  certReq.addExtKeyUsage(KeyUsage.INTS_PKIX_SERVER_AUTH)
  certReq.setPublicKeyInfo(pair.getPublic)
  certReq.setSubjectInfo("CN=Dragonov, OU=Sesurity, O=CryptoPro, C=RU")
  certReq.encodeAndSign(pair.getPrivate, JCP.GOST_SIGN_2012_256_NAME)

  val certBytes   = certReq.getEncoded
  val certFactory = CertificateFactory.getInstance(JCP.CERTIFICATE_FACTORY_NAME)
  val clientCert  = certFactory.generateCertificate(new ByteArrayInputStream(certBytes))
  val clientChain = Array(clientCert)

  keyStore.setKeyEntry(alias, pair.getPrivate, password.toCharArray, clientChain)
  keyStore.store(null, password.toCharArray)
}
Offline Евгений Афанасьев  
#8 Оставлено : 24 ноября 2020 г. 11:05:34(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
val certReq = new GostCertificateRequest() - вы же выше другой пример приводили, см. 1 пост. Укажите провайдер тут.
Offline squadgazzz  
#9 Оставлено : 24 ноября 2020 г. 11:08:55(UTC)
squadgazzz

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2020(UTC)
Сообщений: 29

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
val certReq = new GostCertificateRequest() - вы же выше другой пример приводили, см. 1 пост. Укажите провайдер тут.


Похоже, скопировал в тот момент, когда проводил эксперименты. Если в конструктор передать имя провайдера, то ошбика следующая

Код:
java.lang.IllegalArgumentException: ru.CryptoPro.JCSP.MSCAPI.MSHashNSignException: Hash or Sign ERROR: 0x80090016
	at ru.CryptoPro.JCSP.MSCAPI.cl_4.b(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_3.a(Unknown Source)
	at ru.CryptoPro.JCSP.Key.AbstractKeySpec.signature(Unknown Source)
	at ru.CryptoPro.JCSP.Sign.CryptoProSign.engineSign(Unknown Source)
	at ru.CryptoPro.JCSP.Sign.JCSPGostElSign.engineSign(Unknown Source)
	at java.base/java.security.Signature.sign(Signature.java:598)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.sign(Unknown Source)
	at ru.CryptoPro.JCPRequest.GostCertificateRequest.encodeAndSign(Unknown Source)
Offline Евгений Афанасьев  
#10 Оставлено : 24 ноября 2020 г. 12:05:09(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Проверим предложенный пример. Но, полагаю, проблема в том, что вы используете ключ для подписи, при том, что он не в контейнере.

Также:
* можно вызывать keyStore.load(null, null) без пароля, пароль не влияет в этом случае;
* вызов keyStore.store(null, password.toCharArray) для ключевого контейнера излишен, не влияет в этом случае.

Отредактировано пользователем 24 ноября 2020 г. 12:06:57(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.