Я хочу подключиться. Net Core 3.1 с C# к веб-службе, которая требует, чтобы я подписал тело Soap 1.1 в соответствии с WS-Security WS-Policy 2004 /09.
Это текстовое описание требования политики:
AsymmetricBindingAssertion
указывает на использование асимметричного шифрования c, где сертификат запрашивающего (X509v3) должен быть использован для подписи. Поле InitiatorToken
указывает, что токен запроса должен быть токеном X509v3 и что он должен быть включен во все сообщения запроса, в то время как поле RecipientToken
указывает, что токен ответа должен быть X509v3, но не будет включен ни в одно сообщение. Для идентификации токена будет использован keyIdentifier - указанный в поле MustSupportKeyRefIdentitier
. Timestamp
также необходим для включения, чтобы обойти атаки повторного воспроизведения, и поэтому - по умолчанию - также подписано. Поле OnlySignEntireHeadersAndBody
предписывает, что только весь заголовок или тело может быть подписано - чтобы уменьшить XML Перенос подписи. И наконец, мы только диктуем, что Bodyelement SOAP Envelope должен быть подписан.
Я добавил подключенную службу с Microsoft WCF Web Reference Provider в Visual Studio 2019 и все объекты добавляются в Reference.cs. Я могу подключиться к фиктивной версии сервиса в SoapUI просто без требования WS-Policy. Я проверил сертификаты и прочее, я просто не могу понять, как подписать тело soap.
Я не могу использовать WSHttpBinding
, потому что он производит Soap 1.2 и услугу I ' m, пытающийся потреблять, понимает только Soap 1.1 .
Я пробовал разные подходы с CustomBinding
, но, похоже, он всегда сгорает до использования AsymmetricSecurityBindingElement
которого нет в. Net Core.
У нас есть реализация в JavaScript, которая производит то, что я хочу:
<?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:tns="xx"
xmlns:cmn="xxx">
<soap:Header>
<wsse:Security 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" soap:mustUnderstand="1">
<wsse:BinarySecurityToken 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="x509-uidxxx">MIIE...base64=</wsse:BinarySecurityToken>
<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" Id="_1">
<Created>2019-09-21T12:33:36Z</Created>
<Expires>2019-09-21T12:43:36Z</Expires>
</Timestamp>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="#_0">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>sc...base64=</DigestValue>
</Reference>
<Reference URI="#_1">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>5J...base64=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>pa...base64=</SignatureValue>
<KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#x509-uidxxx" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</KeyInfo>
</Signature>
</wsse:Security>
</soap:Header>
<soap:Body Id="_0">
// Lots of stuff
</soap:Body>
</soap:Envelope>
Кто-нибудь знает, можно ли подписать soap тело с использованием асимметричного c шифрования с C# in. Net Core 3.1 и выдачей Soap 1.1?