Click here to Skip to main content
15,886,578 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more: , +
I am facing an issue while trying to consume a WCF web service which requires mutual authentication and message signing using X509 certificate. I have already implemented mutual authentication using X509 certificate, but I am facing an issue while trying to implement message signing. I have successfully installed certificates on my machine. The error message I am getting is:
Signature verification failed
Please note I have successfully tested this application using SoapUI. But I am facing this issue while trying to implement the same in C#.
Below is the code i am using for achieving the same:
C#
public override void SecureMessage(SoapEnvelope envelope, Security security)
       {
           // Get an X.509 certificate for signing the SOAP message.
           X509SecurityToken signatureToken = GetSecurityToken("subjectname");
           if (signatureToken == null)
           {
               throw new SecurityFault("Message Requirements could not be satisfied.");
           }

           // Add the X.509 certificate to the header.
           security.Tokens.Add(signatureToken);

           // Specify that the SOAP message is signed using this X.509
           // certifcate.
           MessageSignature sig = new MessageSignature(signatureToken);
           security.Elements.Add(sig);
       }

       public X509SecurityToken GetSecurityToken(string subjectName)
       {
           X509SecurityToken objX509SecurityToken = null;
           X509Store objX509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
           objX509Store.Open(OpenFlags.ReadOnly);
           try
           {
               X509Certificate2Collection objX509Certificate2Collection = objX509Store.Certificates.Find(X509FindType.FindBySubjectName, subjectName, true);

               X509Certificate2 objX509Certificate2;
               if (objX509Certificate2Collection.Count == 1)
               {
                   objX509Certificate2 = objX509Certificate2Collection[0];
                   objX509SecurityToken = new X509SecurityToken(objX509Certificate2);
               }
               else
               {
                   objX509SecurityToken = null;
               }
           }
           catch (Exception ex)
           {
               objX509SecurityToken = null;
           }
           finally
           {
               if (objX509Store != null)
                   objX509Store.Close();
           }
           return objX509SecurityToken;
       }

[edit] phil.o - Code block added for readibility purpose [/edit]
Posted
Updated 27-Jun-15 23:06pm
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900