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

Уведомление

Icon
Error

16 Страницы«<23456>»
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений Афанасьев  
#31 Оставлено : 15 июня 2015 г. 10:24:32(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
.

Отредактировано пользователем 15 июня 2015 г. 10:34:38(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#32 Оставлено : 15 июня 2015 г. 15:22:12(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
В ходе проверок было получено несколько разных ответов:
5 - Импортируемые данные уже присутствуют в системе;
8 - Нет прав на импорт/ уточнение/аннулирование сущности данного типа;
13 - ЭП под сущностью (запросом) не верна.

Прилагаем архив, в котором находятся:
1. Несколько xml документов в папке data. Каждая пара называется SOAP_etalon_pay.xml_[xxx] и SOAP_etalon_pay_response_1_id.xml_[xxx].
Хвост в виде _xxx перед запуском следует убирать (то есть выбирается та или иная пара документов).
Документ SOAP_etalon_pay - первый отравляемый запрос (импорт платежа), документ SOAP_etalon_pay_response_1_id - запрос с package id для проверки обработки.
Файлов-примеров несколько (пар), т.к. в них прописаны разные отправители (некие 000147 и 0000a1).
Пара документов с расширением _0000a1 (sender=0000a1) дает при выполнении код 8, пара документов с расширением _000147 (sender=000147) дает код 13.
Документ SOAP_etalon_pay.xml_000147_exists (sender=000147) в паре с SOAP_etalon_pay_response_1_id.xml_000147 дает код 5.
Зависимость между кодом ошибки и этапом проверки не ясна, однако:
а) в случае получения кода 8 (документы SOAP_etalon_pay.xml_0000a1 и SOAP_etalon_pay_response_1_id.xml_0000a1) изменение подписи или штампа ни на что не влияет, видимо, до проверки подписи не доходит;
б) в случае c кодом 5 (данные уже присутствуют в системе) - SOAP_etalon_pay.xml_000147_exists почти идентичен SOAP_etalon_pay.xml_000147 (для получателя 000147; что нужно изменить, чтобы этот документ стал уникальным - неясно), хотя SOAP_etalon_pay.xml_000147 дает в итоге 13.
В инструкции ГИС ГМП упоминается "Загрузка и обновление сертификатов ключей проверки ЭП участников" - возможно, у sender 000147 имеется какой-то другой сертификат в системе(?).
2. Архив примеров (samples-sources.jar).
В частности, добавлен пример создания XAdES-T - XAdESExample в пакет xades и GisGmpServiceExample в xades.gisgmp.
С помощью XAdESExample можно подписать и проверить документ (узел). Перед запуском нужно иметь в папке data (см. архив) пару файлов с именами SOAP_etalon_pay.xml и SOAP_etalon_pay_response_1_id.xml и скопировать ключевой контейнер test. Для XAdES-T используется тестовый ключевой контейнер из класса Container2001 (в пакете CAdES.configuration.container) и хранилище доверенных сертификатов xadesTrustStore с паролем 1 для проверки подписи.
Пример GisGmpServiceExample в пакете xades.gisgmp осуществляет последовательно подпись документа с именем SOAP_etalon_pay.xml, затем создание Security Header и подпись всего документа с помощью специального контейнера с сертификатом, выпущенным в аккредитованном УЦ (иначе не проходила проверка подписи). Затем из полученного ответа извлекается package id, формируется запрос из документа SOAP_etalon_pay_response_1_id.xml с подстановкой package id, запрос с package id отправляется и получается ответ.
Существование проблемы с версией xades в документе пока не установлено.
3. Тестовый ключевой контейнер test с паролем 1, выпущен в тестовом УЦ (для подписи XAdES-T).
4. Хранилище доверенных сертификатов xadesTrustStore с паролем 1 в папке data (для проверки подписи XAdES-T).

Потребуются зависимости (xades - для XAdeS-T подписи и wss4j для общей подписи) из папки dependencies:

aopalliance-1.0.jar
bcpkix-jdk15on-1.50.jar
bcprov-jdk15on-1.50.jar
guice-2.0.jar
guice-multibindings-2.0.jar
axis-1.4.jar
axis-jaxrpc-1.4.jar
commons-discovery-0.5.jar
commons-logging-1.1.1.jar
hamcrest-core-1.3.jar
joda-time-1.6.2.jar
opensaml-2.5.1-1.jar
openws-1.4.2-1.jar
serializer-2.7.1.jar
slf4j-api-1.7.9.jar
wsdl4j-1.6.2.jar
wss4j-1.6.18.jar
xades4j-1.3.2.jar
xalan-2.7.0.jar
xercesImpl-2.9.1.jar
xml-apis-1.3.04.jar
xmlsec-1.5.0.jar
xmltooling-1.3.2-1.jar

, установленный JCP со снятыми ограничениями и ключевой контейнер с сертификатом, выпущенным в аккредитованном УЦ (для общей подписи в Security Header).
Пожалуй, лучше всего было, если бы кто-нибудь попробовал проверить, используя правильный (существующий) sender (recipient) в документе (и другие правильно заполненные поля).

P.S.
Архив

Отредактировано пользователем 15 июня 2015 г. 15:59:47(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Corzina оставлено 16.06.2015(UTC)
Offline servelat  
#33 Оставлено : 15 июня 2015 г. 15:31:26(UTC)
servelat

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

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

А как получить архив?
Offline ARnikev  
#34 Оставлено : 16 июня 2015 г. 14:45:40(UTC)
ARnikev

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 2 раз в 1 постах
Господа, извиняюсь за немного оффтоп. Как у вас получилось вменяемые java классы получить из wsdl и xsd схем нового формата? У меня из текущего wsdl получается довольно мало java классов, как минимум отсутствуют основные GISGMPTransferMsg, ChargeType. Использую Apache CFX wsdl2java. Из wsdl старого формата все корректно формируется.
Offline Corzina  
#35 Оставлено : 16 июня 2015 г. 20:02:12(UTC)
Corzina

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Afev: Я протестировал Ваше решение: Сделал из всех вложенных файлов в архиве библиотеку. Вычистил все версии библиотек в проекте (были подключены более новые, чем использует xades4j). Попробовал на тестовом сервисе отправить 10 реальных платежей с реальными данными, проверка ЭЦП прошла успешно, в принципе, завтра могу завтра пару платежей на боевом сервисе отправить(т.к. сегодня уже боевая машина выключена).

Если кому необходимо пример подписи FinalPayment на основании кода из примера afev:
Код:

public static SOAPMessage Set_sign_Element_XAdES_ver_Crypto (SOAPMessage soapMessage, String tag,  C_JCP in_jsp) throws Exception {
        
            com.sun.org.apache.xml.internal.security.Init.init();
            JCPXMLDSigInit.init();
            // Инициализация JCP XML провайдера.
            if(!JCPXMLDSigInit.isInitialized()) {
                JCPXMLDSigInit.init();
            }
            
            // Инициализация ключевого контейнера.
            KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
            keyStore.load(null, null);
            
            // Получение ключа и сертификата.
            PrivateKey privateKey = in_jsp.Get_PrivateKey();
            X509Certificate cert = in_jsp.Get_sert();
            
            Document doc = soapMessage.getSOAPPart().getEnvelope().getOwnerDocument();
            //Element Signature = doc.createElement("Signature");
            //Signature.setAttribute("xmlns", "http://www.w3.org/2000/09/xmldsig#");
            
            //Элемент, в который будем добавлять подпись
            
            NodeList childNodes = soapMessage.getSOAPPart().getEnvelope().getBody().getFirstChild().getChildNodes();
            org.w3c.dom.Node node_fp = childNodes.item(1).getFirstChild().getFirstChild().getFirstChild().getFirstChild().getFirstChild().getFirstChild();
            
            Element signedNode = (Element) node_fp;
            
            NamedNodeMap attributes = node_fp.getAttributes();
            org.w3c.dom.Node Node_ID = attributes.getNamedItem("Id");
            String signingId = Node_ID.getTextContent();
            
            final Node nodeToSign = node_fp;
            final String referenceURI = "#" + signingId;


            // 3. Алгоритмы.

            final KeyingDataProvider keyingProvider = new DirectKeyingDataProvider(cert, privateKey);
            final XadesSigningProfile sigProf = new XadesTSigningProfile(keyingProvider)

                    // time-stamp provider. Дополнительно задается список соответствий между
                    // алгоритмом хеширования и адресом TSP службы, чтобы разнообразить и
                    // расширить пример.
                    .withTimeStampTokenProvider(new GostTimeStampTokenProvider(
                        GostXAdESUtility.MAP_DIGEST_OID_2_TSA_URL, XAdESConfig.CONFIG_2001_S.getDefaultProvider()))

                    // digest provider
                    .withDigestEngineProvider(new DefaultMessageDigestProvider() { // digest

                        @Override
                        public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {

                            final String digestAlgOid = GostXAdESUtility.digestUri2Digest(digestAlgorithmURI);

                            try {
                                return MessageDigest.getInstance(digestAlgOid);
                            } catch (NoSuchAlgorithmException e) {
                                throw new UnsupportedAlgorithmException(e.getMessage(), digestAlgorithmURI, e);
                            }
                        }

                    })

                    .withAlgorithmsProviderEx(new DefaultAlgorithmsProviderEx() { // algorithms

                        private String digestUrn = null;

                        @Override
                        public Algorithm getSignatureAlgorithm(String keyAlgorithmName)
                            throws UnsupportedAlgorithmException {

                            digestUrn = GostXAdESUtility.key2DigestUrn(keyAlgorithmName);
                            final String signatureUrn = GostXAdESUtility.key2SignatureUrn(keyAlgorithmName);

                            return new GenericAlgorithm(signatureUrn);
                        }

                        @Override
                        public String getDigestAlgorithmForReferenceProperties() {
                            return digestUrn;
                        }

                        @Override
                        public String getDigestAlgorithmForDataObjsReferences() {
                            return digestUrn;
                        }

                        @Override
                        public String getDigestAlgorithmForTimeStampProperties() {
                            return digestUrn;
                        }

                        @Override
                        public Algorithm getCanonicalizationAlgorithmForSignature()
                        {
                            return new ExclusiveCanonicalXMLWithoutComments();
                        }

                        @Override
                        public Algorithm getCanonicalizationAlgorithmForTimeStampProperties()
                        {
                            return new ExclusiveCanonicalXMLWithoutComments();
                        }
                    });

            // 4. Подпись.

            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);
            System.out.println("XAdES-T signature completed.");

            soapMessage.saveChanges();
            return soapMessage;
    }


Вызов
Код:

   /**
     * Устанавливаем подпись на документе, предварительно создем WSSSecurity
     * @param in_path
     * @param file_name
     * @param in_jsp 
     */
    static public void Set_Sign_Soap_Message(String in_path, String file_name, C_JCP in_jsp, boolean set_sign_final_payment) {
        try {

            FileInputStream is = new FileInputStream(in_path+file_name);
            MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage mf = messageFactory.createMessage();
            mf.getSOAPPart().setContent(new StreamSource(is));
            
            // Ставим подпись на элементе
            if (set_sign_final_payment){
                    //mf = Set_sign_Element(mf, "FinalPayment",  in_jsp);
                    mf = Set_sign_Element_XAdES_ver_Crypto(mf, "FinalPayment",  in_jsp);
            }
            
            // Prepare secured header
            mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
            mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
            mf.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Id","body");
            
            WSSecHeader header = new WSSecHeader();
            header.setActor("http://smev.gosuslugi.ru/actors/smev");
            header.setMustUnderstand(false);
            
            Element sec = header.insertSecurityHeader(mf.getSOAPPart());
            Document doc = mf.getSOAPPart().getEnvelope().getOwnerDocument();
            
            Element token =(Element) sec.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:BinarySecurityToken")); 
            token.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
            token.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
            token.setAttribute("wsu:Id", "CertId");
            
            
            
            com.sun.org.apache.xml.internal.security.Init.init();
                    
                    // Инициализация JCP XML провайдера.
                    if(!JCPXMLDSigInit.isInitialized()) {
                        JCPXMLDSigInit.init();
                    }

            // Инициализация ключевого контейнера.
            KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
            keyStore.load(null, null);

            // Получение ключа и сертификата.
            PrivateKey privateKey = in_jsp.Get_PrivateKey();
            X509Certificate cert = in_jsp.Get_sert();
            // Prepare signature provider
            Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
            //setSAMdata(null, ru.utility.SpecUtility.DEFAULT_PASSWORD, ru.utility.SpecUtility.DEFAULT_ALIAS, ru.utility.SpecUtility.DEFAULT_PASSWORD);
            final Transforms transforms = new Transforms(doc);
            XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);


                    
            List<Transform> transformList = new ArrayList<Transform>();
            Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
            transformList.add(transformC14N);
                    
                    
            //Reference ref = fac.newReference("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null));
                    Reference ref = fac.newReference("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null),
               //     null,null,null );
                     transformList, null,null );
                    
            // Make link to signing element
            SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, 
                                                     (C14NMethodParameterSpec) null),
                                                     
            fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411", null),
                                                        Collections.singletonList(ref));
            
            //transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);

                    
            // Prepare key information to verify signature in future on other side
            KeyInfoFactory kif = fac.getKeyInfoFactory();
            X509Data x509d = kif.newX509Data(Collections.singletonList(cert));
            KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
            
            // Create signature and sign by private key
            javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
            DOMSignContext signContext = new DOMSignContext(privateKey, token);
            
            sig.sign(signContext);
            

            // Insert signature node in document
            Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
            Node keyE = (Node) XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
            token.appendChild(doc.createTextNode(XPathAPI.selectSingleNode(keyE, "//ds:X509Certificate", keyE).getFirstChild().getNodeValue()));
            keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
            NodeList chl = keyE.getChildNodes();
            
            for (int i = 0; i < chl.getLength(); i++) {
                keyE.removeChild(chl.item(i));
            }
            
            Node str = (Node) 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", "#CertId");
            header.getSecurityHeader().appendChild(sigE);
           
            mf.saveChanges();
            FileOutputStream f_out = new FileOutputStream(in_path+file_name);
            mf.writeTo(f_out);
            f_out.close();
            
            
        } catch (Exception ex) {
            Logger.getLogger(frm_main.class.getName()).log(Level.SEVERE, null, ex);
        }

    } 

Отредактировано пользователем 16 июня 2015 г. 20:03:29(UTC)  | Причина: Не указана

Offline Corzina  
#36 Оставлено : 16 июня 2015 г. 20:08:50(UTC)
Corzina

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: ARnikev Перейти к цитате
Господа, извиняюсь за немного оффтоп. Как у вас получилось вменяемые java классы получить из wsdl и xsd схем нового формата? У меня из текущего wsdl получается довольно мало java классов, как минимум отсутствуют основные GISGMPTransferMsg, ChargeType. Использую Apache CFX wsdl2java. Из wsdl старого формата все корректно формируется.


автоматом не получится, т.к. схемы сделаны по другому (я 3 дня убил на получение полных классов). Сделал только схемы из Message.xsd, а до него руками собираю/разбираю сообщение.

Offline ARnikev  
#37 Оставлено : 17 июня 2015 г. 10:38:06(UTC)
ARnikev

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 2 раз в 1 постах
Цитата:
Сделал только схемы из Message.xsd, а до него руками собираю/разбираю сообщение.

Можно подробнее пожалуйста, вчера тоже на это дело целый день убил, никак не могу понять почему не получается нормальной иерархии классов. Как вы формируете сообщение для отправки теперь? Не из java классов объект GISGMPTransferMsg, а потом его маршалите в xml? Руками xml формируете сразу чтоле?
Offline eagames-ru  
#38 Оставлено : 17 июня 2015 г. 11:25:07(UTC)
eagames-ru

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

Группы: Участники
Зарегистрирован: 30.11.2012(UTC)
Сообщений: 21
Откуда: Уфа

Поблагодарили: 1 раз в 1 постах
Автор: ARnikev Перейти к цитате
Цитата:
Сделал только схемы из Message.xsd, а до него руками собираю/разбираю сообщение.

Можно подробнее пожалуйста, вчера тоже на это дело целый день убил, никак не могу понять почему не получается нормальной иерархии классов. Как вы формируете сообщение для отправки теперь? Не из java классов объект GISGMPTransferMsg, а потом его маршалите в xml? Руками xml формируете сразу чтоле?



Открываете доку по ГИС ГМП 1.16.1 там внизу будет архив с XSD схемами - распакуйте в папку проекта.

далее в netbeans делаем JAXB привязку, выбираем файл Message.xsd и все. появляются новые классы, используйте их.
Offline ARnikev  
#39 Оставлено : 17 июня 2015 г. 13:00:15(UTC)
ARnikev

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 2 раз в 1 постах
Автор: eagames-ru Перейти к цитате
Автор: ARnikev Перейти к цитате
Цитата:
Сделал только схемы из Message.xsd, а до него руками собираю/разбираю сообщение.

Можно подробнее пожалуйста, вчера тоже на это дело целый день убил, никак не могу понять почему не получается нормальной иерархии классов. Как вы формируете сообщение для отправки теперь? Не из java классов объект GISGMPTransferMsg, а потом его маршалите в xml? Руками xml формируете сразу чтоле?



Открываете доку по ГИС ГМП 1.16.1 там внизу будет архив с XSD схемами - распакуйте в папку проекта.

далее в netbeans делаем JAXB привязку, выбираем файл Message.xsd и все. появляются новые классы, используйте их.


Это я все понимаю. Вот у меня сгенерились классы из Message.xsd. Я смотрю структуру сообщения для инмпорта начисления допустим. Мне нужно сформировать елемент MessageData допустим, такого класса у меня из xsd схемы этой не сформировалось, как и AppData. Ближайшее по иерархии, что сформировалось, это RequestMessageType. То есть мне все елементы xml сообщения, что идут до него формировать руками чтоли, а остальное через java объекты и потом маршалить этот кусок в xml и подпихивать в основное xml сообщение?

Не могли бы вы кусок кода по формированию вашего сообщения выложить? Раньше конечно все на много проще было.Brick wall

Отредактировано пользователем 17 июня 2015 г. 13:01:05(UTC)  | Причина: Не указана

Offline Corzina  
#40 Оставлено : 17 июня 2015 г. 13:24:21(UTC)
Corzina

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Проверил подпись на боевом сервере ГИСГМП - все платежи за сегодня прошли проверку ЭЦП и успешно были импортированы.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
16 Страницы«<23456>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.