Запрос веб-службы WCF: добавьте тег ссылки вместо тега KeyIdentifier в SecurityTokenReference - PullRequest
5 голосов
/ 30 апреля 2019

Мне нужно использовать веб-сервис Java с .NET. Запросы должны быть подписаны, и сертификат должен быть включен в запрос.

При использовании метода 'GetClient', приведенного ниже, запрос генерируется правильно, за исключением одного поля. В элементе SecurityTokenReference добавлен KeyIdentifier. Это поле SecurityTokenReference должно содержать поле «Ссылка» для третьего ссылки в элементе «SignedInfo»:

</o:Security>
  </s:Header>
    <o:BinarySecurityToken>...</o:BinarySecurityToken>
    <Signature>
      <SignedInfo>
        <CanonicalizationMethod></CanonicalizationMethod>
        <SignatureMethod></SignatureMethod>
        <Reference URI="#_1">...</Reference>
        <Reference URI="#uuid-001">...</Reference>
        <Reference URI="#uuid-002">...</Reference>
      </SignedInfo>
      <SignatureValue>...</SignatureValue>
      <KeyInfo>
        <o:SecurityTokenReference>
          <o:KeyIdentifier >...</o:KeyIdentifier>
        </o:SecurityTokenReference>
      </KeyInfo>
    </Signature>
  </o:Security>
</s:Header>

So

    <o:SecurityTokenReference>
      <o:KeyIdentifier >...</o:KeyIdentifier>
    </o:SecurityTokenReference>

Должно быть

    <o:SecurityTokenReference>
        <o:Reference ValueType="..." URI="uuid-002" />
    </o:SecurityTokenReference>

Однако я не могу заставить это работать.

При использовании

 InitiatorTokenParameters InclusionMode = SecurityTokenInclusionMode.Once

добавлен правильный тег «Ссылка», но затем создается двойной тег «BinarySecurityToken», в результате чего веб-служба отклоняется. Есть ли какое-то решение для этого?

public wsClient GetClient()  
{  

        CustomBinding b = new CustomBinding();
        HttpsTransportBindingElement transport = new HttpsTransportBindingElement();

        AsymmetricSecurityBindingElement asec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement
            (MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
        asec.SetKeyDerivation(false);
        asec.AllowInsecureTransport = true;
        asec.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic256;
        asec.IncludeTimestamp = true;
        asec.ProtectTokens = true;
        asec.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
        asec.InitiatorTokenParameters = new X509SecurityTokenParameters
        {
            InclusionMode = SecurityTokenInclusionMode.Never, //.Once, ----> Once creates correct SecurityTokenReference, but double BinarySecurityToken
            ReferenceStyle = SecurityTokenReferenceStyle.Internal
        };

        asec.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters());
        TextMessageEncodingBindingElement textMessageEncoding = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);

        b.Elements.Add(asec);
        b.Elements.Add(textMessageEncoding);
        b.Elements.Add(transport);

        string url = "https://service";

        var c = new wsClient(b, new EndpointAddress(new Uri(url), 
            new DnsEndpointIdentity(kgParams.DnsEndpointIdentity), new AddressHeaderCollection()));


        X509Certificate cert = GetCertificate();
        c.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(cert);
        c.ClientCredentials.ServiceCertificate.DefaultCertificate = c.ClientCredentials.ClientCertificate.Certificate;
        c.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign;

        return c;
}

1 Ответ

0 голосов
/ 09 мая 2019

После нескольких дней борьбы с этой проблемой, а также ни одного замечания или ответа по SO, несмотря на награду в 250 баллов, я могу только прийти к выводу, что это несовместимость между Java и .NET WCF.

В конце я просто разочаровался в WCF и воссоздал весь ***** запрос с нуля. Это значит:

  • Создание XmlDocument, содержащего необходимые данные
  • Добавить сертификат как Base64 в заголовок
  • Временная метка запроса
  • Вручную добавить правильный тег KeyInfo
  • Вручную добавить все ссылки, используя соответствующие GUID
  • Подпишите все элементы вручную, используя SignedXml и сертификат
  • Вручную отправить запрос

Сервер принял запрос без каких-либо жалоб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...