Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
1

Как реализовать ассиметричный алгоритм в WSHttpBinding

06.12.2012, 09:40. Просмотров 1762. Ответов 6

Создаю клиента для web-сервиса. Сервис не мой, о его реализации ничего не знаю, кроме wsdl. Ещё есть требование использовать ws-security.

Делаю так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
binding.Security.Message.AlgorithmSuite = CryptoPro.Sharpei.ServiceModel.GostAlgorithmSuite.BasicGost;
 
binding.Security.Message.NegotiateServiceCredential = false;
binding.Security.Message.EstablishSecurityContext = false;
 
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
binding.Security.Transport.Realm = "";
 
EndpointAddress address = CreateEndPointAddress(ConfigurationManager.AppSettings["myServiceURL"], ConfigurationManager.AppSettings["myDnsIdentity"]);
MyClient client = new MyClient(binding, address);
 
string clientCertSerial = ConfigurationManager.AppSettings["clientCertSerial"];
StoreName clientCertStoreName = getStoreName(ConfigurationManager.AppSettings["clientCertStoreName"]);
StoreLocation clientCertStoreLocation = getStoreLocation(ConfigurationManager.AppSettings["clientCertStoreLocation"]);
 
string serviceCertSerial = ConfigurationManager.AppSettings["myServiceCertSerial"];
StoreName serviceCertStoreName = getStoreName(ConfigurationManager.AppSettings["myServiceCertStoreName"]);
StoreLocation serviceCertStoreLocation = getStoreLocation(ConfigurationManager.AppSettings["myServiceCertStoreLocation"]);
 
// меняем clientCredentials, чтобы подхватить ГОСТ-сертификат
CryptoProClientCredentials clientCredentials = new CryptoProClientCredentials() { };
clientCredentials.ClientCertificate.Certificate = FindCertificate(clientCertSerial, clientCertStoreName, clientCertStoreLocation);
clientCredentials.ServiceCertificate.DefaultCertificate = FindCertificate(serviceCertSerial, serviceCertStoreName, serviceCertStoreLocation);
clientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
            
client.Endpoint.Behaviors.Remove<ClientCredentials>();
client.Endpoint.Behaviors.Add(clientCredentials);
client.Endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign;
 
client.Open();
// далее вызываю методы клиента...
Всё бы хорошо, но в создаваемом SOAP-конверте указывается <SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:hmac-gostr3411"/> (т.е. симметричный алгоритм). Но создатели сервиса потребовали использовать асиметтричный, т.е. urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411.

В CryptoPro.Sharpei.ServiceModel.GostAlgorithmSuite.BasicGost оба алгоритма указаны. Но в WSHttpBinding в bindingElements имеется только SymmetricSecurityBindingElement, и в итоге он выбирает только симметричный алгоритм.

Как заставить клиента работать с ассиметричной подписью?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 09:40
Ответы с готовыми решениями:

Как написать bruteforce? Всмысле как реализовать алгоритм (внутри)
Как сделать перебор чисел просто: просто прибавлять единичку) А как реализовать...

Как реализовать на C# алгоритм blockchain без использования сторонних библиотек?
Добрый день! Хочу реализовать алгоритм blockchain в своём приложении (не для...

Реализовать алгоритм сортировки вставками одномерного массива. Тип данных в массиве: ushort
Всем привет! Помогите кто чем может.

Посоветуйте как реализовать алгоритм
Алгоритм шифрования: bres = (bsrc ROL (i mod M)), где bsrc – i-ый байт...

Как реализовать алгоритм по поиску
&lt;?php get_header(); global $wp_query; ?&gt; &lt;div class=&quot;findme&quot;&gt; &lt;p...

6
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
13.12.2012, 17:27  [ТС] 2
Молчание было ему ответом...
Тогда поставим вопрос по-другому.
Нужно реализовать вызов сервиса SOAP с использованием подписи на основе ассиметричного алгоритма ГОСТ 34.11.
Должно получиться что-то вроде такого запроса:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="true">
<wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-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="CertId-B5509D699113C4748013552969427951">...</wsse:BinarySecurityToken>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-2"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod> 
<ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411"></ds:SignatureMethod> 
<ds:Reference URI="#id-3"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
<ds:DigestValue>Aoq9z7I6Bjz24yvpGK2XaHyyEKk=</ds:DigestValue> 
</ds:Reference> 
<ds:Reference URI="#id-4"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
<ds:DigestValue>0D+Y0RyvwoE3JptjWT7ti7nfBEg=</ds:DigestValue> 
</ds:Reference> 
<ds:Reference URI="#id-5"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
<ds:DigestValue>66vCWALw3YT6GBNfITth3HOIfnE=</ds:DigestValue> 
</ds:Reference> 
<ds:Reference URI="#Timestamp-1"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
<ds:DigestValue>bZ0dFje2fbzy2LwTw3iCAoYI5fk=</ds:DigestValue> 
</ds:Reference> 
<ds:Reference URI="#id-6"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
<ds:DigestValue>xEkQ/lfhNLN5bJuFL05WLKR4Pcg=</ds:DigestValue> 
</ds:Reference> 
<ds:Reference URI="#id-7"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
<ds:DigestValue>nV7YtPXKXYudUp6RKErOD7sA248=</ds:DigestValue> 
</ds:Reference> 
</ds:SignedInfo> 
<ds:SignatureValue> MoGkXL9mLbSAx0v38QZGFwvkywmZHgWt60vALtgRmqFweu7bDhXM5q9uaO5trj8JbxiIeSYM1q2T k/oWy3O0YQ== </ds:SignatureValue> 
<ds:KeyInfo Id="KeyId-B5509D699113C4748013552969428042"> 
<wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-B5509D699113C4748013552969428053">
<wsse:Reference URI="#CertId-B5509D699113C4748013552969427951" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"></wsse:Reference>
</wsse:SecurityTokenReference> 
</ds:KeyInfo> 
</ds:Signature>
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-1">
<wsu:Created>2012-12-12T07:22:22.770Z</wsu:Created>
<wsu:Expires>2012-12-12T07:27:22.770Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
<wsa:To xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="true" wsu:Id="id-3">https://service.url</wsa:To>
<wsa:Action xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-5">method</wsa:Action>
<wsa:MessageID xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-4">urn:uuid:92f8c578-45f2-4d68-9b4a-d0fb5fc49c19</wsa:MessageID>
<apui:UserCertificate xmlns:apui="urn:usercertificateheader" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-7"></apui:UserCertificate>
<apui:UserCertificate xmlns:apui="urn:usercertificateheader"></apui:UserCertificate>
</soapenv:Header>
<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-6">...</soapenv:Body>
</soapenv:Envelope>
Может, есть у кого пример кода клиента?
0
Alligieri
CEO
Эксперт С++
2253 / 1243 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
14.12.2012, 02:20 3
kmi, у вас автоматом при добавлении рефренса не генерит прокси-клиента? тут если идти стандартными средствами наверное стоит смотреть в сторону определения контракта сообщения, но предупреждаю что это очень геморный путь
0
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
14.12.2012, 11:42  [ТС] 4
Цитата Сообщение от Alligieri Посмотреть сообщение
kmi, у вас автоматом при добавлении рефренса не генерит прокси-клиента? тут если идти стандартными средствами наверное стоит смотреть в сторону определения контракта сообщения, но предупреждаю что это очень геморный путь
wsdl сервиса был передан его разработчиком с кучей xsd-файлов. Чтобы сгенерить клиента, использовал SvcUtil.exe. Клиент сгенерился. Далее пользую клиент и контракт, как описал в первом посте... Результат такой:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1" u:Id="_4">...</a:Action>
<a:MessageID u:Id="_5">urn:uuid:85129f74-fcb0-457c-96a8-8a66116d637c</a:MessageID>
<a:ReplyTo u:Id="_6"><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo>
<a:To s:mustUnderstand="1" u:Id="_7">http://service.url</a:To>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="uuid-b927ba6e-4f2d-42f7-864c-2651d40dda9c-2">
<u:Created>2012-12-14T07:24:29.653Z</u:Created>
<u:Expires>2012-12-14T07:29:29.653Z</u:Expires>
</u:Timestamp>
<e:EncryptedKey Id="uuid-b927ba6e-4f2d-42f7-864c-2651d40dda9c-1" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<o:SecurityTokenReference>
<o:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1">...</o:KeyIdentifier>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData><e:CipherValue>...</e:CipherValue></e:CipherData>
</e:EncryptedKey>
<c:DerivedKeyToken u:Id="_0" Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:dk-p-gostr3411" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
<o:SecurityTokenReference>
<o:Reference URI="#uuid-b927ba6e-4f2d-42f7-864c-2651d40dda9c-1"/>
</o:SecurityTokenReference>
<c:Nonce>...</c:Nonce>
</c:DerivedKeyToken>
<o:BinarySecurityToken u:Id="uuid-353cba01-775c-4ea9-8248-4952a60cceb0-1" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">...</o:BinarySecurityToken>
<Signature Id="_1" 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:hmac-gostr3411"/>
<Reference URI="#_3">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>Ovhey//kQD05wFoUfI9L6p3CZID/grV9yIOCcX6Bb0Q=</DigestValue>
</Reference>
<Reference URI="#_4">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>Oh/C31lJGHGa0sQLAR1BBkG8rdSg4DKtEVH0BR/9hec=</DigestValue>
</Reference>
<Reference URI="#_5">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>Go+K2MF+EcdBM1L5RMvsm5Bjr7Q2AeDlWKnxxjOQPwA=</DigestValue>
</Reference>
<Reference URI="#_6">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>qwgGJNZ2YtffhH2LSBuVuPvbRGc/BFCC0PlaKcw0xV4=</DigestValue>
</Reference>
<Reference URI="#_7">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>qqCxZQpwTplkUJuHdXiA8S9Wxkbcgz+A8f5eoayJMSk=</DigestValue>
</Reference>
<Reference URI="#uuid-b927ba6e-4f2d-42f7-864c-2651d40dda9c-2">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>T/V9wc0+kIAFWqDc7ohkcl4IU9WNVWMdRUBznU8xznQ=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>...</SignatureValue>
<KeyInfo>
<o:SecurityTokenReference><o:Reference URI="#_0"/></o:SecurityTokenReference>
</KeyInfo>
</Signature>
<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:hmac-gostr3411"/>
<Reference URI="#_1">
<Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>
<DigestValue>Y1SmBe78xC5M3KL3OcoWNrD+eQ5H56ssR4WOwQMvbNU=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>...</SignatureValue>
<KeyInfo>
<o:SecurityTokenReference><o:Reference URI="#uuid-353cba01-775c-4ea9-8248-4952a60cceb0-1"/></o:SecurityTokenReference>
</KeyInfo>
</Signature>
</o:Security>
</s:Header>
<s:Body u:Id="_3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</s:Body>
</s:Envelope>
Т.е. даже близко к требуемому формату не стоит. Почему-то используется две подписи и кодирование. Но хуже того, используется симметричный алгоритм вместо ассиметричного, да и при трансформации алгоритм гостовый, а сервис ожидает sha1 обычный...

Знатоки, подскажите, плз, чайнику, в чём могла собака порыться?
0
Alligieri
CEO
Эксперт С++
2253 / 1243 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
16.12.2012, 18:28 5
kmi, ну это в принципе стандартный "конверт" SOAP, если он сгенерен автоматом - сервис должен его "понимать"
0
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
16.12.2012, 22:25  [ТС] 6
В том-то и беда, что не понимает...
Напрягает больше всего то, что в конверте указаны не те алгоритмы. А вот как заставить при создании конверта использовать асимметричный алгоритм - решения найти не могу. Не могу изменить состав элементов в WsHttpBinding. Пробовал кастомизировать, пробовал наследника создать и переопределить некоторые методы - результат только хуже.
0
kmi
55 / 55 / 13
Регистрация: 26.04.2010
Сообщений: 173
20.12.2012, 17:01  [ТС] 7
Проблема решена. Всем спасибо за участие.
0
20.12.2012, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 17:01

Как реализовать алгоритм Дейкстры в Лазарусе?
Задали реализовать алгоритм Дейкстра в Лазарусе, а я могу только в С, помогите...

Как реализовать алгоритм Штрассена на Java?
Всем привет. Не подскажете, каким образом алгоритм Штрассена можно реализовать...

Как реализовать алгоритм шифрования md5
Здравствуйте, подскажите пожалуйста, как реализовать алгоритм md, который на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru