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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Поедатель крипты  
#1 Оставлено : 18 июля 2023 г. 16:21:57(UTC)
Поедатель крипты

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.07.2023(UTC)
Сообщений: 1
Австралия

Здравствуйте, при подписании сертификата столкнулся со следующей ошибкой: java.lang.RuntimeException: org.apache.xml.security.signature.XMLSignatureException: cannot recognise key type in ECGOST-2012-256 signer. Original Exception was java.security.InvalidKeyException: cannot recognise key type in ECGOST-2012-256 signer.

Код:
import lombok.extern.slf4j.Slf4j;
import org.apache.xml.security.exceptions.XMLSecurityException;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.transforms.Transform;
import org.apache.xml.security.transforms.TransformationException;
import org.apache.xml.security.transforms.Transforms;
import org.apache.xml.security.utils.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import ru.CryptoPro.JCP.JCP;
import ru.sirius.smev.server.smev.SmevTransformSpi;
import sun.security.x509.X509CertImpl;

import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivilegedExceptionAction;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

@Slf4j
public class SignatureManager {

    private static final String CANONICALIZATION_METHOD = "http://www.w3.org/2001/10/xml-exc-c14n#";
    private static final String GRID = "#";
    private static final String SIG_ID = "sigID";
    private static final String XMLDSIG_MORE_GOSTR34102001_GOSTR3411 = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
    private static final String XMLDSIG_MORE_GOSTR3411 = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
    private static final String xmlElementName = "CallerInformationSystemSignature";
    private static final String xmlElementID = "SIGNED_BY_CONSUMER";

    public static SignatureManager getInstance() {
        try {
            Transform.register(SmevTransformSpi.ALGORITHM_URN, SmevTransformSpi.class.getName());
            AccessController.doPrivileged((PrivilegedExceptionAction<Boolean>) () -> {
                Field f = XMLUtils.class.getDeclaredField("ignoreLineBreaks");
                f.setAccessible(true);
                f.set(null, true);
                return false;
            });

        } catch (Exception e) {
            log.info(e.getMessage());
        }
        return new SignatureManager();
    }

    public void sign(Document doc) {
        X509Certificate certificate = certificate();
        Key privateKey = privateKey();
        signDocument(doc, certificate, privateKey);
        validateSignature(doc);
    }

    private X509Certificate certificate() {
        try {
            ClassLoader classloader = Thread.currentThread().getContextClassLoader();
            return new X509CertImpl(classloader.getResourceAsStream("3oytfx3t.cer"));
        } catch (CertificateException e) {
            throw new RuntimeException(e);
        }
    }

    private Key privateKey() {
        KeyStore keyStore;
        try {
            keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
            keyStore.load(null, "".toCharArray());
            return keyStore.getKey("3oytfx3t", "z5cn3723".toCharArray());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private void signDocument(Document doc, X509Certificate certificate, Key privateKey) {
        try {
            XMLSignature sig = new XMLSignature(doc, "", XMLDSIG_MORE_GOSTR34102001_GOSTR3411, CANONICALIZATION_METHOD);
            sig.setId(SIG_ID);
            sig.addDocument(GRID + xmlElementID, transforms(doc), XMLDSIG_MORE_GOSTR3411);
            sig.addKeyInfo(certificate);
            sig.sign(privateKey);
            appendElement(doc, sig);
        } catch (XMLSecurityException e) {
            throw new RuntimeException(e);
        }
    }

    private void appendElement(Document doc, XMLSignature sig) {
        NodeList nodeList = doc.getElementsByTagNameNS("*", xmlElementName);
        Element anElement = (Element) nodeList.item(0);
        if (anElement != null) {
            anElement.appendChild(sig.getElement());
        } else {
            throw new RuntimeException("Could not find xml element with name " + xmlElementName);
        }
    }

    private Transforms transforms(Document doc) {
        Transforms transforms = new Transforms(doc);
        try {
            transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
        } catch (TransformationException e) {
            throw new RuntimeException(e);
        }
        return transforms;
    }

    private void validateSignature(Document doc) {
        boolean validate = SignatureValidator.validate(doc);
        if (!validate) {
            throw new RuntimeException("Signature is invalid");
        }
    }
}


Падает в методе signDocument() на строчке (83) sig.sign(privateKey);

Также есть следующий метод, возможно проблема в нем:

Код:
    @PostConstruct
    public void init() {
        try {
            org.apache.xml.security.Init.init();
            santuarioIgnoreLineBreaks(true);
            BouncyCastleProvider bcProvider = new BouncyCastleProvider();
            providerName = bcProvider.getName();
            Security.removeProvider(providerName);
            Security.addProvider(bcProvider);
            SignatureAlgorithm.register(GOST3411WITHECGOST3410_2012_256,
                    SignatureGostR341X.SignatureGostR34102012GostR3411.class);
            JCEMapper.register(GOST3411WITHECGOST3410_2012_256,
                    new JCEMapper.Algorithm("", "ECGOST3410-2012-256", /*"GOST3411WITHECGOST3410-2012-256", */"Signature"));
            JCEMapper.register(GOST34112012_256,
                    new JCEMapper.Algorithm("", "GOST3411-2012-256", "MessageDigest"));
            Transform.register(SmevTransformSpi.ALGORITHM_URN, SmevTransformSpi.class);
        } catch (AlgorithmAlreadyRegisteredException
                | ClassNotFoundException
                | XMLSignatureException
                | InvalidTransformException e) {
            e.printStackTrace();
        }
    }


Как можно решить данную проблему? Было дело следовал руководству https://cryptopro.ru/blo...olzovaniem-kriptopro-jcp Но со СМЭВ 3 оно не работает. Обновите его, пожалуйста. В интернете очень мало примеров кода подписи запроса. Ошибки задолбали уже...

Отредактировано пользователем 18 июля 2023 г. 16:25:40(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 24 июля 2023 г. 14:15:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
ECGOST3410-2012-256 - алгоритм ключа Bouncycastle.
В JCP другие алгоритмы: GOST3410EL, GOST3410_2012_256, GOST3410_2012_512. Алгоритмы подписи: GOST3411withGOST3410EL, GOST3411_2012_256withGOST3410_2012_256, GOST3411_2012_512withGOST3410_2012_512. См. документацию.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.