2011-03-29 3 views
0

J'utilise WCF pour envoyer un message via MSMQ (net.msmq protocol). Tout va bien le serveur BizTalk reçoit le message et le traite. Cependant, quand j'ai regardé dans le SVCLOG, je vois que le message est chiffré quand j'ai spécifiquement défini MsmqProtectionLevel sur Sign.Chiffrement du message WCF (net.msmq) lors de la signature

Est-ce que quelqu'un d'autre a vu ce comportement? Est-il possible d'arrêter le cryptage? Certains de mes messages dépassent 1 Mo et le cryptage rend les choses très lentes.

Merci d'avance!

ChannelFactory<OnRampEntry> Factory 
    { 
    get 
    { 
     if (factory == null) 
     { 
      lock (this) 
      { 
       if (factory == null) 
       { 
       var uri = ResolveQueueName(new Uri(Url)); 
       var identity = EndpointIdentity.CreateDnsIdentity(BizTalkIdentity); 
       var binding = new NetMsmqBinding(NetMsmqSecurityMode.Both) 
       { 
        DeadLetterQueue = DeadLetterQueue.System, 
        ExactlyOnce = true 
       }; 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; 
       binding.Security.Transport.MsmqProtectionLevel = System.Net.Security.ProtectionLevel.Sign; 
       binding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.WindowsDomain; 
       binding.Security.Transport.MsmqSecureHashAlgorithm = MsmqSecureHashAlgorithm.Sha1; 
       factory = new ChannelFactory<OnRampEntry>(binding, new EndpointAddress(uri, identity, (AddressHeaderCollection) null)); 
       factory.Endpoint.Behaviors.Add(new LogonCertificateBehavior()); 
       factory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindBySubjectName, BizTalkIdentity); 
       factory.Open(); 
       } 
      } 
     } 
     return factory; 
    } 
    } 

    /// <summary> 
    /// MSMQ does not allow a DNS alias to be used in a queue name, e.g. "net.msmq://alias/private$/queue". 
    /// <b>ResolveQueueName</b> will tranlsate an alias to its actual machine name. 
    /// </summary> 
    /// <param name="uri"></param> 
    /// <returns></returns> 
    Uri ResolveQueueName(Uri uri) 
    { 
    var hostName = uri.DnsSafeHost; 

    try 
    { 
     var hostEntry = Dns.GetHostEntry(hostName); 
     var resolved = new Uri(uri.ToString().Replace(hostName, hostEntry.HostName)); 

     if (log.IsDebugEnabled) 
      log.Debug(string.Format("Resolved '{0}' to '{1}'.", uri, resolved)); 
     return resolved; 
    } 
    catch (SocketException e) 
    { 
     if (e.SocketErrorCode == SocketError.HostNotFound) 
      return uri; 
     throw e; 
    } 
    } 

Répondre

1

La raison pour laquelle le message est crypté est l'utilisation du NetMsmqSecurityMode.Both - à la fois le transport et la sécurité des messages.

var binding = new NetMsmqBinding(NetMsmqSecurityMode.Both) 

Au niveau du transport, la configuration ci-dessus utilise

binding.Security.Transport.MsmqProtectionLevel = System.Net.Security.ProtectionLevel.Sign; 

regardant dans WCF logs il ne sera pas possible de voir ce qui est fixé au niveau de transport, comme le chiffrement au niveau des messages est en place.

Malheureusement, cela ne répond pas à la question de savoir comment signer le message (avec un certificat X.509) sans utiliser le certificat pour chiffrer le corps du message.

Questions connexes