У меня есть следующие требования от стороннего сервиса, который я использую
Операции, связанные с личной информацией и другими конфиденциальными данные используют защиту безопасности транспортного уровня. Сообщение веб-службы будет передаваться через https (HTTP через SSL) и должен соответствовать веб- Сервис (WS)-Безопасность v1.1 стандарт. Раздел WS-Security служебное сообщение должно:
- Быть подписанным сертификатом x.509 с использованием 2048-битного ключа.
- Используйте SHA2 с алгоритмом RSA для шифрования
- Используйте канонизацию C14.
Мне удалось подписать мое сообщение следующим кодом
someServiceRef.widjetClient client = null;
try
{
X509Certificate2 signingCert = GetSigningCert();
var bindings = new BasicHttpsBinding();
bindings.Security.Mode = BasicHttpsSecurityMode.TransportWithMessageCredential;
bindings.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
client = new someServiceRef.widjetClient(
bindings,
new EndpointAddress(@"<URL OF SERVICE>"));
client.ClientCredentials.ClientCertificate.Certificate = signingCert;
client.ClientCredentials.ServiceCertificate.DefaultCertificate = signingCert;
client.Open();
var request = BuildRequest();
var response = client.SayHello(request);
Console.WriteLine(response);
}
finally
{
if (client != null)
{
if (client.State == System.ServiceModel.CommunicationState.Faulted)
client.Abort();
else
client.Close();
}
}
Проблема в том, что мое сообщение подписывается sha1 вместо sha2. Я пытаюсь правильно подписать свое сообщение, но примеры, которые я нашел в Интернете, заставляют вас генерировать мыльное сообщение, а затем вручную изменять его с помощью синтаксического анализа XML и добавления новых узлов. Я не понимаю эти примеры и пытаюсь найти способ заставить службу сделать это за меня. У меня есть пример того, как должна выглядеть подпись запроса от третьей стороны ниже. Я не вижу ничего в клиенте или классе привязки, что позволило бы мне изменить такие вещи, как алгоритм подписи. Как мне это сделать?
<SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:Security xmlns:wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand = "1">
<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 = "XWSSGID-12324774331131695995061">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</wsse:BinarySecurityToken>
<ds:Signature xmlns:ds = "http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha2" />
<ds:Reference URI = "#XWSSGID-1232477437326-1352495766">
<ds:DigestMethod Algorithm = "http://www.w3.org/2000/09/xmldsig#sha2" />
<ds:DigestValue>XXXXXXXXXXXXXXXXXXXXXX</ds:DigestValue>
</ds:Reference>
<ds:Reference URI = "#XWSSGID-1232477437326-823787906">
<ds:DigestMethod Algorithm = "http://www.w3.org/2000/09/xmldsig#sha2" />
<ds:DigestValue>XXXXXXXXXXXXXXXXXXXXX</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference xmlns:wsse = "http://www.w3.org/2000/09/xmldsig#" xmlns:wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsse:Id = "XWSSGID-1232477437311698965010">
<wsse:Reference URI = "#XWSSGID-12324774331131695995061" />
<ds:X509Data>
<ds:X509IssuerName>XXXXXXXXXXXXXXXXXXXXXXXXX</ds:X509IssuerName>
<ds:X509SerialNumber>XXXXXXXXXXXXXXXXXXX</ds:X509SerialNumber>
</ds:X509Data>
</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 = "XWSSGID-1232477437326-823787906">
<wsu:Created>2009-01-20T18:50:37.233Z</wsu:Created>
<wsu:Expires>2009-01-20T18:50:42.233Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body xmlns:SOAP-ENV = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id = "XWSSGID-1232477437326-1352495766">
BODY OF MESSAGE GOES HERE
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Это не отвечает на мой вопрос. Где при создании службы или привязки я мог бы сделать что-то подобное? Пример, который вы разместили, просто вычисляет хэш файла
Версия sha по умолчанию (sh1 или sha 256) зависит от версии Net. См. следующее: learn.microsoft.com/en-us/dotnet/framework/migration-guide/…
Это может вам помочь:social.msdn.microsoft.com/Forums/vstudio/en-US/…
@TheobaldDu да, это было частью этого. Я понял это 2 дня назад. выложу решение
Получилось, что это окончательное решение
someServiceRef.widjetClient client = null;
try
{
X509Certificate2 signingCert = GetSigningCert();
var bindings = new BasicHttpsBinding();
bindings.Security.Mode = BasicHttpsSecurityMode.TransportWithMessageCredential;
bindings.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
bindings.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256
var elements = bindings.CreateBindingElements();
elements.Find<SecurityBindingElement>().EnableUnsecuredResponse = true;
var customBindings = new CustomBinding(elements);
client = new someServiceRef.widjetClient(
customBindings,
new EndpointAddress(@"<URL OF SERVICE>"));
client.ClientCredentials.ClientCertificate.Certificate = signingCert;
client.ClientCredentials.ServiceCertificate.DefaultCertificate = signingCert;
client.Open();
var request = BuildRequest();
var response = client.SayHello(request);
Console.WriteLine(response);
}
finally
{
if (client != null)
{
if (client.State == System.ServiceModel.CommunicationState.Faulted)
client.Abort();
else
client.Close();
}
}
Sha2 составляет 256 SHA. Поэтому используйте следующее: learn.microsoft.com/en-us/dotnet/api/…