Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

КріптоПро

  1. Почнемо!
  2. підпишемо
  3. перевіримо
  4. В підсумку

Наша взаимовыгодная связь https://banwar.org/

У зв'язку з доробками «Формату взаємодії ГІС ГМП з інформаційними системами учасників» ( http://www.roskazna.ru/gis-gmp/ ) Ми продовжуємо тему організації взаємодії зі СМЕВ з використанням наших продуктів. Попередні замітки ви можете подивитися за посиланнями ( 1 і 2 ).

На початку цього року була випущена нова версія документа під номером 1.16.1 , Що описує новий формат взаємодії з інформаційною системою ГІС ГМП. Дана специфікація, серед інших змін, передбачає додавання в відправляється в систему документ XML підпису формату XAdES - T.

Формат ЕЦП XML документа XAdES описаний в стандарті «XML Advanced Electronic Signatures (XAdES)». Документ казначейства посилається на специфікацію http://www.w3.org/TR/XAdES/ . Взагалі кажучи, це застаріла версія - v1.1.1, актуальна версія - v1.3.2 . XAdES - це набір форматів вдосконаленою підпису документів XML, який розширює можливості формату XML DSig .

XAdES - T - це формат підпису з доданим до непідписані атрибути штампом часу (time-stamp), який може бути отриманий при зверненні до Служби Штампів Часу (TSA).

Для створення таких повідомлень ми будемо використовувати КріптоПро JCP і відкриту бібліотеку xades4j . Така зв'язка дозволяє створити підпис необхідного формату, і хоча xades4j не підтримує XAdES v1.1.1, підпис версії 1.3.2 успішно приймається тестовим сервісом .

Почнемо!

Оригінал тексту виглядає так:

<Soapenv: Envelope xmlns: rev = "http://smev.gosuslugi.ru/rev120315" xmlns: smev = "http://roskazna.ru/gisgmp/02000000/SmevGISGMPService/" xmlns: soapenv = "http: // schemas.xmlsoap.org/soap/envelope/ "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"> <soapenv: Header /> <soapenv: Body wsu: Id = "body"> <smev: GISGMPTransferMsg> <rev: Message> <rev: Sender> <rev: Code> AN0000001 </ rev: Code> <rev: Name> ІС АН 1 </ rev: Name> </ rev: Sender > <rev: Recipient> <rev: Code> RKZN35001 </ rev: Code> <rev: Name> Казначейство Росії </ rev: Name> </ rev: Recipient> <rev: ServiceName> GISGMP </ rev: ServiceName> < rev: TypeCode> GFNC </ rev: TypeCode> <rev: Status> REQUEST </ rev: Status> <rev: Date> 2015-06-15T10: 25: 00.0Z </ rev: Date> <rev: ExchangeType> 6 </ rev: ExchangeType> <rev: TestMsg> test </ rev: TestMsg> </ rev: Message> <rev: MessageData> <rev: AppData> <gisgmp: RequestMessage xmlns = "http://roskazna.ru / Gisgmp / xsd / 116 / PaymentInfo "xmlns: com =" http://roskazna.ru/gisgmp/xsd/116/Common "xmlns: ds =" http://www.w3.org/2000/09/xmldsig # "xmlns: gisgmp =" http://roskazna.ru/gisgmp/xsd/116/Message "xmlns: msgd =" http://roskazna.ru/gisgmp/xsd/116/MessageData "xmlns: n1 =" http : //www.altova.com/samplexml/other-namespace "xmlns: pgu =" http://roskazna.ru/gisgmp/xsd/116/PGU_ImportRequest "xmlns: bgi =" http://roskazna.ru/gisgmp / xsd / 116 / BudgetIndex "xmlns: org =" http://roskazna.ru/gisgmp/xsd/116/Organization "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "Id = "P_a7654321-8bcf-de90-123f-abcde0987654" senderIdentifier = "000147" timestamp = "2015-06-15T10: 25: 00.0Z"> <msgd: ImportRequest> <pgu: Package> <pgu: Document> <FinalPayment Id = "P_a1234567-bcf8-90de-f123-4567890abcde"> <SupplierBillID> 0 </ SupplierBillID> <Narrative> Оплата </ Narrative> <Amount> 10000 </ Amount> <PaymentDate> 2015-06-15T10: 25: 00 < / PaymentDate> <BudgetIndex> <bgi: Status> 01 </ bgi: Status> <bgi: Purpose> 0 </ bgi: Purpose> <bgi: TaxPeriod> 0 </ bgi: TaxPeriod> <b gi: TaxDocNumber> 0 </ bgi: TaxDocNumber> <bgi: TaxDocDate> 0 </ bgi: TaxDocDate> <bgi: PaymentType> 0 </ bgi: PaymentType> </ BudgetIndex> <PaymentIdentificationData> <Bank> <org: Name> ВТБ24 </ org: Name> <org: BIK> 044525716 </ org: BIK> <org: CorrespondentBankAccount> 40602810000380000020 </ org: CorrespondentBankAccount> </ Bank> <SystemIdentifier> 10445257164525716000114101697208 </ SystemIdentifier> </ PaymentIdentificationData> <Payer> <com: PayerIdentifier> +0100000000023456789012643 </ com: PayerIdentifier> <PayerName> Іванов Іван Миколайович </ PayerName> </ Payer> <Payee> <PayeeName> ГИБДД </ PayeeName> <payeeINN> 3543655766 </ payeeINN> <payeeKPP> 354365576 < / payeeKPP> <PayeeBankAcc> <org: AccountNumber> 40602810000380000020 </ org: AccountNumber> <org: Bank> <org: Name> Альфа </ org: Name> <org: BIK> 044525716 </ org: BIK> <org: CorrespondentBankAccount> 30101810100000000716 </ org: CorrespondentBankAccount> </ org: Bank> </ PayeeBankAcc> </ Payee> <ChangeStatus meaning = "1" /> <KBK> 18851111111111111113 </ KBK> <OKTMO> 123 45673 </ OKTMO> </ FinalPayment> </ pgu: Document> </ pgu: Package> </ msgd: ImportRequest> </ gisgmp: RequestMessage> </ rev: AppData> </ rev: MessageData> </ smev: GISGMPTransferMsg > </ soapenv: Body> </ soapenv: Envelope>

Ініціалізіруем бібліотеку JCPxml і включаємо перевірку ланцюжка сертифікатів за допомогою CRL по посиланнях в сертифікатах:

JCPXMLDSigInit.init (); System.setProperty ( "com.sun.security.enableCRLDP", "true"); System.setProperty ( "com.ibm.security.enableCRLDP", "true");

Отримуємо XML у вигляді об'єкта Document:

final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance (); dbFactory.setNamespaceAware (true); final Document sourceDocument = dbFactory.newDocumentBuilder (). (New ByteArrayInputStream (<binary_xml_document>));

Тепер необхідно знайти вузол для підписання. Підписується сутність, таким чином, щоб має атрибут Id виду <буква [AZ]> _ <GUID>. Сама підпис в результаті буде поміщена всередину підписується вузла. Припустимо, що виробляється імпорт платежу - документа finalPayment з Id рівним P_a1234567-bcf8-90de-f123-4567890abcde.

final XPathFactory factory = XPathFactory.newInstance (); final XPath xpath = factory.newXPath (); final XPathExpression expr = xpath.compile (String.format ( "// * [@ Id = '% s']", "P_a1234567-bcf8-90de-f123-4567890abcde")); final NodeList nodes = (NodeList) expr.evaluate (sourceDocument, XPathConstants.NODESET); if (nodes.getLength () == 0) {throw new Exception ( "Can not find node with id = P_a1234567-bcf8-90de-f123-4567890abcde"); } // if final Node nodeToSign = nodes.item (0); final String referenceURI = "# P_a1234567-bcf8-90de-f123-4567890abcde";

підпишемо

Далі готуємо ключ підпису і сертифікат для додавання в підпис. На випадок перевірки ЕЦП виконується завантаження списку довірених кореневих сертифікатів із спеціального, заздалегідь підготовленого сховища. Крім того, може бути задіяний додатковий список сертифікатів (наприклад, проміжних) і CRL (на випадок оффлайновой перевірки ланцюжка сертифікатів).

final KeyStore keyStore = KeyStore.getInstance ( "HDImageStore", JCP.PROVIDER_NAME); keyStore.load (null, null); final PrivateKey privateKey = (PrivateKey) keyStore.getKey (<key_alias>, <key_password>); final X509Certificate cert = (X509Certificate) keyStore.getCertificate (<key_alias>); // Завантаження списку довірених кореневих сертифікатів (для подальшої за створенням підпису перевіркою ланцюжка сертифікатів final KeyStore trustStore = GostXAdESUtility.loadCertStore (trustStorePath, trustStorePassword); // Список додаткових сертифікатів (наприклад, проміжних) і CRL final CertStore intermediateCertsAndCRLStore = CertStore.getInstance ( " Collection ", new CollectionCertStoreParameters (intermediateCertsAndCRLs)); final KeyingDataProvider keyingProvider = new DirectKeyingDataProvider (cert, privateKey);

Потім необхідно створити профіль для підпису формату XAdES-T. У нашому прикладі кожному алгоритму хешування відповідає адреса служби TSA. Для цілей тестування ми будемо використовувати службу за адресою http://www.cryptopro.ru/tsp/ . Функції хешування слід форматувати за допомогою OID'ов алгоритмів хешування, а не їх імен. Ці відповідності прописані в службовому класі GostXAdESUtility. Також необхідно перевизначити інші функції визначення алгоритмів, реалізувавши інтерфейс DefaultAlgorithmsProviderEx.

Зауваження. На момент написання статті сервіс ГІС ГМП перевіряв тільки наявність вузла зі штампом часу, але не перевіряв сам штамп часу. Тому ми використовували нашу тестову службу TSA. У майбутньому, цілком імовірно, сервіс стане довіряти тільки певним службам TSA.

final XadesSigningProfile sigProf = new XadesTSigningProfile (keyingProvider) .withTimeStampTokenProvider (new GostTimeStampTokenProvider (...)) .withDigestEngineProvider (new DefaultMessageDigestProvider () {@Override public MessageDigest getEngine (String digestAlgorithmURI) throws UnsupportedAlgorithmException {// Визначення OID'а алгоритму хешування по URN final String digestAlgOid = GostXAdESUtility.digestUri2Digest (digestAlgorithmURI); try {return MessageDigest.getInstance (digestAlgOid);} catch (NoSuchAlgorithmException e) {throw new UnsupportedAlgorithmException (e.getMessage (), digestAlgorithmURI, e);}}}) .withAlgorithmsProviderEx (new DefaultAlgorithmsProviderEx () private String digestUrn = null; @Override public Algorithm getSignatureAlgorithm (String keyAlgorithmName) throws UnsupportedAlgorithmException {// Визначення URN алгоритму хешування за алгоритмом ключа підпису digestUrn = G ostXAdESUtility.key2DigestUrn (keyAlgorithmName); // Визначення URN алгоритму підпису по алгоритму ключа підпису final String signatureUrn = GostXAdESUtility.key2SignatureUrn (keyAlgorithmName); return new GenericAlgorithm (signatureUrn); } @Override public String getDigestAlgorithmForReferenceProperties () {digestUrn; } @Override public String getDigestAlgorithmForDataObjsReferences () {digestUrn; } @Override public String getDigestAlgorithmForTimeStampProperties () {digestUrn; } @Override public Algorithm getCanonicalizationAlgorithmForSignature () {return new ExclusiveCanonicalXMLWithoutComments (); } @Override public Algorithm getCanonicalizationAlgorithmForTimeStampProperties () {return new ExclusiveCanonicalXMLWithoutComments (); }});

Далі підписуємо вузол з додаванням підпису в нього самого (так звана enveloped signature):

final XadesSigner signer = sigProf.newSigner (); final DataObjectDesc dataObj = new DataObjectReference (referenceURI); dataObj.withTransform (new EnvelopedSignatureTransform ()); final SignedDataObjects dataObjects = new SignedDataObjects (dataObj); signer.sign (dataObjects, nodeToSign);

Клас GostTimeStampTokenProvider реалізує інтерфейс TimeStampTokenProvider. Даний клас є клоном аналогічного класу DefaultTimeStampTokenProvider бібліотеки xades4j. Це було необхідно, тому що клас DefaultTimeStampTokenProvider має метод identifierForDigest для обчислення алгоритму хешування, а список власних алгоритмів класу обмежений і не дозволяє задати інші алгоритми або провайдер. З цієї ж причини при перевірці штампа використовується своя реалізація у вигляді класу GostTimeStampVerificationProvider (аналог рідного класу бібліотеки DefaultTimeStampVerificationProvider з інтерфейсом TimeStampVerificationProvider).

перевіримо

Для повноти картини добре б ще вміти перевіряти такі підписи. Для початку знайдемо вузол підписи і створимо профіль перевірки:

// Перевіряється документ final Document verifyDocument = sourceDocument; // Вузол з підписом (імовірно, один). final NodeList nl = verifyDocument.getElementsByTagNameNS (XMLSignature.XMLNS, "Signature"); if (nl.getLength () == 0) {throw new Exception ( "Can not find Signature element"); } // if // Перевірка ланцюжка сертифікатів включена final CertificateValidationProvider validationProvider = new PKIXCertificateValidationProvider (trustStore, true, intermediateCertsAndCRLStore); final XadesVerificationProfile verProf = new XadesVerificationProfile (validationProvider) .withTimeStampTokenVerifier (new GostTimeStampVerificationProvider (validationProvider, ...)) .withDigestEngineProvider (new DefaultMessageDigestProvider () {@Override public MessageDigest getEngine (String digestAlgorithmURI) throws UnsupportedAlgorithmException {// Визначення OID'а алгоритму хешування по URN final String digestAlgOid = GostXAdESUtility.digestUri2Digest (digestAlgorithmURI); try {return MessageDigest.getInstance (digestAlgOid);} catch (NoSuchAlgorithmException e) {throw new UnsupportedAlgorithmException (e.getMessage (), digestAlgorithmURI, e);}}});

Тепер можна перевірити підпис і сертифікати:

final XadesVerifier verifier = verProf.newVerifier (); final Element signatureElement = (Element) nl.item (0); // імовірно, один вузол з підписом verifier.verify (signatureElement, null);

В підсумку

Таким чином, в вузол finalPayment документа в кінці був доданий новий вузол з підписом. Підписана повідомлення виглядає наступним чином:

<Soapenv: Envelope xmlns: soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: rev = "http://smev.gosuslugi.ru/rev120315" xmlns: smev = "http: // roskazna.ru/gisgmp/02000000/SmevGISGMPService/ "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"> <soapenv: Header /> <soapenv: Body wsu: Id = "body"> <smev: GISGMPTransferMsg> <rev: Message> <rev: Sender> <rev: Code> AN0000001 </ rev: Code> <rev: Name> ІС АН 1 </ rev: Name> </ rev: Sender > <rev: Recipient> <rev: Code> RKZN35001 </ rev: Code> <rev: Name> Казначейство Росії </ rev: Name> </ rev: Recipient> <rev: ServiceName> GISGMP </ rev: ServiceName> < rev: TypeCode> GFNC </ rev: TypeCode> <rev: Status> REQUEST </ rev: Status> <rev: Date> 2015-06-15T10: 25: 00.0Z </ rev: Date> <rev: ExchangeType> 6 </ rev: ExchangeType> <rev: TestMsg> test </ rev: TestMsg> </ rev: Message> <rev: MessageData> <rev: AppData> <gisgmp: RequestMessage xmlns: gisgmp = "http: // rosk azna.ru/gisgmp/xsd/116/Message "xmlns =" ​​http://roskazna.ru/gisgmp/xsd/116/PaymentInfo "xmlns: bgi =" http://roskazna.ru/gisgmp/xsd/116/ BudgetIndex "xmlns: com =" http://roskazna.ru/gisgmp/xsd/116/Common "xmlns: ds =" http://www.w3.org/2000/09/xmldsig# "xmlns: msgd =" http://roskazna.ru/gisgmp/xsd/116/MessageData "xmlns: n1 =" http://www.altova.com/samplexml/other-namespace "xmlns: org =" http://roskazna.ru/ gisgmp / xsd / 116 / Organization "xmlns: pgu =" http://roskazna.ru/gisgmp/xsd/116/PGU_ImportRequest "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance " Id = "P_a7654321-8bcf-de90-123f-abcde0987654" senderIdentifier = "000147" timestamp = "2015-06-15T10: 25: 00.0Z"> <msgd: ImportRequest> <pgu: Package> <pgu: Document> <FinalPayment Id = "P_a1234567-bcf8-90de-f123-4567890abcde"> <SupplierBillID> 0 </ SupplierBillID> <Narrative> Оплата </ Narrative> <Amount> 10000 </ Amount> <PaymentDate> 2015-06-15T10: 25: 00 </ PaymentDate> <BudgetIndex> <bgi: Status> 01 </ bgi: Status> <bgi: Purpose> 0 </ bgi: Purpose> <bgi: TaxPeriod> 0 </ bgi: TaxPeriod> <b gi: TaxDocNumber> 0 </ bgi: TaxDocNumber> <bgi: TaxDocDate> 0 </ bgi: TaxDocDate> <bgi: PaymentType> 0 </ bgi: PaymentType> </ BudgetIndex> <PaymentIdentificationData> <Bank> <org: Name> ВТБ24 </ org: Name> <org: BIK> 044525716 </ org: BIK> <org: CorrespondentBankAccount> 40602810000380000020 </ org: CorrespondentBankAccount> </ Bank> <SystemIdentifier> 10445257164525716000114101697208 </ SystemIdentifier> </ PaymentIdentificationData> <Payer> <com: PayerIdentifier> +0100000000023456789012643 </ com: PayerIdentifier> <PayerName> Іванов Іван Миколайович </ PayerName> </ Payer> <Payee> <PayeeName> ГИБДД </ PayeeName> <payeeINN> 3543655766 </ payeeINN> <payeeKPP> 354365576 < / payeeKPP> <PayeeBankAcc> <org: AccountNumber> 40602810000380000020 </ org: AccountNumber> <org: Bank> <org: Name> Альфа </ org: Name> <org: BIK> 044525716 </ org: BIK> <org: CorrespondentBankAccount> 30101810100000000716 </ org: CorrespondentBankAccount> </ org: Bank> </ PayeeBankAcc> </ Payee> <ChangeStatus meaning = "1" /> <KBK> 18851111111111111113 </ KBK> <OKTMO> 123 45673 </ OKTMO> <ds: Signature xmlns: ds = "http://www.w3.org/2000/09/xmldsig#" Id = "xmldsig-d543dd42-e1e3-4d6b-93d2-7be28ddb16c9"> <ds: SignedInfo> <ds: CanonicalizationMethod Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#" /> <ds: SignatureMethod Algorithm = "http://www.w3.org/2001 / 04 / xmldsig-more # gostr34102001-gostr3411 "/> <ds: Reference Id =" xmldsig-d543dd42-e1e3-4d6b-93d2-7be28ddb16c9-ref0 "URI =" # P_a1234567-bcf8-90de-f123-4567890abcde "> < ds: Transforms> <ds: Transform Algorithm = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> </ ds: Transforms> <ds: DigestMethod Algorithm = "http: // www.w3.org/2001/04/xmldsig-more#gostr3411 "/> <ds: DigestValue> g6jg + PYUivyEymaJ4m0MREUsbjumqk / nrNoDcRDxObs = </ ds: DigestValue> </ ds: Reference> <ds: Reference Type =" http: //uri.etsi.org/01903#SignedProperties "URI =" # xmldsig-d543dd42-e1e3-4d6b-93d2-7be28ddb16c9-signedprops "> <ds: DigestMethod Algorithm =" http://www.w3.org/2001/ 04 / xmldsig-more # gostr3411 "/> <ds: DigestValue> / 4WBWJuvE8rlPAA6nTKgSgJFnoz2TqCO9dX2fpaupSI = </ ds: Di gestValue> </ ds: Reference> </ ds: SignedInfo> <ds: SignatureValue Id = "xmldsig-d543dd42-e1e3-4d6b-93d2-7be28ddb16c9-sigvalue"> OlCFVqO7P7MrRO4YQCsLIzHqpvUF1PCJHsCj6KrtIIW + 8ckp23miwUO8wZdwBke2 + i0sXkM1RrhU 6vNf2aPyuw == </ ds: SignatureValue> <ds: KeyInfo> <ds: X509Data> <ds: X509Certificate> MIIDDTCCArygAwIBAgITEgADylAEJzpv3qM8FgAAAAPKUDAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3 DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cx FzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVy IDIwHhcNMTUwNDI3MTI1NTQ1WhcNMTUwNzI3MTMwNTQ1WjAcMQ0wCwYDVQQDDAR0ZXN0MQswCQYD VQQGEwJSVTBjMBwGBiqFAwICEzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEAc + wgTI3j + qtOlPyxJ dPeotFrRpWDRcGpN8Qaerh9C / B8S5CigWnUmywFtQfYBLn5AZZYlKyc + IKQ + bylhQrx4o4IBcDCC AWwwDgYDVR0PAQH / BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1UdDgQWBBTRXniY4glp DAFTC + 1LfrtDiwRKtzAfBgNVHSMEGDAWgBQVMXywjRreZtcVnElSlxckuQF6gzBZBgNVHR8EUjBQ ME6gTKBKhkhodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NSWVBUTy1QUk8l MjBUZXN0JTIwQ2VudGVyJTIwM i5jcmwwgakGCCsGAQUFBwEBBIGcMIGZMGEGCCsGAQUFBzAChlVo dHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3QtY2EtMjAxNF9DUllQVE8t UFJPJTIwVGVzdCUyMENlbnRlciUyMDIuY3J0MDQGCCsGAQUFBzABhihodHRwOi8vdGVzdGNhLmNy eXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgGBiqFAwICAwNBAKWYnAV3 + g6NqZQtFOTfsdIEzhZ3 vilddfAcLipmyp7oIRZ / uUWb4KlGFdxO7RG7oFEHb95DHsc4qcU5xc6iE1Y = </ ds: X509Certificate> </ ds: X509Data> </ ds: KeyInfo> <ds: Object> <xades: QualifyingProperties xmlns: xades = "http: //uri.etsi. org / 01903 / v1.3.2 # "xmlns: xades141 =" http://uri.etsi.org/01903/v1.4.1# "Target =" # xmldsig-d543dd42-e1e3-4d6b-93d2-7be28ddb16c9 "> <xades : SignedProperties Id = "xmldsig-d543dd42-e1e3-4d6b-93d2-7be28ddb16c9-signedprops"> <xades: SignedSignatureProperties> <xades: SigningTime> 2015-06-25T17: 39: 42.717 + 04: 00 </ xades: SigningTime> < xades: SigningCertificate> <xades: Cert> <xades: CertDigest> <ds: DigestMethod Algorithm = "http://www.w3.org/2001/04/xmldsig-more#gostr3411" /> <ds: DigestValue> UY1Od5EcmMj7FYpWwIs67IbTb2b1WGLs7ecAJvGB8PY = </ ds: DigestValue> </ x ades: CertDigest> <xades: IssuerSerial> <ds: X509IssuerName> CN = CRYPTO-PRO Test Center 2, O = CRYPTO-PRO LLC, L = Moscow, C = RU, 1.2.840.113549.1.9.1 = # 1614737570706f72744063727970746f70726f2e7275 </ ds: X509IssuerName> <ds: X509SerialNumber> 401414703340175114220951230997187614686300752 </ ds: X509SerialNumber> </ xades: IssuerSerial> </ xades: Cert> </ xades: SigningCertificate> </ xades: SignedSignatureProperties> </ xades: SignedProperties> <xades: UnsignedProperties > <xades: UnsignedSignatureProperties> <xades: SignatureTimeStamp> <ds: CanonicalizationMethod Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#" /> <xades: EncapsulatedTimeStamp> MIAGCSqGSIb3DQEHAqCAMIIOrQIBAzEMMAoGBiqFAwICCQUAMHwGCyqGSIb3DQEJEAEEoG0EazBp AgEBBgcqhQMCAiYEMC4wCgYGKoUDAgIJBQAEIB / EL84LaQU6lJenbg4scj0Ss0wrsED30m3vlRYm De0rAg0T + FyYogAAAAAAHxY9GA8yMDE1MDYyNTEzNDEwMVowAwIBZAIGAU4q8gwPoIIIvDCCCLgw gghnoAMCAQICCne4NNQAAwACocYwCAYGKoUDAgIDMIIBSDEYMBYGBSqFA2QBEg0xMDM3NzAwMDg1 NDQ0MRowGAYIKoUDA4EDAQESDDAwNzcxNzEwNzk5MTE5MDcGA1UECR4wBEMEOwAuACAEIQRD BEkE UQQyBEEEOgQ4BDkAIAQyBDAEOwAsACAENAAuACAAMQA4MSEwHwYDVQQIHhgANwA3ACAEMwAuACAE HAQ + BEEEOgQyBDAxFTATBgNVBAceDAQcBD4EQQQ6BDIEMDEgMB4GCSqGSIb3DQEJARYRaW5mb0Bj cnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMSkwJwYDVQQKHiAEHgQeBB4AIAAiBBoEIAQYBB8EIgQe AC0EHwQgBB4AIjFBMD8GA1UEAx44BCIENQRBBEIEPgQyBEsEOQAgBCMEJgAgBB4EHgQeACAAIgQa BCAEGAQfBCIEHgAtBB8EIAQeACIwHhcNMTQwOTI1MTUwMzAwWhcNMTkwOTI1MTUxMzAwWjCCAdAx FjAUBgUqhQNkAxILMTIzNDU2Nzg5MDExGDAWBgUqhQNkARINMTAwNzcxMjM0NTY3ODEaMBgGCCqF AwOBAwEBEgwwMDc3MTIzNDU2NzgxIzAhBgkqhkiG9w0BCQEWFHN1cHBvcnRAY3J5cHRvcHJvLnJ1 MQswCQYDVQQGEwJSVTEhMB8GA1UECB4YADcANwAgBDMALgAgBBwEPgRBBDoEMgQwMRUwEwYDVQQH HgwEHAQ + BEEEOgQyBDAxKTAnBgNVBAoeIAQeBB4EHgAgACIEGgQgBBgEHwQiBB4ALQQfBCAEHgAi MS0wKwYDVQQLHiQEHgRCBDQENQQ7ACAEQgQ1BEEEQgQ4BEAEPgQyBDAEPQQ4BE8xGjAYBgNVBAMT EURlbW8gVFNBIE9wZXJhdG9yMTkwNwYDVQQJHjAEQwQ7AC4AIAQhBEMESQRRBDIEQQQ6BDgEOQAg BDIEMAQ7ACwAIAQ0AC4AIAAxADgxJzAlBgNVBAweHgQiBDUEQQRCBDgEQAQ + BDIESQQ4BDoAIABU AFMAUDEjMCEGA1UEKh4aBCIENQRBBEIAIAQiBDUEQQRCBD4EMgQ4BEcxFTATBgNVBAQeDAQ iBDUE QQRCBD4EMjBjMBwGBiqFAwICEzASBgcqhQMCAiMBBgcqhQMCAh4BA0MABECXVOagL4FCbIH + / dte 0a8it + AK8IShzzCcKc6W2OAy19RflLosGcLLOraSuYv6LT7QKPIvoGFFEwLwX1u57s9ko4IEozCC BJ8wDgYDVR0PAQH / BAQDAgbAMBYGA1UdJQEB / wQMMAoGCCsGAQUFBwMIMB0GA1UdDgQWBBQ5qYEJ GROXhfSo6E4UY + Zc6pMmujCCAYkGA1UdIwSCAYAwggF8gBQrshA0ZoICrPDhqkCGeAFxRZ0z46GC AVCkggFMMIIBSDEYMBYGBSqFA2QBEg0xMDM3NzAwMDg1NDQ0MRowGAYIKoUDA4EDAQESDDAwNzcx NzEwNzk5MTE5MDcGA1UECR4wBEMEOwAuACAEIQRDBEkEUQQyBEEEOgQ4BDkAIAQyBDAEOwAsACAE NAAuACAAMQA4MSEwHwYDVQQIHhgANwA3ACAEMwAuACAEHAQ + BEEEOgQyBDAxFTATBgNVBAceDAQc BD4EQQQ6BDIEMDEgMB4GCSqGSIb3DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJV MSkwJwYDVQQKHiAEHgQeBB4AIAAiBBoEIAQYBB8EIgQeAC0EHwQgBB4AIjFBMD8GA1UEAx44BCIE NQRBBEIEPgQyBEsEOQAgBCMEJgAgBB4EHgQeACAAIgQaBCAEGAQfBCIEHgAtBB8EIAQeACKCEESH 2ldJk2CeSHb2gnNE / xcwXAYDVR0fBFUwUzBRoE + gTYZLaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUv cmEvY2RwLzJiYjIxMDM0NjY4MjAyYWNmMGUxYWE0MDg2NzgwMTcxNDU5ZDMzZTMuY3JsMIGxBggr BgEFBQcBAQSBpDCBoTA0BggrBgEFBQcwAYYoaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUvb2 NzcG5j Mi9vY3NwLnNyZjAyBggrBgEFBQcwAYYmaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUvb2NzcDIvb2Nz cC5zcmYwNQYIKwYBBQUHMAKGKWh0dHA6Ly93d3cuY3J5cHRvcHJvLnJ1L3JhL2NkcC9jYWNlcjMu Y3J0MCsGA1UdEAQkMCKADzIwMTQwOTI1MTUwMzAwWoEPMjAxNTEyMjUxNTAzMDBaMB0GA1UdIAQW MBQwCAYGKoUDZHEBMAgGBiqFA2RxAjA0BgUqhQNkbwQrDCnQmtGA0LjQv9GC0L7Qn9GA0L4gQ1NQ ICjQstC10YDRgdC40Y8gMy42KTCCATMGBSqFA2RwBIIBKDCCASQMKyLQmtGA0LjQv9GC0L7Qn9GA 0L4gQ1NQIiAo0LLQtdGA0YHQuNGPIDMuNikMUyLQo9C00L7RgdGC0L7QstC10YDRj9GO0YnQuNC5 INGG0LXQvdGC0YAgItCa0YDQuNC / 0YLQvtCf0YDQviDQo9CmIiDQstC10YDRgdC40LggMS41DE / Q odC10YDRgtC40YTQuNC60LDRgiDRgdC + 0L7RgtCy0LXRgtGB0YLQstC40Y8g4oSWINCh0KQvMTI0 LTIyMzgg0L7RgiAwNC4xMC4yMDEzDE / QodC10YDRgtC40YTQuNC60LDRgiDRgdC + 0L7RgtCy0LXR gtGB0YLQstC40Y8g4oSWINCh0KQvMTI4LTIzNTEg0L7RgiAxNS4wNC4yMDE0MAgGBiqFAwICAwNB AGCk / BinLYqEzWnAC / SwRl / Zm6fwx6DnKIg5zz0JsR9SBMxtwLojnyAxBHMxN4FO4vBNyivXxFOT yLTU6pgsKJUxggVaMIIFVgIBATCCAVgwggFIMRgwFgYFKoUDZAESDTEwMzc3MDAwODU0NDQxGjAY BggqhQMDgQMBARIMMDA3NzE3MTA3OTkxMTkwNwYDVQQJHjAEQwQ7AC4AIAQhBEMESQRRB DIEQQQ6 BDgEOQAgBDIEMAQ7ACwAIAQ0AC4AIAAxADgxITAfBgNVBAgeGAA3ADcAIAQzAC4AIAQcBD4EQQQ6 BDIEMDEVMBMGA1UEBx4MBBwEPgRBBDoEMgQwMSAwHgYJKoZIhvcNAQkBFhFpbmZvQGNyeXB0b3By by5ydTELMAkGA1UEBhMCUlUxKTAnBgNVBAoeIAQeBB4EHgAgACIEGgQgBBgEHwQiBB4ALQQfBCAE HgAiMUEwPwYDVQQDHjgEIgQ1BEEEQgQ + BDIESwQ5ACAEIwQmACAEHgQeBB4AIAAiBBoEIAQYBB8E IgQeAC0EHwQgBB4AIgIKd7g01AADAAKhxjAKBgYqhQMCAgkFAKCCA5kwGgYJKoZIhvcNAQkDMQ0G CyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCC29 + 8pMk62hlgQ39kxlDUUz5nEMH0suDP8NDh3 uJ1aYTCCAZcGCyqGSIb3DQEJEAIMMYIBhjCCAYIwggF + MIIBegQUQFnWYhYsjcWzN0tpu7wHmF1 + HLEwggFgMIIBUKSCAUwwggFIMRgwFgYFKoUDZAESDTEwMzc3MDAwODU0NDQxGjAYBggqhQMDgQMB ARIMMDA3NzE3MTA3OTkxMTkwNwYDVQQJHjAEQwQ7AC4AIAQhBEMESQRRBDIEQQQ6BDgEOQAgBDIE MAQ7ACwAIAQ0AC4AIAAxADgxITAfBgNVBAgeGAA3ADcAIAQzAC4AIAQcBD4EQQQ6BDIEMDEVMBMG A1UEBx4MBBwEPgRBBDoEMgQwMSAwHgYJKoZIhvcNAQkBFhFpbmZvQGNyeXB0b3Byby5ydTELMAkG A1UEBhMCUlUxKTAnBgNVBAoeIAQeBB4EHgAgACIEGgQgBBgEHwQiBB4ALQQfBCAEHgAiMUEwPwYD VQQDHjgEIgQ1BEEEQgQ + BDIESwQ5ACAEIwQmACAEHgQeBB4AIAAiBBoEIAQYBB8EIgQe AC0EHwQg BB4AIgIKd7g01AADAAKhxjCCAa0GCyqGSIb3DQEJEAIvMYIBnDCCAZgwggGUMIIBkDAIBgYqhQMC AgkEIBnWPpb5e9Sq6OJx3daHv5Yr9hn5Jj1tbNbz8NskXryRMIIBYDCCAVCkggFMMIIBSDEYMBYG BSqFA2QBEg0xMDM3NzAwMDg1NDQ0MRowGAYIKoUDA4EDAQESDDAwNzcxNzEwNzk5MTE5MDcGA1UE CR4wBEMEOwAuACAEIQRDBEkEUQQyBEEEOgQ4BDkAIAQyBDAEOwAsACAENAAuACAAMQA4MSEwHwYD VQQIHhgANwA3ACAEMwAuACAEHAQ + BEEEOgQyBDAxFTATBgNVBAceDAQcBD4EQQQ6BDIEMDEgMB4G CSqGSIb3DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMSkwJwYDVQQKHiAEHgQe BB4AIAAiBBoEIAQYBB8EIgQeAC0EHwQgBB4AIjFBMD8GA1UEAx44BCIENQRBBEIEPgQyBEsEOQAg BCMEJgAgBB4EHgQeACAAIgQaBCAEGAQfBCIEHgAtBB8EIAQeACICCne4NNQAAwACocYwCgYGKoUD AgITBQAEQNZgQ3 + P7wMQIGyHS14QIQhW0xQNaSGbPQaLcfcfjqgSYPI9S + qXaK + p7O2AKFOHblwk osG1wsLu1UM2cFcOsL8AAAAA </ xades: EncapsulatedTimeStamp> </ xades: SignatureTimeStamp> </ xades: UnsignedSignatureProperties> </ xades: UnsignedProperties> </ xades: QualifyingProperties> < / ds: Object> </ ds: Signature> </ FinalPayment> </ pgu: Document> </ pgu: Package> </ msgd: ImportRequest> </ gisgmp: RequestMessa ge> </ rev: AppData> </ rev: MessageData> </ smev: GISGMPTransferMsg> </ soapenv: Body> </ soapenv: Envelope>

Оскільки взаємодія з системою ГІС ГМП йде не безпосередньо, а через сервіс СМЕВ, то тіло повідомлення треба ще раз підписати відповідним чином. Як це зробити, описано в минулого статті.

Слід звернути увагу, що в залежності від запиту, відповіддю на повідомлення може бути як відповідь від сервісу ГІС ГМП, так і відповідь від СМЕВ з ідентифікатором запиту. У другому випадку потрібно ще одне звернення в СМЕВ для отримання результату запиту від ГІС ГМП.

Повний текст прикладів для створення повідомлення можна скачати по засланні . Розібраний приклад реалізований в класі XAdESExample. В архіві також містяться приклади GisGmpServiceExample, GisGmpServiceCombinedExample і GisGmpServiceLowEnvelopeExample.

У GisGmpServiceExample відбувається підпис існуючого документа XML (заготовки лежать в папці xades \ gisgmp \ source) і запиту на обробку документа по package identifier. Приклад працює з двома документами - SOAP_etalon_pay.xml і SOAP_etalon_pay_response_1_id.xml. Зразки цих документів також є в xades \ gisgmp \ source.

Інший приклад, GisGmpServiceCombinedExample, схожий на GisGmpServiceExample, але формування документа відбувається прямо в коді за допомогою класів, створених за xsd-схемами, узятим з архіву, вкладеного в специфікацію форматів ГІС ГМП. Тільки необхідно додати ще одну схему, без якої генерується неповний набір класів:

<Wsdl: types> <xsd: schema targetNamespace = "http://roskazna.ru/gisgmp/02000000/SmevGISGMPService/" xmlns: smev = "http://smev.gosuslugi.ru/rev120315"> <xsd: import schemaLocation = "xsd / request / smev.unifo.rev120315.xsd" namespace = "http://smev.gosuslugi.ru/rev120315" /> <xsd: import schemaLocation = "xsd / request / Message.xsd" namespace = "http : //roskazna.ru/gisgmp/xsd/116/Message "/> <xsd: element name =" GISGMPTransferMsg "type =" smev: BaseMessageType "/> </ xsd: schema> </ wsdl: types>

У третьому прикладі, GisGmpServiceLowEnvelopeExample, документи формуються з текстових блоків із зазначенням назв, просторів імен і збережених значень.

Всі приклади використовують сховище кореневих сертифікатів xadesTrustStore, в якому знаходяться кілька кореневих сертифікатів УЦ ТОВ «КРИПТО-ПРО». Зразок сховища знаходиться в папці xades \ gisgmp \ source архіву і має пароль 1. Перед запуском прикладів їх слід помістити в папку <корень_проекта> / data.

У цих прикладах також використовуються два контейнери: один тестовий, test, з паролем 1. Такий ключ може бути випущений в нашому тестовому УЦ . Інший - спеціальний контейнер з сертифікатом, випущеним акредитованим УЦ, він необхідний для створення зовнішньої підписи для СМЕВ. Тут необхідно використовувати ваш діючий ключ.

З питаннями та зауваженнями чекаємо вас на нашому форумі .

Афанасьєв Євген

Бєляєв Анатолій

Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: