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

Уведомление

Icon
Error

6 Страницы<12345>»
Опции
К последнему сообщению К первому непрочитанному
Offline PashaTechnique  
#21 Оставлено : 14 августа 2019 г. 10:48:41(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
Ошибка про не найденный элемент. В коде вообще сообщения #18 творится что-то непонятное. Для начала нужно опредедиться, что есть элемент куда будет положен сертификат и есть элемент тела запроса. У них должны быть разные ID. В ID решетка не нужна (буквально выше перечисление символов допустимых в ID, среди них решетки нет), а вот в URI решетка нужна. Это нормально когда их значения отличаются на решетку. Еще раз деликом код создания документа и подписания напомните пожалуйста. Запрос на момент подписания и после подписания тоже не помешает. Вероятно дело в том, что на момент подписания еще нет элемента с ID OGRN_1025401011833.


Первичный метод:
Код:

public static void main( String[] args ) throws UnrecoverableKeyException, NoSuchProviderException, KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, Exception
    
    {
    	System.out.println("*****************");
    	System.out.println("*******ФСС*******");
    	System.out.println("*****************");
    	
    	MessageFactory messageFactory = MessageFactory.newInstance();
	SOAPMessage soapMessage = messageFactory.createMessage();
    	CreateXml.CreateXMLSkeleton(soapMessage);
    	soapMessage = SignXml.Signation();
    	StartEncrypt.Encryption(soapMessage);
    	VerifyDecrypt.VerifyAndDecrypt().writeTo(System.out);
}


Подготавливаем первичный вид XML сообщений.
Код:

        public static void CreateXMLSkeleton(SOAPMessage soapMessage)
            throws SOAPException, IOException {
		
        SOAPEnvelope soapEnv = soapMessage.getSOAPPart().getEnvelope();

        soapEnv.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema");
        soapEnv.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema-instance");
        soapEnv.addNamespaceDeclaration("wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        soapEnv.addNamespaceDeclaration("wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
        soapEnv.addNamespaceDeclaration("end", "http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl");
        
        SOAPBody soapBody = soapEnv.getBody();
        
        Name name = soapEnv.createName("Id");
        soapBody.addAttribute(name, "OGRN_1025401011833");
        
        SOAPElement soapElement = soapBody.addChildElement("getNewLNNum", "end");
		SOAPElement element = soapElement.addChildElement("ogrn");
		element.addTextNode("1025401011833");
        
        soapMessage.saveChanges();
        SaveSOAPToXML("tempSkeleton.xml", soapMessage);
        System.out.println("Файл создан");
        System.out.println("*****************");
        
}


Выглядит так:
Код:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:end="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header/><SOAP-ENV:Body Id="OGRN_1025401011833"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>


Далее подписываем это сообщение:
Код:

public static SOAPMessage Signation() throws Exception {

        X509Certificate cert = KeyCertificate.GetCertificateFromStorage("zeus");
        PrivateKey privateKey = KeyCertificate.GetPrivateKey("password", "zeus");

        MessageFactory mf = MessageFactory.newInstance();
        SOAPMessage message = mf.createMessage();  // ЕСЛИ берем из файла
        SOAPPart soapPart = message.getSOAPPart();
        FileInputStream is = new FileInputStream("C:\\Storage\\Store\\"+"tempSkeleton.xml"); // ЕСЛИ берем из файла
        soapPart.setContent(new StreamSource(is)); // ЕСЛИ берем из файла
        message.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
        Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();

        //Добавляем заголовки для помещения информации о подписи:
        WSSecHeader header = new WSSecHeader();

        header.setActor("http://eln.fss.ru/actor/mo/OGRN_1025401011833"); 
        header.setMustUnderstand(false);

        header.insertSecurityHeader(message.getSOAPPart().getEnvelope().getOwnerDocument());
        // Элемент подписи.
        Element token = header.getSecurityHeader();

        // Загрузка провайдера.
        Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
        //logger.debug("xmlDSigProvider: {}", xmlDSigProvider);

        //Добавляем описание преобразований над документом и узлом SignedInfo
        final Transforms transforms = new Transforms(doc);
        transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
        transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);


        //Преобразования над узлом ds:SignedInfo:
        List<Transform> transformList = new ArrayList<Transform>();
        Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
        transformList.add(transformC14N);

        // Ссылка на подписываемые данные с алгоритмом хеширования ГОСТ 34.11.
        Reference ref = fac.newReference("#OGRN_1025401011833", fac.newDigestMethod ("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256", null),
                transformList, null, null);

        //Задаём алгоритм подписи:
        SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
                (C14NMethodParameterSpec) null), fac.newSignatureMethod("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256", null), Collections.singletonList(ref));
        
        //Создаём узел ds:KeyInfo с информацией о сертификате:
        KeyInfoFactory kif = fac.getKeyInfoFactory();

        X509Data x509d = kif.newX509Data(Collections.singletonList(cert));
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
        //Подписываем данные в элементе token:
        javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki); //
        DOMSignContext signContext = new DOMSignContext(privateKey, token);  //
        sig.sign(signContext);  // EXC
        //Следующий этап — поместить узел ds:Signature и сертификат (X509Certificate) в узел wsse:Security,
        //причём сертификат нужно удалить из ds:KeyInfo и оставить там ссылку на wsse:BinarySecurityToken с сертификатом:
        // Узел подписи Signature.
        Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
        // Блок данных KeyInfo.
        Node keyE = XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
        // Элемент SenderCertificate, который должен содержать сертификат.
        Element cerVal = (Element) XPathAPI.selectSingleNode(token, "//*[@wsu:Id='SenderCertificate']");

        /*****-----*****/
        Node certi = XPathAPI.selectSingleNode(sigE, "//ds:X509Certificate", sigE);
        keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
        Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
        Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
        strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef.setAttribute("URI", "http://eln.fss.ru/actor/mo/1025401011833");
        header.getSecurityHeader().appendChild(sigE);

        keyE = XPathAPI.selectSingleNode(sigE, "//wsse:Security", sigE);
        Element strRef2 = (Element)keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wse:BinarySecurityToken"));
        strRef2.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
        strRef2.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef2.setAttribute("wsu:Id", "http://eln.fss.ru/actor/mo/1025401011833");
        strRef2.setTextContent(certi.getFirstChild().getNodeValue());
        
        System.out.println("Подписанное сообщение готово.");
        System.out.println("*****************");
        
        CreateXml.SaveSOAPToXML("tempSign.xml", message);
        
        return message;
        
}


После сообщение становиться таким:
Код:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:end="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header><wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/mo/OGRN_1025401011833" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><Reference URI="#OGRN_1025401011833"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue>yevIWGLD7y1f8sgZvBB6hkAHt++aKki/107CV2vush4=</DigestValue></Reference></SignedInfo><SignatureValue>s1c1USX+aKN5UMOo4xrmMAACmNLz+xo4huo4WBfkV+/PBoXHU4UattTcPP55MkRXmKS/9IMOl7Oy
WdeaxOqlLg==</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="http://eln.fss.ru/actor/mo/1025401011833" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></KeyInfo></Signature><wse:BinarySecurityToken xmlns:wse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="http://eln.fss.ru/actor/mo/1025401011833">MIIDkTCCA0CgAwIBAgITEgA4/fAC4SR8WI2UNQABADj98DAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3
DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cx
FzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVy
IDIwHhcNMTkwNzIzMDczNzQwWhcNMTkxMDIzMDc0NzQwWjCBljEgMB4GCSqGSIb3DQEJARYRcmV0
MTIzcmV0QG1haWwucnUxGTAXBgNVBAMMEFNoYXNoa292IEV2Z2VuaWkxCzAJBgNVBAsMAklUMQ8w
DQYDVQQKDAZLT01JQUMxFTATBgNVBAcMDE5vdm9rdXpuZXRzazEVMBMGA1UECAwMTm92b2t1em5l
dHNrMQswCQYDVQQGEwJSVTBmMB8GCCqFAwcBAQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABECg
MYebqlT5Z/0xUFI6B2BQ/OrVH+PAApw+4MA+m35zBphmU6/XsHFQ7PiuXgbdA7yAYHQEenWvoT3P
BSph5WW0o4IBdjCCAXIwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1Ud
DgQWBBROTjX9G1CBPUbTZykKaBU89Ztn2DAfBgNVHSMEGDAWgBROgz4Uae/sXXqVK18R/jcyFklV
KzBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xs
L0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMigxKS5jcmwwgawGCCsGAQUFBwEBBIGfMIGc
MGQGCCsGAQUFBzAChlhodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3Qt
Y2EtMjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIoMSkuY3J0MDQGCCsGAQUFBzAB
hihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgGBiqFAwICAwNBAKO3
xo+lLAp+6tbpTHiboyM4ZFJ4K+zZTRvV8nv61H3+hgrXAAWCSQi8TiBAMeKHeUmGz9JxJbn76zdL
cyrdDL0=</wse:BinarySecurityToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body Id="OGRN_1025401011833"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>
Offline two_oceans  
#22 Оставлено : 14 августа 2019 г. 10:51:44(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: two_oceans Перейти к цитате
Еще раз деликом код создания документа и подписания напомните пожалуйста. Запрос на момент подписания и после подписания тоже не помешает. Вероятно дело в том, что на момент подписания еще нет элемента с ID OGRN_1025401011833.
Судя по всему в сообщении №1 этой темы код подписания почти правильный, предлагаю оттталкиваться от него, обратите внимание на соответствие URI и ID: без решетки подписываемые данные:
Код:
soapMessage.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
	                "wsu:Id", "body");
с решеткой ссылка на них
Код:
// Ссылка на подписываемые данные.
	        Reference ref = fac.newReference("#body",
	            fac.newDigestMethod("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256", null),
	            transformList, null, null);
И там и там body, отличие на решетку.


Без решетки элемент с сертификатом
Код:
 binSecToken.setAttribute("wsu:Id", "OGRN_1025401011833");

С решеткой ссылка на элемент
Код:
strRef.setAttribute("URI", "#OGRN_1025401011833"); // <- тут добавить решетку в коде сообщения 1!!!
И там и там OGRN_1025401011833, отличие на решетку.

Отредактировано пользователем 14 августа 2019 г. 10:55:32(UTC)  | Причина: Не указана

Offline PashaTechnique  
#23 Оставлено : 14 августа 2019 г. 11:12:53(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Смотрите сообщение #21 там актуальная версия кода.
Вообщем всем сделал как надо, ошибки в данный момент нету. Но из ответа при расшифровке тоже самое.

И так кусками сейчас накидаю что изменил:

Код:

// Собственно сделал этот атрибут через метод AttributeNS
...
SOAPBody soapBody = soapEnv.getBody();
        
        soapBody.setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
                "wsu:Id", "OGRN_1025401011833");
        
        SOAPElement soapElement = soapBody.addChildElement("getNewLNNum", "end");
		SOAPElement element = soapElement.addChildElement("ogrn");
		element.addTextNode("1025401011833");
...
// Ссылка на подписываемые данные с алгоритмом хеширования ГОСТ 34.11.
        Reference ref = fac.newReference("#OGRN_1025401011833", fac.newDigestMethod ("urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256", null),
                transformList, null, null);
...
/*****-----*****/
        Node certi = XPathAPI.selectSingleNode(sigE, "//ds:X509Certificate", sigE);
        keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
        Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
        Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
        strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef.setAttribute("URI", "#OGRN_1025401011833");
        header.getSecurityHeader().appendChild(sigE);

        keyE = XPathAPI.selectSingleNode(sigE, "//wsse:Security", sigE);
        Element strRef2 = (Element)keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wse:BinarySecurityToken"));
        strRef2.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
        strRef2.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef2.setAttribute("wsu:Id", "OGRN_1025401011833");
        strRef2.setTextContent(certi.getFirstChild().getNodeValue());
...


Походу все таки не в ней дело было.
Offline two_oceans  
#24 Оставлено : 14 августа 2019 г. 11:59:45(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Да нет, в ID дело... должно быть 2 разных ID для сертификата и боди. Сейчас они одинаковые - выберется первое вхождение ID в документе (это сертификат). Сейчас по идее при проверке выглядит как будто сертификат подписали этим же сертификатом. А так как вычисляли подпись от боди, то подпись не сойдется. Сервис также решит, что у боди нет подписи раз с этим ID подписан сертификат.
в куске
Код:
 Node certi = XPathAPI.selectSingleNode(sigE, "//ds:X509Certificate", sigE);
        keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
        Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
        Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
        strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef.setAttribute("URI", "#OGRN_1025401011833");
        header.getSecurityHeader().appendChild(sigE);

        keyE = XPathAPI.selectSingleNode(sigE, "//wsse:Security", sigE);
        Element strRef2 = (Element)keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wse:BinarySecurityToken"));
        strRef2.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
        strRef2.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef2.setAttribute("wsu:Id", "OGRN_1025401011833");
        strRef2.setTextContent(certi.getFirstChild().getNodeValue())
поменяете "OGRN_1025401011833" допустим на "CERT_1025401011833", а "#OGRN_1025401011833" соответственно на "#CERT_1025401011833".

Стоп, вот это мне непонятно, поясните какие параметры у XPathAPI.selectSingleNode:
Код:
        keyE = XPathAPI.selectSingleNode(sigE, "//wsse:Security", sigE);
sigE, как я понял, элемент подписи? в ведь нем нет wsse:Security

Отредактировано пользователем 14 августа 2019 г. 12:12:45(UTC)  | Причина: Не указана

Offline PashaTechnique  
#25 Оставлено : 14 августа 2019 г. 12:10:41(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
Да нет, в ID дело... должно быть 2 разных ID для сертификата и боди. Сейчас они одинаковые - выберется первое вхождение ID в документе (это сертификат). Сейчас по идее при проверке выглядит как будто сертификат подписали этим же сертификатом. А так как вычисляли подпись от боди, то подпись не сойдется. Сервис также решит, что у боди нет подписи раз с этим ID подписан сертификат.
в куске
Код:
 Node certi = XPathAPI.selectSingleNode(sigE, "//ds:X509Certificate", sigE);
        keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
        Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
        Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
        strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef.setAttribute("URI", "#OGRN_1025401011833");
        header.getSecurityHeader().appendChild(sigE);

        keyE = XPathAPI.selectSingleNode(sigE, "//wsse:Security", sigE);
        Element strRef2 = (Element)keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wse:BinarySecurityToken"));
        strRef2.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
        strRef2.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef2.setAttribute("wsu:Id", "OGRN_1025401011833");
        strRef2.setTextContent(certi.getFirstChild().getNodeValue())
поменяете "OGRN_1025401011833" допустим на "CERT_1025401011833", а "#OGRN_1025401011833" соответственно на "#CERT_1025401011833".


Сделал как вы сказали, ничего не изменилось. Think
Offline two_oceans  
#26 Оставлено : 14 августа 2019 г. 12:13:39(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Подписанный результат, пожалуйста.
Offline PashaTechnique  
#27 Оставлено : 14 августа 2019 г. 12:14:25(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
Подписанный результат, пожалуйста.


Пожалуйста.

Код:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:end="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header><wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/mo/OGRN_1025401011833" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><Reference URI="#OGRN_1025401011833"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue>0WiRs7nd68Hxe9FSmsVq1nzA4AHBHM4azEkIZ4u+Y3o=</DigestValue></Reference></SignedInfo><SignatureValue>Woi4/X8KdqFVX3i/OXOtPOaBsmLk+DEqlHYkP8lPNDuTMySrpwJQDOCTibfC+X3JQY/0GoaMWNv0
FPhw8EV8mg==</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#CERT_1025401011833" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></KeyInfo></Signature><wse:BinarySecurityToken xmlns:wse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CERT_1025401011833">MIIDkTCCA0CgAwIBAgITEgA4/fAC4SR8WI2UNQABADj98DAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3
DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cx
FzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVy
IDIwHhcNMTkwNzIzMDczNzQwWhcNMTkxMDIzMDc0NzQwWjCBljEgMB4GCSqGSIb3DQEJARYRcmV0
MTIzcmV0QG1haWwucnUxGTAXBgNVBAMMEFNoYXNoa292IEV2Z2VuaWkxCzAJBgNVBAsMAklUMQ8w
DQYDVQQKDAZLT01JQUMxFTATBgNVBAcMDE5vdm9rdXpuZXRzazEVMBMGA1UECAwMTm92b2t1em5l
dHNrMQswCQYDVQQGEwJSVTBmMB8GCCqFAwcBAQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABECg
MYebqlT5Z/0xUFI6B2BQ/OrVH+PAApw+4MA+m35zBphmU6/XsHFQ7PiuXgbdA7yAYHQEenWvoT3P
BSph5WW0o4IBdjCCAXIwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1Ud
DgQWBBROTjX9G1CBPUbTZykKaBU89Ztn2DAfBgNVHSMEGDAWgBROgz4Uae/sXXqVK18R/jcyFklV
KzBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xs
L0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMigxKS5jcmwwgawGCCsGAQUFBwEBBIGfMIGc
MGQGCCsGAQUFBzAChlhodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3Qt
Y2EtMjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIoMSkuY3J0MDQGCCsGAQUFBzAB
hihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgGBiqFAwICAwNBAKO3
xo+lLAp+6tbpTHiboyM4ZFJ4K+zZTRvV8nv61H3+hgrXAAWCSQi8TiBAMeKHeUmGz9JxJbn76zdL
cyrdDL0=</wse:BinarySecurityToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="OGRN_1025401011833"><end:getNewLNNum><ogrn>1025401011833</ogrn></end:getNewLNNum></SOAP-ENV:Body></SOAP-ENV:Envelope>
Offline two_oceans  
#28 Оставлено : 14 августа 2019 г. 12:22:22(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
В моей программе подпись прошла проверку, теперь ури и айди верные.
UPD: еще деталь, для моей программы не важная, но обычно BinarySecurityToken идет впереди Signature. Про actor почудилось.
UPD2: через https://www.justsign.me/verifyqca/Verify/ также проверка прошла, ругнулост на тестовый сертификат.
Цитата:
Подпись математически корректна. Цепочка сертификатов обработана, но обработка прервана на корневом сертификате, у которого отсутствует отношение доверия с поставщиком доверия.

Отредактировано пользователем 14 августа 2019 г. 12:31:45(UTC)  | Причина: Не указана

Offline PashaTechnique  
#29 Оставлено : 14 августа 2019 г. 12:31:06(UTC)
PashaTechnique

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
В моей программе подпись прошла проверку, теперь ури и айди верные, бросилось в глаза только значение actor, раньше было другое. Может на него ФСС ругаться?
Код:
<wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/mo/OGRN_1025401011833" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

UPD: еще деталь, для моей программы не важная, но обычно BinarySecurityToken идет впереди Signature.


Убрал слово OGRN из записи оставил только цифры согласно рекомендациям.
Выдержки из документов ФСС.

Цитата:

Блок Security, принадлежащий пространству имен http://docs.oasis-open.o...security-secext-1.0.xsd, содержит в себе информацию, необходимую для проверки целостности сообщения и его отправителя. В случае, если сообщение подписывается несколькими отправителями, количество тегов Security будет совпадать с количеством подписантов. Одним из параметров блока является «actor», который должен быть заполнен по следующим правилам:
1. Для ЭП МО:
 «http://eln.fss.ru/actor/mo/[ОГРН_МЕДИЦИНСКОЙ_ОРГАНИЗАЦИИ]
 «http://eln.fss.ru/actor/mo/[ОГРН_МЕДИЦИНСКОЙ_ОРГАНИЗАЦИИ]/ ELN_[Номер ЛН] – при вызове метода prParseFilelnlpu;


Причем сам номер взят из этих же рекомендаций (1025401011833).

Но ошибка при расшифровке ответа, так и не изменилась "ORA-20001: Отсутствует подпись головной организации".

Offline two_oceans  
#30 Оставлено : 14 августа 2019 г. 12:39:44(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Тем не менее подпись сейчас математически корректна. Похоже дальше надо или с сервисом ФСС разбираться что им не нравится (гадать можно долго) или что-то не так в сертификате (что от тестового УЦ или что нет огрн или надо как-то регистрировать сертификат в фсс для конкретного отправителя).
thanks 1 пользователь поблагодарил two_oceans за этот пост.
PashaTechnique оставлено 14.08.2019(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
6 Страницы<12345>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.