Статус: Участник
Группы: Участники
Зарегистрирован: 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)
При этом если запускаю проект локально, то никаких проблем нет. Подскажите как решить проблему
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. А подпись с помощью csptest тем же ключом работает? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.08.2022(UTC) Сообщений: 13 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Неужели никто не сталкивался с такой проблемой?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. Приведите код: как читаете ключ из ключевого контейнера, как подписываете. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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;
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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 |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.08.2022(UTC) Сообщений: 13 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Автор: Евгений Афанасьев Это логи при подписании, по умолчанию использует нужный мне контейнер 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
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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:
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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();
}
|
1 пользователь поблагодарил Дмитрий Г за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close