I cannot find a suite of algorithms for this soap wcf request header

137 Views Asked by At

I am receiving a header from a third-parthy wcf java client. My .NET svc service is throwing an exception after receive it ,due to I cannot find a compatible algorhtim suite value in my web.config. This is the signerInfo header I am receiving .

<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod>
<ds:Reference URI="#Id-8614033b-910c-4a74-abe7-bf44ddf4783b">
<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>IRjrAkRMq+hCcPN4+/Wplx3ztPc=</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#Id-bcc497b1-6ace-4bae-aabf-9e9881715ff2">
<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>Je/XYQPnIn3OZtC8qqWAeTxWibQ=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>

As you can see, DigestMethod Algorithm and SignatureMethod Algorithm are different.

This is my binding configuration on web.config file:

binding name="BasicHttpBinding_IAdviserWsV2PortType" 
 maxReceivedMessageSize="2147483647">
          security mode="TransportWithMessageCredential" >
            message clientCredentialType="Certificate" algorithmSuite=""  
          security>
binding>

I cannot find the appropiate value for the tag algorithmSuite. I tried with most of the values in official microsoft documents for this tag but none of them can accept simultaneously rsa-sha256 and sha1 algorithms.

aNY SOLUTION?, THANKS.

I tried this on server side:

public static void Configure(ServiceConfiguration config)
        {
            config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"C:\inetpub\wwwroot\IntegracionAdviser\Web.config" }, ConfigurationUserLevel.None));
            // add an custombinding endpoint at https:///basic
            config.AddServiceEndpoint(typeof(IAdviserWsV2PortType), GetCustomBinding(), "");
        }

        public static CustomBinding GetCustomBinding()
        {
            TransportSecurityBindingElement sec = (TransportSecurityBindingElement)TransportSecurityBindingElement.CreateCertificateOverTransportBindingElement(MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10);
            sec.SetKeyDerivation(false);
            sec.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
            sec.IncludeTimestamp = true;
            sec.DefaultAlgorithmSuite = new SuiteAdviser();
       
            TextMessageEncodingBindingElement enc = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);
            HttpsTransportBindingElement trans = new HttpsTransportBindingElement();

            CustomBinding binding = new CustomBinding();
            binding.Name = "CustomBinding_IMyService";
            binding.SendTimeout = new TimeSpan(00, 29, 00);

            binding.Elements.Add(sec);
            binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
            binding.Elements.Add(new HttpsTransportBindingElement());

            return new CustomBinding(binding);
        }

Here my custom class that inherits from SecurityAlgorithmSuite:

public class SuiteAdviser : SecurityAlgorithmSuite
{
    public SuiteAdviser() { }

    public override string DefaultAsymmetricSignatureAlgorithm
    {
        get { return SecurityAlgorithms.RsaSha256Signature; }
    }

    public override string DefaultDigestAlgorithm
    {
        get { return SecurityAlgorithms.Sha1Digest; }
    }

    public override string DefaultCanonicalizationAlgorithm
    {
        get { return SecurityAlgorithmSuite.Default.DefaultCanonicalizationAlgorithm; }
    }

    public override string DefaultEncryptionAlgorithm 
    {
        get { return SecurityAlgorithmSuite.Default.DefaultEncryptionAlgorithm; }
    }

    public override int DefaultEncryptionKeyDerivationLength
    {
        get { return SecurityAlgorithmSuite.Default.DefaultEncryptionKeyDerivationLength; }
    }

    public override string DefaultSymmetricKeyWrapAlgorithm
    {
        get { return SecurityAlgorithmSuite.Default.DefaultSymmetricKeyWrapAlgorithm; }
    }

    public override string DefaultAsymmetricKeyWrapAlgorithm
    {
        get { return SecurityAlgorithmSuite.Default.DefaultAsymmetricKeyWrapAlgorithm; }
    }

    public override string DefaultSymmetricSignatureAlgorithm
    {
        get { return SecurityAlgorithmSuite.Default.DefaultSymmetricSignatureAlgorithm; }
    }

    public override int DefaultSignatureKeyDerivationLength
    {
        get { return SecurityAlgorithmSuite.Default.DefaultSignatureKeyDerivationLength; }
    }

    public override int DefaultSymmetricKeyLength
    {
        get { return SecurityAlgorithmSuite.Default.DefaultSymmetricKeyLength; }
    }

    public override bool IsAsymmetricKeyLengthSupported(int length)
    {
        return true;
    }

    public override bool IsSymmetricKeyLengthSupported(int length)
    {
        return true;
    }

    public new static SuiteAdviser Default { get; }


}

unfortunately the DefaultAlgorithmSuite property included in my customBindig does not accept a new instance of the inherited class. Instead It needs the value of a static property.Here the exception in my IIS.

ExceptionDetail, probablemente creado por IncludeExceptionDetailInFaults=true, cuyo valor es:
System.InvalidOperationException: Se inició una excepción en una llamada a una extensión de exportación de directiva.
Extensión: System.ServiceModel.Channels.HttpsTransportBindingElement
Error: El argumento especificado está fuera del intervalo de valores válidos.
Nombre del parámetro: suite ----> System.ArgumentOutOfRangeException: El argumento especificado está fuera del intervalo de valores válidos.
Nombre del parámetro: suite
   en System.ServiceModel.Security.WSSecurityPolicy.CreateAlgorithmSuiteAssertion(SecurityAlgorithmSuite suite)
   en System.ServiceModel.Security.WSSecurityPolicy.CreateWsspAlgorithmSuiteAssertion(MetadataExporter exporter, SecurityAlgorithmSuite suite)
   en System.ServiceModel.Security.WSSecurityPolicy.CreateWsspTransportBindingAssertion(MetadataExporter exporter, TransportSecurityBindingElement binding, XmlElement transportTokenAssertion)
   en System.ServiceModel.Channels.SecurityBindingElement.ExportTransportSecurityBindingElement(TransportSecurityBindingElement binding, ITransportTokenAssertionProvider transportTokenAssertionProvider, MetadataExporter exporter, PolicyConversionContext policyContext)
   en System.ServiceModel.Channels.SecurityBindingElement.ExportPolicyForTransportTokenAssertionProviders(MetadataExporter exporter, PolicyConversionContext context)
   en System.ServiceModel.Channels.HttpsTransportBindingElement.OnExportPolicy(MetadataExporter exporter, PolicyConversionContext context)
   en System.ServiceModel.Channels.HttpTransportBindingElement.System.ServiceModel.Description.IPolicyExportExtension.ExportPolicy(MetadataExporter exporter, PolicyConversionContext context)
   en System.ServiceModel.Description.MetadataExporter.ExportPolicy(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
   --- Fin del seguimiento de la pila ExceptionDetail interna ---
   en System.ServiceModel.Description.MetadataExporter.ExportPolicy(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
   en System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, BindingParameterCollection bindingParameters)
   en System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName, BindingParameterCollection bindingParameters)
   en System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata()
   en System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized()
   en System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension)
   en System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData()
   en System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage)
   en System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest)
   en System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message)
   en SyncInvokeGet(Object , Object[] , Object[] )
   en System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   en System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
   en System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
0

There are 0 best solutions below