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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Anton Petrov  
#1 Оставлено : 27 июля 2017 г. 17:44:42(UTC)
Anton Petrov

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 2 раз в 1 постах
Всем привет!

Есть xml-ка её надо подписать. Подпись должна находится в определенном месте Document/SinatureEnvlp/SignTags/Signature. SignTags не существует, мы его создаем и помещаем туда XMLSignature.getElement(). При чем в SignTags может хранится ещё всякая информация, её подписывать нам не надо. Как мне корректно подписать весь док за исключением Document/SinatureEnvlp/SignTags, с учетом, что SignTags я создаю на ходу? Что я делаю не так?

При чем, если у нас уже создан SignTags, то всё ок, верификацию проходит, но если тега нет, то:
июл 27, 2017 5:41:55 PM org.apache.xml.security.signature.XMLSignature checkSignatureValue
WARNING: Signature verification failed.
июл 27, 2017 5:41:55 PM XMLTwoSignDoc ver
INFO: The XML signature is invalid (bad)



Код:

 static {
        if (!XmlInit.isInitialized()) {
            XmlInit.init();
        }
    }

    public static void main(String[] args) {
        try {
            String testDoc = "XmlTwoDSig.xml";
            String res = "result.xml";
            String Id1 = "FirstSignature";
            String signMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
            String digestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";

            JCPXMLDSigInit.init();
            sign(Id1, signMethod, digestMethod, testDoc, res);
            ver(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void sign(String Id1, String signMethod, String digestMethod, String testDoc, String signTwo) throws Exception {
        KeyStore keyStore;
        keyStore = KeyStore.getInstance(JCSP.REG_STORE_NAME, JCSP.PROVIDER_NAME);
        keyStore.load(null, null);
        X509Certificate cert = (X509Certificate) keyStore.getCertificate("TEST");
        PrivateKey privateKey = (PrivateKey) keyStore.getKey("TEST", "password".toCharArray());

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setIgnoringElementContentWhitespace(true);
        dbf.setCoalescing(true);
        dbf.setNamespaceAware(true);
        DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
        final Document doc;
        doc = documentBuilder.parse(new FileInputStream(testDoc));

        XMLSignature sig = new XMLSignature(doc, "", signMethod);
        sig.setId(Id1);
        Element aElement = (Element) XPathAPI.selectSingleNode(doc, "/*[name()='Document']/*[name()='SinatureEnvlp']");
        Element splmtryData = doc.createElement("SignTags");
        Element anElement = (Element) aElement.appendChild(splmtryData);
        anElement.appendChild(sig.getElement());

        Transforms transforms = new Transforms(doc);
        transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
        transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);
        String[][] filters = {{XPath2FilterContainer.SUBTRACT, "/*[name()='Document']/*[name()='SinatureEnvlp']/*[name()='SignTags']"}};
        transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER,
                XPath2FilterContainer.newInstances(doc, filters));
        sig.addDocument("", transforms, digestMethod);
        sig.addKeyInfo(cert);
        sig.sign(privateKey);

        FileOutputStream os = new FileOutputStream(signTwo);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));
        os.close();
    }

    public static void ver(String signTwo) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setIgnoringElementContentWhitespace(true);
        dbf.setCoalescing(true);
        dbf.setNamespaceAware(true);
        DocumentBuilder documentBuilder = dbf.newDocumentBuilder();

        final Document doc;
        doc = documentBuilder.parse(new FileInputStream(signTwo));

        Element nscontext = doc.createElementNS(null, "namespaceContext");
        nscontext.setAttributeNS("http://www.w3.org/2000/xmlns/",
                "xmlns:" + "ds".trim(), Constants.SignatureSpecNS);

        Element sigElement = (Element) XPathAPI.selectSingleNode(doc, "//ds:Signature[@Id='FirstSignature']", nscontext);

        XMLSignature signature = new XMLSignature(sigElement, "");

        KeyInfo ki = signature.getKeyInfo();
        X509Certificate certKey = ki.getX509Certificate();

        if (certKey != null) {
            Logger.getLogger("LOG").info("The XML signature is " +
                    (signature.checkSignatureValue(certKey)
                            ? "valid (good)" : "invalid (bad)"));
        } else {
            PublicKey pk = ki.getPublicKey();
            if (pk != null) {
                Logger.getLogger("LOG")
                        .info("The XML signature  is " +
                                (signature.checkSignatureValue(pk)
                                        ? "valid (good)" : "invalid (bad)"));
            } else
                throw new Exception("There are no information about public key. Verification couldn't be implemented");

        }

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