Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

Туннель у вас построился, судя по всему.


А в https://127.0.0.1:8754/ext-bus-device-m … /$metadata "https" откуда берется?
Можно его как-то заменить на http?

А то очень похоже на то, что у вас получился туннель внутри туннеля.
Ваша служба начала по https подключаться к 127.0.0.1:8754, а слушающий там stunnel установил TLS с удаленным сервером и отправил на удаленный сервер не HTTP-пакет, а условно говоря, HTTPS-пакет.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

А в https://127.0.0.1:8754/ext-bus-device-m … /$metadata "https" откуда берется?
Можно его как-то заменить на http?

Действительно. Заменил на http и криптотунель заработал.
Для связи с сервисами ГИСа осталось только научиться подписывать SOAP - сообщение. Что вроде получилось, но ГИС выдает ошибку проверки подписи на валидность.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

А пришлите пример подписанного SOAP. Пусть даже невалидный. Мы вам может чего-нибудь посоветуем.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

Исходное сообщение:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Header>
        <ISRequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/">
            <Date>2016-05-16T13:52:16.1934165+03:00</Date>
            <MessageGUID>471de97a-5dbf-48b8-909e-7ed152574b4f</MessageGUID>
        </ISRequestHeader>
    </soap:Header>
    <soap:Body>
        <exportDataProviderRequest xmlns="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/organizations-registry-common/" Id="signed-data-container" />
    </soap:Body>
</soap:Envelope>

Подписанное сообщение:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Header>
        <ISRequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/">
            <Date>2016-05-16T13:52:16.1934165+03:00</Date>
            <MessageGUID>471de97a-5dbf-48b8-909e-7ed152574b4f</MessageGUID>
        </ISRequestHeader>
    </soap:Header>
    <soap:Body>
        <exportDataProviderRequest xmlns="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/organizations-registry-common/" Id="signed-data-container">
            <ds:Signature Id="xmldsig-bfbf25de-6867-4939-88af-ff747c96ac35" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" />
                    <ds:Reference Id="xmldsig-bfbf25de-6867-4939-88af-ff747c96ac35-ref0" URI="#signed-data-container">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                        <ds:DigestValue>dyIdGLF4Hdw//bV1tiKJvB7OIuy8U3dLy15NWi847mM=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#xmldsig-bfbf25de-6867-4939-88af-ff747c96ac35-signedprops" Type="http://uri.etsi.org/01903#SignedProperties">
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                        <ds:DigestValue>FnBcQy4BVm56KytpotWML8FySEGAa7YsQgt4WkIJir0=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue Id="xmldsig-bfbf25de-6867-4939-88af-ff747c96ac35-sigvalue">lqZl3A5LvyNIAfSpyNRimnp3/pK+gKrolIbtMbbbJtlZf59wrN+oza3ulJzMl4bM2okbnCk4DLyRhGH819eNiw==</ds:SignatureValue>
                <ds:KeyInfo>
                    <ds:X509Data>
                        <ds:X509Certificate>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</ds:X509Certificate>
                    </ds:X509Data>
                </ds:KeyInfo>
                <ds:Object>
                    <xades:QualifyingProperties Target="#xmldsig-bfbf25de-6867-4939-88af-ff747c96ac35" xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
                        <xades:SignedProperties Id="xmldsig-bfbf25de-6867-4939-88af-ff747c96ac35-signedprops">
                            <xades:SignedSignatureProperties>
                                <xades:SigningTime>2016-05-16T13:52:48.071+03:00</xades:SigningTime>
                                <xades:SigningCertificate>
                                    <xades:Cert>
                                        <xades:CertDigest>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                                            <ds:DigestValue>Qki0clCAlEW1CJE6UyJ/9+YkofKuz6V8ST9JwiCk1AY=</ds:DigestValue>
                                        </xades:CertDigest>
                                        <xades:IssuerSerial>
                                            <ds:X509IssuerName>L=г. Ростов-на-Дону,ST=61 Ростовская область,C=RU,1.2.643.100.1=1126195003824,O=КП РО \"Информационная база ЖКХ\",1.2.840.113549.1.9.1=analytic@ibzkh.ru,1.2.643.3.131.1.1=006167106894,CN=Электронная система мониторинга технического состояния многоквар</ds:X509IssuerName>
                                            <ds:X509SerialNumber>315562039713409055859139</ds:X509SerialNumber>
                                        </xades:IssuerSerial>
                                    </xades:Cert>
                                </xades:SigningCertificate>
                            </xades:SignedSignatureProperties>
                        </xades:SignedProperties>
                    </xades:QualifyingProperties>
                </ds:Object>
            </ds:Signature>
        </exportDataProviderRequest>
    </soap:Body>
</soap:Envelope>

Ответ:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:ns3="http://www.w3.org/2000/09/xmldsig#" xmlns:ns4="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/" xmlns:ns5="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/organizations-registry-common/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <ns4:ResultHeader>
            <ns4:Date>2016-05-16T13:57:28.174+03:00</ns4:Date>
            <ns4:MessageGUID>471de97a-5dbf-48b8-909e-7ed152574b4f</ns4:MessageGUID>
        </ns4:ResultHeader>
    </soap:Header>
    <soap:Body>
        <ns5:exportDataProviderResult Id="signed-data-container">
            <ds:Signature Id="xmldsig-e555c079-6e61-44b9-aaf2-d589b52a6328" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
                    <ds:Reference URI="#signed-data-container">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                        <ds:DigestValue>NC9dxS1cMg4ZcQlzIebWiYif54LWvMP3w5qVXOfhpfA=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-e555c079-6e61-44b9-aaf2-d589b52a6328-signedprops">
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                        <ds:DigestValue>aLqsiAqZOCwmehdlsJBU5QKynfcr9sI2pNRJRwPNaEM=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>ORlmMQra33E9zQfPsLI0IJBSjbfPROkUpAc1AonWLzAgzYdT8O+YQHSXljboi0lQmSMDJ6ZqJAK0vL9iWriYtA==</ds:SignatureValue>
                <ds:KeyInfo>
                    <ds:X509Data>
                        <ds:X509Certificate>MIIDJjCCAtWgAwIBAgITEgAPldx4Rzy1qK2yugAAAA+V3DAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cxFzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDIwHhcNMTYwNDA4MTUwMjM0WhcNMTYwNzA4MTUxMjM0WjA1MRYwFAYDVQQDDA1TSUdOXzIwMTYwNDA4MQ4wDAYDVQQKDAVMQU5JVDELMAkGA1UEBhMCUlUwYzAcBgYqhQMCAhMwEgYHKoUDAgIkAAYHKoUDAgIeAQNDAARALZ3Ofpw2FChFbnSMTGtyJiXWmC08mYp0uM/zCkY0qoegHEJnjM1EDpAzKxqwIG5ZBv0WIUOMxu58jwGibOZoUqOCAXAwggFsMA4GA1UdDwEB/wQEAwIE8DATBgNVHSUEDDAKBggrBgEFBQcDAjAdBgNVHQ4EFgQUkHi7x8gC+22lDM2WRQlLyObsZrAwHwYDVR0jBBgwFoAUFTF8sI0a3mbXFZxJUpcXJLkBeoMwWQYDVR0fBFIwUDBOoEygSoZIaHR0cDovL3Rlc3RjYS5jcnlwdG9wcm8ucnUvQ2VydEVucm9sbC9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIuY3JsMIGpBggrBgEFBQcBAQSBnDCBmTBhBggrBgEFBQcwAoZVaHR0cDovL3Rlc3RjYS5jcnlwdG9wcm8ucnUvQ2VydEVucm9sbC90ZXN0LWNhLTIwMTRfQ1JZUFRPLVBSTyUyMFRlc3QlMjBDZW50ZXIlMjAyLmNydDA0BggrBgEFBQcwAYYoaHR0cDovL3Rlc3RjYS5jcnlwdG9wcm8ucnUvb2NzcC9vY3NwLnNyZjAIBgYqhQMCAgMDQQCWCaY+GtlxHONPpBEDlTp3/ZWfDSjDrsb2GeAR4EF7ENKquggevHcgbPxd8wYTFl2N59L3fhEWk25l8nP1O3M7</ds:X509Certificate>
                    </ds:X509Data>
                </ds:KeyInfo>
                <ds:Object>
                    <xades:QualifyingProperties Target="#xmldsig-e555c079-6e61-44b9-aaf2-d589b52a6328" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
                        <xades:SignedProperties Id="xmldsig-e555c079-6e61-44b9-aaf2-d589b52a6328-signedprops">
                            <xades:SignedSignatureProperties>
                                <xades:SigningTime>2016-05-16T13:53:03.916+03:00</xades:SigningTime>
                                <xades:SigningCertificate>
                                    <xades:Cert>
                                        <xades:CertDigest>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                                            <ds:DigestValue>xVlnHO/UsCPMapaQRroPok1o3cmrUyrJ6SBc6sEi78k=</ds:DigestValue>
                                        </xades: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=support@cryptopro.ru</ds:X509IssuerName>
                                            <ds:X509SerialNumber>401418717008771244595411458054990910282765788</ds:X509SerialNumber>
                                        </xades:IssuerSerial>
                                    </xades:Cert>
                                </xades:SigningCertificate>
                            </xades:SignedSignatureProperties>
                        </xades:SignedProperties>
                    </xades:QualifyingProperties>
                </ds:Object>
            </ds:Signature>
            <ns4:ErrorMessage>
                <ns4:ErrorCode>AUT011005</ns4:ErrorCode>
                <ns4:Description>Ошибка формата подписи запроса</ns4:Description>
                <ns4:StackTrace>ru.lanit.hcs.integration.common.exception.OperationProcessorException: ЭП не прошла проверку: Cannot find any certificates referenced by xades:SigningCertificate
    at ru.lanit.hcs.integration.common.spring.service.impl.ValidationServiceImpl.validateSignatureItself(ValidationServiceImpl.java:162)
    at ru.lanit.hcs.integration.common.spring.service.impl.ValidationServiceImpl.validateSignature(ValidationServiceImpl.java:112)
    at ru.lanit.hcs.integration.common.spring.mdp.OperationProcessorInvokerMDP.process(OperationProcessorInvokerMDP.java:279)
    at ru.lanit.hcs.integration.common.spring.mdp.OperationProcessorInvokerMDP.internalOnMessage(OperationProcessorInvokerMDP.java:173)
    at ru.lanit.hcs.integration.common.spring.mdp.OperationProcessorInvokerMDP.onMessage(OperationProcessorInvokerMDP.java:85)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:685)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:623)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:591)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
    at java.lang.Thread.run(Thread.java:745)
Caused by: ru.lanit.security.crypto.CryptoException: ЭП не прошла проверку: Cannot find any certificates referenced by xades:SigningCertificate
    at ru.lanit.security.crypto.verifier.VerifierBean.verifyEnveloped(VerifierBean.java:277)
    at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptorFactory.java:72)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:58)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:58)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInNoTx(CMTTxInterceptor.java:259)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.notSupported(CMTTxInterceptor.java:323)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:236)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.remote.EJBRemoteTransactionPropagatingInterceptor.processInvocation(EJBRemoteTransactionPropagatingInterceptor.java:79)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:55)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165)
    at org.jboss.as.ejb3.remote.protocol.versionone.MethodInvocationMessageHandler.invokeMethod(MethodInvocationMessageHandler.java:329)
    at org.jboss.as.ejb3.remote.protocol.versionone.MethodInvocationMessageHandler.access$100(MethodInvocationMessageHandler.java:70)
    at org.jboss.as.ejb3.remote.protocol.versionone.MethodInvocationMessageHandler$1.run(MethodInvocationMessageHandler.java:203)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:122)
    at ...asynchronous invocation...(Unknown Source)
    at org.jboss.ejb.client.remoting.InvocationExceptionResponseHandler$MethodInvocationExceptionResultProducer.getResult(InvocationExceptionResponseHandler.java:99)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:276)
    at ru.lanit.hcs.integration.security.client.LogInterceptor.handleInvocationResult(LogInterceptor.java:74)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:290)
    at ru.lanit.hcs.integration.security.client.EjbSecurityClientInterceptor.handleInvocationResult(EjbSecurityClientInterceptor.java:57)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:290)
    at org.jboss.ejb.client.EJBObjectInterceptor.handleInvocationResult(EJBObjectInterceptor.java:64)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:290)
    at org.jboss.ejb.client.EJBHomeInterceptor.handleInvocationResult(EJBHomeInterceptor.java:88)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:290)
    at org.jboss.ejb.client.TransactionInterceptor.handleInvocationResult(TransactionInterceptor.java:46)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:290)
    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocationResult(ReceiverInterceptor.java:129)
    at org.jboss.ejb.client.EJBClientInvocationContext.getResult(EJBClientInvocationContext.java:265)
    at org.jboss.ejb.client.EJBClientInvocationContext.awaitResponse(EJBClientInvocationContext.java:453)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:204)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
    at com.sun.proxy.$Proxy802.verifyEnveloped(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor935.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.remoting.rmi.RmiClientInterceptorUtils.invokeRemoteMethod(RmiClientInterceptorUtils.java:71)
    at org.springframework.ejb.access.SimpleRemoteSlsbInvokerInterceptor.doInvoke(SimpleRemoteSlsbInvokerInterceptor.java:98)
    at org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor.invokeInContext(AbstractRemoteSlsbInvokerInterceptor.java:140)
    at org.springframework.ejb.access.AbstractSlsbInvokerInterceptor.invoke(AbstractSlsbInvokerInterceptor.java:189)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy806.verifyEnveloped(Unknown Source)
    at ru.lanit.hcs.integration.common.spring.service.impl.ValidationServiceImpl.validateSignatureItself(ValidationServiceImpl.java:140)
    ... 13 more
                </ns4:StackTrace>
            </ns4:ErrorMessage>
        </ns5:exportDataProviderResult>
    </soap:Body>
</soap:Envelope>

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

И еще вопрос. С помощью какого софта вы формируете подписанное сообщение?

(2016-05-16 16:50:29 отредактировано miron_valentin)

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

Использую библиотеку https://github.com/springjazzy/Xades
Только ее немного подправил. Отправил исправленную версию на почту.

Вызываю так:

public byte[] SignSoap(byte[] soap, EventLog eventLog, string tokenPassword)
        {
            return Encoding.UTF8.GetBytes(GisSignatureHelper.GetSignedRequestXades(Encoding.UTF8.GetString(soap), GetSertificate(tokenPassword, eventLog), GetRawSign, tokenPassword, eventLog));
        }

Доп.методы:

private byte[] GetRawSign(byte[] file, EventLog eventLog1, string tokenPassword)
        {
            //eventLog1.WriteEntry("GetSign инициализация токена");
            //var core = CryptoCore.getInstance(@"D:\SignService");
            var core = CryptoCore.getInstance();
            eventLog1.WriteEntry("GetSign получение списка устройств");
            var devs = core.enumerateDevices();

            eventLog1.WriteEntry("GetSign получение нашего устройства из списка");
            var dev = devs[0];

            eventLog1.WriteEntry("GetSign логирование на устройстве");
            core.login(dev, tokenPassword);

            eventLog1.WriteEntry("GetSign получение списка сертификатов");
            var certs = core.enumerateCertificates(dev, 1);

            eventLog1.WriteEntry("GetSign получение нашего сертификата");
            var cert = certs[0];

            //var keys = core.enumerateKeys(dev, "");
            //var key = keys[1];
            var key = core.getKeyByCertificate(dev, cert);

            string data = "";
            for (int i = 0; i < file.Length; i += 1)
            {
                // Convert the number expressed in base-16 to an integer.
                //int value = BitConverter.ToInt32(file, i);
                // Get the character corresponding to the integral value.
                string hexOutput = String.Format("{0:X}", file[i]);
                if (hexOutput.Length == 1)
                    hexOutput = "0" + hexOutput;
                data += ":" + hexOutput;
            }
            data = data.Trim(':');
            data = data.ToLower();
            //data = Encoding.UTF8.GetString(file);

            eventLog1.WriteEntry(data);
            OptionsMap options = new OptionsMap
            {
                {"useHardwareHash", false},
                {"computeHash", false},
                {"invisible", false}
            };

            eventLog1.WriteEntry("GetSign получаю подпись");
            string sign = core.rawSign(
               dev,
               key,
               data,
               options);
            core.logout(dev);
            eventLog1.WriteEntry(sign);

            List<byte> result = new List<byte>();
            string[] hexValuesSplit = sign.Split(':');
            foreach (String hex in hexValuesSplit)
            {
                // Convert the number expressed in base-16 to an integer.
                byte value = Convert.ToByte(hex, 16);
                // Get the character corresponding to the integral value.
                result.Add(value);
            }

            //result.Reverse();

            return result.ToArray();
            //return Encoding.UTF8.GetBytes(sign);
        }

        private X509Certificate2 GetSertificate(string tokenPassword, EventLog eventLog)
        {
            
            //var core = CryptoCore.getInstance(@"D:\SignService");
            eventLog.WriteEntry("Получение сертификата");
            var core = CryptoCore.getInstance();            
            var devs = core.enumerateDevices();
            var dev = devs[0];
            core.login(dev, tokenPassword);
            var certs = core.enumerateCertificates(dev, 1);           
            var cert = certs[0];
            var x = core.getCertificate(dev, cert);
            var certificate = new X509Certificate2(Encoding.UTF8.GetBytes(core.getCertificate(dev, cert)));
            core.logout(dev);
            eventLog.WriteEntry("Получили сертификат");
            return certificate;
        }

Забыл упомянуть. Добавляю атрибут к исходному сообщению перед подписыванием:

XmlNamespaceManager namespaces = new XmlNamespaceManager(xmlDocument.NameTable);
            namespaces.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
            var childNode = xmlDocument.SelectNodes("//soap:Body", namespaces)[0].FirstChild;
            XmlAttribute attr = xmlDocument.CreateAttribute("Id");
            attr.InnerText = "signed-data-container";
            childNode.Attributes.Append(attr);

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

OptionsMap options = new OptionsMap
            {
                {"useHardwareHash", false},
                {"computeHash", false},
                {"invisible", false}
            };

computeHash = false подразумевает, что хеш по ГОСТ Р 34.11-94 предварительно вычислен и подается в функцию rawSign на подпись.

А вы его как-то вычисляете?

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

Да, хэш уже вычисленный подается на вход токену.
Для вычисления использую класс в в библиотеке КриптоПро Gost3411CryptoServiceProvider.
Добавляю этот алгоритм таким способом:

CryptoConfig.AddAlgorithm(typeof(Gost3411CryptoServiceProvider), "http://www.w3.org/2001/04/xmldsig-more#gostr3411", "GOST3411");

В классе GisSignatureHelper в методе GetSignedRequestXades.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

У вас вот здесь:

 

<xades:SigningCertificate>
                                    <xades:Cert>
                                        <xades:CertDigest>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                                            <ds:DigestValue>Qki0clCAlEW1CJE6UyJ/9+YkofKuz6V8ST9JwiCk1AY=</ds:DigestValue>
                                        </xades:CertDigest>
                                        <xades:IssuerSerial>
                                            <ds:X509IssuerName>L=г. Ростов-на-Дону,ST=61 Ростовская область,C=RU,1.2.643.100.1=1126195003824,O=КП РО \"Информационная база ЖКХ\",1.2.840.113549.1.9.1=analytic@ibzkh.ru,1.2.643.3.131.1.1=006167106894,CN=Электронная система мониторинга технического состояния многоквар</ds:X509IssuerName>
                                            <ds:X509SerialNumber>315562039713409055859139</ds:X509SerialNumber>
                                        </xades:IssuerSerial>
                                    </xades:Cert>
                                </xades:SigningCertificate>

В качестве IssuerName прописано SubjectName.

То есть не DN издателя сертификата, а DN владельца. И серийник прописан вашего сертификата.

Вроде туда должна информация о сертификате CA прописываться.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

На счет этого не уверен. Изначально было IssuerName. Исправил, потому что возникала такая ошибка:

ЭП не прошла проверку: Certificate is not trusted: L=г. Ростов-на-Дону,ST=61 Ростовская область,C=RU,1.2.643.100.1=1126195003824,O=КП РО \"Информационная база ЖКХ\",E=analytic@ibzkh.ru,1.2.643.3.131.1.1=006167106894,CN=Электронная система мониторинга технического состояния многоквар; Serial number=315562039713409055859139

После исправления такая:

ЭП не прошла проверку: Cannot find any certificates referenced by xades:SigningCertificate

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

Вроде туда должна информация о сертификате CA прописываться.

Это какой сертификат? Который они предоставляют?

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

miron_valentin пишет:

Вроде туда должна информация о сертификате CA прописываться.

Это какой сертификат? Который они предоставляют?

Это тот, на котором ваш выписан. Сертификат УЦ.

Вот это не смотрели?
https://www.cryptopro.ru/forum2/default … amp;t=9990

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

ЭП не прошла проверку: Certificate is not trusted

Похоже, что подпись-то проверилась, а цепочка не построилась.
А вы уверены, что ГИС ЖКХ доверяет корневому ГАУ РО «РЦИС»?

TLS в этом случае не показатель.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

Вот это не смотрели?
https://www.cryptopro.ru/forum2/default … amp;t=9990

Нет... Верну обратно на IssuerName.

Похоже, что подпись-то проверилась, а цепочка не построилась.

Что значит "Цепочка не построилась"?

А вы уверены, что ГИС ЖКХ доверяет корневому ГАУ РО «РЦИС»

Нет. Напишу в техподдержку ГИСа на счет корневого сертификата.

Re: Защита RDP по ГОСТам с помощью sTunnel и Рутокен ЭЦП

miron_valentin пишет:

Что значит "Цепочка не построилась"?

Проверка подписи делается, если упрощенно говорить, в два этапа: проверка самой подписи с помощью открытого ключа из сертификата и проверка подписи под сертификатом с помощью открытого ключа из доверенного сертификата CA.

Второй этап - построение цепочки.