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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий Г  
#1 Оставлено : 5 августа 2022 г. 13:17:26(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
При разворачивании приложения с помощью докера не работает подписание с помощью JCSP.

При сборке докера устанавливаю в контейнер КриптоПро CSP с помощью ./install.sh
KeyStore инициализируется без проблем и ключ берется, однако при попытке подписать выдается ошибку

java.lang.IllegalArgumentException: ru.CryptoPro.JCSP.MSCAPI.MSHashNSignException: Hash or Sign ERROR: 0x8009000d
at ru.CryptoPro.JCSP.MSCAPI.cl_3.b(Unknown Source)
at ru.CryptoPro.JCSP.MSCAPI.cl_2.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(Unknown Source)
at ru.CryptoPro.JCPxml.xmldsig.SignatureGostR3410.engineSign(Unknown Source)
at org.apache.xml.security.algorithms.SignatureAlgorithm.sign(SignatureAlgorithm.java:167)
at org.apache.xml.security.signature.XMLSignature.sign(XMLSignature.java:648)
at ru.codemark.integration.services.SignService.signXml(SignService.java:135)


При этом если запускаю проект локально, то никаких проблем нет. Подскажите как решить проблему
Offline Евгений Афанасьев  
#2 Оставлено : 5 августа 2022 г. 13:57:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
А подпись с помощью csptest тем же ключом работает?
Offline Дмитрий Г  
#3 Оставлено : 5 августа 2022 г. 15:00:43(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
А подпись с помощью csptest тем же ключом работает?


Да, через csptest всё подписывается

Чтобы подписать использовал команду:


/opt/cprocsp/bin/amd64/csptest -keyset -sign GOST12_256 -keytype exchange -in /tmp/test -out /tmp/test.sig
Offline Дмитрий Г  
#4 Оставлено : 9 августа 2022 г. 11:06:02(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Неужели никто не сталкивался с такой проблемой?
Offline Евгений Афанасьев  
#5 Оставлено : 9 августа 2022 г. 17:53:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
Приведите код: как читаете ключ из ключевого контейнера, как подписываете.
Offline Дмитрий Г  
#6 Оставлено : 10 августа 2022 г. 12:31:52(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Приведите код: как читаете ключ из ключевого контейнера, как подписываете.


Инициализация класса, который реализует подписание

Код:
ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit.init();
            Security.addProvider(new JCSP());
            keyStore = KeyStore.getInstance("HDIMAGE", "JCSP");
            keyStore.load(null, null);
            x509Certificate = (X509Certificate) keyStore.getCertificate(CONTAINER_ALIAS);
            privateKey = (PrivateKey) keyStore.getKey(CONTAINER_ALIAS, CONTAINER_PASSWORD.toCharArray());
            Transform.register(SmevTransformSpi.ALGORITHM_URN, SmevTransformSpi.class.getName());
            santuarioIgnoreLineBreaks(true);


Функция подписания

Код:
 public Document signXml(Document xmlDoc, String nodeToPlace) {
        try {
            XMLSignature sig = new XMLSignature(xmlDoc, "", XMLDSIG_MORE_GOSTR34102012_GOSTR3411, CANONICALIZATION_METHOD);

            Transforms transforms = new Transforms(xmlDoc);

            transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
            transforms.addTransform(SmevTransformSpi.ALGORITHM_URN);

            sig.addDocument(GRID + SIGNATURE_ID_CALLER, transforms, XMLDSIG_MORE_GOSTR3411);

            sig.addKeyInfo(x509Certificate);

            sig.sign(privateKey);

            final Node elementToPlaceSignature = xmlDoc.getElementsByTagNameNS(MESSAGE_EXCHANGE_TYPES_1_3,
                    nodeToPlace).item(0);
            elementToPlaceSignature.appendChild(sig.getElement());


            return xmlDoc;

        } catch (XMLSecurityException e) {
            throw new RuntimeException(e);
        }
    }


Используемые константы
Код:
   private static final String SIGNATURE_ID_CALLER = "SIGNED_BY_CALLER";

    private static final QName QNAME_SIGNATURE = new QName("http://www.w3.org/2000/09/xmldsig#", "Signature", "ds");

    private static final String XMLDSIG_MORE_GOSTR34102012_GOSTR3411 = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
    private static final String XMLDSIG_MORE_GOSTR3411 = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
    private static final String CANONICALIZATION_METHOD = "http://www.w3.org/2001/10/xml-exc-c14n#";
    private static final String GRID = "#";
    private static final String ID = "Id";


Класс Document из org.w3c.dom.Document;
Offline Евгений Афанасьев  
#7 Оставлено : 10 августа 2022 г. 18:16:30(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Автор: Дмитрий Г Перейти к цитате
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
А подпись с помощью csptest тем же ключом работает?


Да, через csptest всё подписывается

Чтобы подписать использовал команду:


/opt/cprocsp/bin/amd64/csptest -keyset -sign GOST12_256 -keytype exchange -in /tmp/test -out /tmp/test.sig


Тут проверяете с проблемным контейнером? Не увидел параметра - container с указанием ключевого контейнера.

Тут есть проверки на случай такой ошибки:
https://www.cryptopro.ru...aspx?g=posts&t=20078
Offline Дмитрий Г  
#8 Оставлено : 11 августа 2022 г. 9:38:17(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате


Тут проверяете с проблемным контейнером? Не увидел параметра - container с указанием ключевого контейнера.

Тут есть проверки на случай такой ошибки:
https://www.cryptopro.ru...aspx?g=posts&t=20078


Это логи при подписании, по умолчанию использует нужный мне контейнер pfx-7078232a-7ec6-26e8-27d7-5ae023ac2fc2

Код:
root@1b26104cd5cb:/# /opt/cprocsp/bin/amd64/csptest -keyset -sign GOST12_256 -keytype exchange -in /tmp/test -out /tmp/test.sig
CSP (Type:80) v5.0.10008 KC1 Release Ver:5.0.12000 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 16370147
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 KC1 CSP
Container name: "pfx-7078232a-7ec6-26e8-27d7-5ae023ac2fc2"
Exchange key is available. HCRYPTKEY: 0xfb5ee3
Hash object created with alg: GOST12_256 0x8021
The data buffer has been hashed.
Signature length 64 found.
Crypto-Pro GOST R 34.10-2012 KC1 CSP requests container password
Type password:
Signature was done.
Output file (/tmp/test.sig) has been saved
Signature saved into file /tmp/test.sig




Логи если явно указываю контейнер

Код:
/opt/cprocsp/bin/amd64/csptest -keyset -sign GOST12_256 -keytype exchange -in /tmp/test -out /tmp/test.sig -container pfx-7078232a-7ec6-26e8-27d7-5ae023ac2fc2
CSP (Type:80) v5.0.10008 KC1 Release Ver:5.0.12000 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 11829635
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 KC1 CSP
Container name: "pfx-7078232a-7ec6-26e8-27d7-5ae023ac2fc2"
Exchange key is available. HCRYPTKEY: 0xb5ef13
Hash object created with alg: GOST12_256 0x8021
The data buffer has been hashed.
Signature length 64 found.
Crypto-Pro GOST R 34.10-2012 KC1 CSP requests container password
Type password:
Wrong password. Tries left: 4.
Type password:
Signature was done.
Output file (/tmp/test.sig) has been saved
Signature saved into file /tmp/test.sig

Keys in container:
  exchange key
Extensions:
  OID: 1.2.643.2.2.37.3.10
  PrivKey: Not specified - 16.08.2023 19:05:15 (UTC)
Total: SYS: 0.000 sec USR: 0.060 sec UTC: 8.600 sec
[ErrorCode: 0x00000000]

Keys in container:
  exchange key
Extensions:
  OID: 1.2.643.2.2.37.3.10
  PrivKey: Not specified - 16.08.2023 19:05:15 (UTC)
Total: SYS: 0.010 sec USR: 0.020 sec UTC: 5.800 sec

Offline Дмитрий Г  
#9 Оставлено : 11 августа 2022 г. 10:55:03(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Заметил в ходе дебага в логах. Просит пароль при подписании
Код:

Crypto-Pro GOST R 34.10-2001 KC1 CSP requests container password
You've got 60 seconds to enter the password
2022-08-11T06:57:34.483773400Z Type password:
Offline Дмитрий Г  
#10 Оставлено : 11 августа 2022 г. 12:25:09(UTC)
Дмитрий Г

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Заставил работать все, но решение не очень красивое. Из KeyStore получаю Entry, который потом кастую в JCPPrivateKeyEntry и оттуда достаю приватный ключ.
Есть ли более элегантное решение? Дело в том, что JCPPrivateKeyEntry из библиотеки JCP, а хотелось бы без него обойтись.

Код получения ключа:
Код:

KeyStore.ProtectionParameter entryPassword
                    = new KeyStore.PasswordProtection(CONTAINER_PASSWORD.toCharArray());
            Object entry = keyStore.getEntry(CONTAINER_ALIAS, entryPassword);
            if (entry instanceof JCPPrivateKeyEntry) {
                JCPPrivateKeyEntry jcpPrivateKeyEntry = (JCPPrivateKeyEntry) entry;
                privateKey = jcpPrivateKeyEntry.getPrivateKey();
            }
thanks 1 пользователь поблагодарил Дмитрий Г за этот пост.
ВадимPilotnikov оставлено 12.12.2022(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.