Список методов вызываемые в NCALayer
(0 чел.) 
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ...
  • 8

ТЕМА: Список методов вызываемые в NCALayer

Re: Список методов вызываемые в NCALayer 1 год назад #4396

  • margulan
  • Модератор
  • Постов: 166
  • Репутация: 12
Rustem2016 написал:
Добрый день!
Подписал сообщение методом signXml с указанием объекта подписания и место для размещения подписи.
Теперь вопрос - в новом SDK есть только один пример проверки ЭЦП простого XML. А есть пример проверки XML с указанием объекта подписания (по аналогии signXmlById)?


В SDK нет примера, но можете модифицировать существующий метод:

String signatureParentElementXPath = "/root/testparentelement";
XPath xpath = XPathFactory.newInstance().newXPath();
try {
    xpath.setNamespaceContext(new NamespaceContext() {

        public String getNamespaceURI(String prefix) {
            return Constants.SignatureSpecNS;
        }

        public String getPrefix(String namespaceURI) {
            return "ds";
        }

        public Iterator<?> getPrefixes(String namespaceURI) {
            return null;
        }
    });
    NodeList sigList = (NodeList) xpath.evaluate(signatureParentElementXPath + "/ds:Signature", doc, XPathConstants.NODESET);
    for (int i = 0; i < sigList.getLength(); i++) {
        Element sigElement = (Element) sigList.item(i);       		
        //Проверка подписи как в примере или дополнительные проверки сертификата
	XMLSignature signature = new XMLSignature(sigElement, "");
	...
    }
} catch (XPathExpressionException e) {
    throw new Exception("...");
}

Re: Список методов вызываемые в NCALayer 1 год назад #4397

  • margulan
  • Модератор
  • Постов: 166
  • Репутация: 12
daureken написал:
Добрый вечер!

Вопрос по методу getKeyInfo. После выбора ЭЦП и ввода не правильного пароля в модальном окне выводится соответствующее сообщение и далее не дает отправить подпись без ввода корректного пароля. С действующей ЭЦП все работает нормально. Про вводе корректного пароля ЭЦП отправляется и все ок. Но если выбирать просроченное ЭЦП с корректным паролем выводится сообщение что срок либо истек либо еще не наступил, но отправка все равно возможна. Разве просроченное ЭЦП не дожно также блокироваться и как обойти этот момент? Можно конечно делать еще одну проверку на бэкенде, но по моему это не логично давать пользователю отправить просроченное ЭЦП, а потом предупреждать снова.


Верификация должна производиться на стороне сервера, поэтому такие операции в NCALayer не блокируются. При неправильном пароле не дает отправить подпись, потому что без пароля невозможно работать с хранилищами ключей.

Re: Список методов вызываемые в NCALayer 1 год назад #4398

  • Rustem2016
  • Давно я тут
  • Постов: 93
  • Репутация: 5
Добрый день!
Попробовал по вашему совету и сформировал следующий код для проверки:

try {
				Provider provider = new KalkanProvider();
				Security.addProvider(provider);
			    KncaXS.loadXMLSecurity();
				
				XMLSignature signature = null;
				
				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		        dbf.setNamespaceAware(true);
		        DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
		        Document doc = documentBuilder.parse(new ByteArrayInputStream(inputXML.getBytes("UTF-8")));
				
				XPathFactory factory = XPathFactory.newInstance();
		        XPath xpath = factory.newXPath();
				
				String signatureParentElementXPath = "//*[local-name()='Header']";
			
				xpath.setNamespaceContext(new NamespaceContext() {
	
		        public String getNamespaceURI(String prefix) {
		            return Constants.SignatureSpecNS;
		        }
	
		        public String getPrefix(String namespaceURI) {
		            return "ds";
		        }
	
		        public Iterator<?> getPrefixes(String namespaceURI) {
		            return null;
		        }
		    });
		    NodeList sigList = (NodeList) xpath.evaluate(signatureParentElementXPath + "/ds:Signature", doc, XPathConstants.NODESET);
		    for (int i = 0; i < sigList.getLength(); i++) {
		        Element sigElement = (Element) sigList.item(i);       		
		        signature = new XMLSignature(sigElement, "");
		        KeyInfo ki = signature.getKeyInfo();
	            X509Certificate cert = ki.getX509Certificate();
	            if (cert!=null) {
	                result = signature.checkSignatureValue(cert);
	            }
		    }
} catch (XPathExpressionException | ParserConfigurationException | XMLSecurityException | SAXException | IOException e) {
	e.printStackTrace();
}

Однако возвращает код ошибки -
gost big-endian block
авг 17, 2018 10:22:38 AM org.apache.xml.security.signature.XMLSignature checkSignatureValue
WARNING: Signature verification failed.
Изменено: 1 год назад от Rustem2016.

Re: Список методов вызываемые в NCALayer 1 год назад #4402

  • Rustem2016
  • Давно я тут
  • Постов: 93
  • Репутация: 5
Есть возможность решить данную проблему?

Re: Список методов вызываемые в NCALayer 1 год назад #4404

  • ololo
  • Живу я здесь
  • Постов: 464
  • Репутация: 57
Здравствуйте!
Вы хотите хотите через NCALayer потом подписывать в дальнейшем?
Тут проблема в том, что после нахождения по XPath, в подписываемый элемент не входят пространства имен верхних элементов, а при проверке они учитываются, и соответственно подпись не проверяется.
gg wp

Re: Список методов вызываемые в NCALayer 1 год назад #4405

  • Rustem2016
  • Давно я тут
  • Постов: 93
  • Репутация: 5
Добрый день!
Задача так и стоит - подписываем через NCALayer методом signXml по id, а проверяем на сервере средствами SDK.
И как указать подписываемый элемент при проверке? В примере от SDK этого варианта нет. А предложенный выше пример не работает.
В подписанный элемент, при проверке, тоже нужно указывать пространство имен - xpath.setNamespaceContext?
И нужно ли указывать пространство имен для атрибута Id подписываемого элемента? NCALayer такой вариант подписывает?
Изменено: 1 год назад от Rustem2016.
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ...
  • 8
FaLang translation system by Faboba