Статус: Новичок
Группы: Участники
Зарегистрирован: 06.07.2023(UTC) Сообщений: 4
|
Здравствуйте, мне нужно подписать строку в формате CAdES-BES (PKCS#7) согласно GOST R 34.10-2001. Я нашел похожие примеры на этом форуме и они отлично работают, но результат всегда получается в GOST R 34.11-2012 256. Я пробовал изменить изменить второй и третий параметры в CAdESSignature.addSigner(), с null на JCP.GOST_DIGEST_NAME и JCP.GOST_EL_SIGN_NAME соответственно, но это не помогло, результат всегда в GOST R 34.11-2012 256. Что нужно сделать, что получить результат в GOST R 34.10-2001? Версия ОС: DISTRIB_ID=LinuxMint DISTRIB_RELEASE=21.1 Версия Крипто CSP: Крипто Про CSP 5.0.12800 Версия КриптоПро JCP: Сертифицированная версия КриптоПро JCP и JTLS R4 (2.0.41789) Версия JDK: 1.8 Ключ обмена: длина открытого ключа 512 экспорт ключа разрешен ключ действителен по 05/04/2024 09:52:55 UTC использование ключа разрешено до окончания срока действия закрытого ключа алгоритм ГОСТ Р 34.10-2012 DH 256 бит ГОСТ Р 34.10 256 бит, параметры обмена по умолчанию ГОСТ Р 34.11-2012 256 бит экспорт открытого ключа успешно вычисление открытого ключа успешно импорт открытого ключа успешно подпись успешно проверка успешно создание ключа обмена разрешено Цитата: import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.util.CollectionStore; import ru.CryptoPro.CAdES.CAdESSignature; import ru.CryptoPro.CAdES.CAdESType; import ru.CryptoPro.CAdES.exception.CAdESException; import ru.CryptoPro.JCP.JCP;
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Base64; import java.util.Collections; import java.util.List;
public class StringSigner { private static final String ALIAS = "TEST"; private static final String TEXT_FOR_SIGNING = "TEST";
public static void main(String[] args) throws KeyStoreException, CertificateException, IOException, UnrecoverableKeyException, NoSuchAlgorithmException, CAdESException { // Включить системное свойство проверки отзыва серитифкатов CRLDP для библиотеки безопасности Java, от Oracle и IBM. System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true");
// Иницилизация объекта хранилища ключей. Константа JCP.HD_STORE_NAME указывает, что хранилище находится на диске. final KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME); // Загрузка контента из хранилища ключей. keyStore.load(null, null);
// Получение приватного ключа подписи. final PrivateKey signerPrivateKey = (PrivateKey) keyStore.getKey(ALIAS, null);
// Получение сертификата подписи. final X509Certificate signerCert = (X509Certificate) keyStore.getCertificate(ALIAS); // Создание цепочки сертификатов подписанта из одного сертификата. final List<X509Certificate> signerCertificateChain = Collections.singletonList(signerCert);
// Создание подписи отделенного типа, о чем говорит параметр true. final CAdESSignature cadesSignature = new CAdESSignature(true);
// Добавление сертификата подписи в подпись отделенного типа. final List<X509CertificateHolder> certHolderList = new ArrayList<>(); certHolderList.add(new X509CertificateHolder(signerCert.getEncoded())); final CollectionStore certStore = new CollectionStore(certHolderList); cadesSignature.setCertificateStore(certStore);
// Добавление подписанта CAdES-BES. cadesSignature.addSigner( JCP.PROVIDER_NAME, // Имя провайдера, который будет использоваться для создания подписи. JCP.GOST_DIGEST_NAME, // Идентификатор алгоритма хэширования, который будет использоваться для вычисления дайджеста (хэша) подписываемых данных. JCP.GOST_EL_SIGN_NAME, // Идентификатор алгоритма подписи, который будет использоваться для создания электронной подписи. signerPrivateKey, // Приватный ключ подписанта. signerCertificateChain, // Цепочка сертификатов подписанта. CAdESType.CAdES_BES, // Тип CAdES подписи. null, // Адрес TSA службы. false, // Заверяющая ли подпись. null, // Таблица подписанных аттрибутов для добавления в подпись. null, // Таблица неподписанных аттрибутов для добавления в подпись. null, // CRL (списков отзыва сертификатов), связанных с подписью. false // Добавить ли цепочку подписанта в подпись. );
// Поток для получения сформированной подписи. final ByteArrayOutputStream outSignatureStream = new ByteArrayOutputStream(); cadesSignature.open(outSignatureStream); // Подпись данных. cadesSignature.update(TEXT_FOR_SIGNING.getBytes(StandardCharsets.UTF_8)); cadesSignature.close(); outSignatureStream.close();
// CAdES-BES подпись. byte[] signature = outSignatureStream.toByteArray(); String encodedString = new String(Base64.getEncoder().encode(signature)); System.out.println(encodedString); } }
Отредактировано пользователем 6 июля 2023 г. 15:03:07(UTC)
| Причина: Не указана
|