使用x509证书在wcf中签名的消息

时间:2015-06-28 08:30:16

标签: c# asp.net wcf x509certificate

我在尝试使用WCF Web服务时遇到问题,该服务需要使用X509证书进行相互身份验证和邮件签名。我已经使用X509证书实现了相互身份验证,但在尝试实现邮件签名时我遇到了一个问题。我已经在我的机器上成功安装了证书。我得到的错误信息是:

  

签名验证失败

请注意我已在SoapUI中成功测试了此应用程序。但是我在尝试在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
        // certificate.
        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;
    }

0 个答案:

没有答案