Подпишите SOAP с помощью сертификата (WSE)

У меня есть требование, что я должен создать сообщение SOAP, а затем подписать его с помощью сертификата X509, прежде чем отправлять его в службу через POST. Я понятия не имею, что это за сервис, но мне дали пример SOAP.

Я попытался использовать пример в MSDN, но он ограничен и неполный, и я не могу создать экземпляр объекта безопасности. Но даже если бы я мог, как мне связать его с SoapEnvelope?

http://msdn.microsoft.com/en-us/library/aa529277.aspx

Сообщение SOAP создается с помощью Xslt. Мне нужно, чтобы его подписали во что бы то ни стало. Трудно что-либо найти. Любые идеи?

В настоящее время я использую следующий код для подписи xml, а затем вставляю его в SOAP xml.

private static XmlElement EncryptMessage(XmlElement msgBody)
    {
        StoreName storeName = (StoreName)Enum.Parse(typeof(StoreName), "My");
        StoreLocation storeLocation = (StoreLocation)Enum.Parse(typeof(StoreLocation), "LocalMachine");

        X509Certificate2 cert = X509Helper.GetCertificate(storeName, storeLocation, "CN=Something"); 
        SignedXml signedXml = new SignedXml(msgBody);

        signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
        signedXml.SigningKey = cert.PrivateKey;
        signedXml.KeyInfo.AddClause(new System.Security.Cryptography.Xml.KeyInfoX509Data(cert));

        Reference tRef = new Reference(""); 

        XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();

        tRef.AddTransform(env);

        signedXml.AddReference(tRef);
        signedXml.ComputeSignature();

        XmlElement xmlDsig = signedXml.GetXml();
        xmlDsig.SetAttribute("Id", "Signature-1");

        return xmlDsig;
    }

который возвращает

    <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
  <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
  <Reference URI="">
    <Transforms>
      <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
    <DigestValue>iGDf7TGuTzLDv/PYYF7/DC7xcZs=</DigestValue>
  </Reference>
</SignedInfo>
<SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#">nALPlzIs96AE6/oMeFLFgxNJEeExwbvVLQI5HmevtthSX8hppH6Wr3OSk6/GSBtfyw6x1rXZXVbiXLuZ5jxiOsFfz314gBhoRzAskIxEer2SVmJ3BGUknEj+8pAAWfHFd3S8I4xPDjXvNPKalPsos8SBIDGNztACuG/aTb8FfomtxeJuzuIxQMPzXcJmX3bc1Sm7vkfrImY0Ep6LgFhl7NH5cl9R51APoSyRAjAxgPSQ/B3cdYxKwRO4Xe0A3XmFhdVWbFz+IfZGoWWqol0pOlVjkyzagqaMKl6Qstg3qmoqwspiQ/sUcyl+BOqXUtOw8ItFNUhrCeHxp4Utq8Hlqg==</SignatureValue>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
  <X509Data>
    <X509Certificate>MIIDAjCCAeqgAwIBAgIQdTFx7HlggYRD6LNeHg9uITANBgkqhkiG9w0BAQUFADAqMSgwJgYDVQQDEx9kZGF2aXMtUEMuaW50cmFuZXQud2VibWV0cm8uY29tMB4XDTExMDExODIxNDAyNFoXDTEyMDExODAwMDAwMFowKjEoMCYGA1UEAxMfZGRhdmlzLVBDLmludHJhbmV0LndlYm1ldHJvLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALMTgt9dnWwPEquCzW0sfUvRN5VLqX8BGeT9IL3MSXT9jdY2fWHav6SNdoXGp2RnSmQnTjHoz7WRu0r8UHfV9H7W6bUwiE+Ek1mQcbTGM3v/MOzzpbK4OT/OexP8LLFV0DihtX3PHinaTIvczledUHj135hOF6q6YDgLg/XkYUiuXk2DzYSIFSTQ5cPgt7k7fYwpVPiqddU56djKov2xWbnJKmNyO7XbKQiHYUADvqem3WE4NcTHIwScmjXdLxrN3xKKhh+UFvRRXeMyV+I4yvHGRUx1ZSsJ7yvC8rMYWuq3n8GymYSXJyWZKzEKxISbl9RTeri4ToyghpEcqiQ0oBUCAwEAAaMkMCIwCwYDVR0PBAQDAgQwMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQAWlISMloQU+SmZ1vAvup6WngUUsWc27h/mkA2wO1/H8GfjiiUrS/BCIqL37L/x0uFw6uUF4v0qbK2/weuqKPCUYu676k4D9fuwdTLwZaoIclSrM7XWwcbp/m4IHzHuW3BZ+r4MWe0Jv49CDlVj5A2kT0FXDc+qemulPtP4OOb0f8UzBoPuWTM86rjjY290F1jUdtEtgY9EJWxNAC2AnIY2dxXBZZm5v3FBPcqXTQXxCAmMV9xXfGb6Rg2j8IiL04qJ/2y4u+G3VKjWRyqDvKQ293qO7JMAdDnBleRxgwPNTJ/B5R5UcRT5AAwqbSfUgmcZeJN1ZCWMEdX41oONzkJJ</X509Certificate>
  </X509Data>
</KeyInfo>

Основываясь на том, что я прочитал здесь: http://www.trl.ibm.com/projects/xml/soap/wp/wp.html все, что мне нужно, это то, что у меня есть, чтобы я мог просто вставить это в заголовок.


person Dustin Davis    schedule 18.01.2011    source источник
comment
Есть ли причина, по которой вы используете WSE? WCF справляется с такими вещами намного лучше.   -  person Doobi    schedule 19.01.2011
comment
Требования. Если бы я мог использовать WCF, я бы это сделал.   -  person Dustin Davis    schedule 19.01.2011
comment
Для читателей: WSE ужасно устарела. Это было временное решение — хак, наложенный поверх устаревшей технологии ASMX. У него практически нет поддержки от Microsoft. Его никогда не следует использовать для новых требований, запрещающих разработку.   -  person John Saunders    schedule 12.12.2013


Ответы (2)


Вам не нужен WSE, вы можете подписать сообщение, сгенерировав подпись из тела сообщения. Код, который вы используете, правильный. Просто измените его, чтобы обработать тело сообщения, а затем поместите xml, возвращенный вашим методом, в заголовок мыльного сообщения. Кроме того, похоже, вам нужно добавить ссылку. URL-адрес должен быть любым идентификатором, который вы дали телу.

person Dustin Davis    schedule 26.01.2011

Я сделал следующим образом, сначала берем сертификат и храним в стоковых сертификатах, после заходим в сертификат из магазина и подписываем мыльное сообщение

по этой ссылке вы найдете тот же пример и другие подобные http://www.systemdeveloper.info/2013/11/digital-signature-in-c.html

Это пример того, как я это сделал:

    public static getDataResponse queryingData(string name)
    {
        proxy.BanWS conexion = new proxy.Banws();

        //VALIDATION OF CONNECTION V3
        X509Certificate2 elCert = new X509Certificate2(@"C:\portecle-1.5\12345.P12", "12345");
        conexion.ClientCertificates.Add(elCert);

        // Copy the certificate to the certificate store using ASPNET
        // spent the path and password
        X509Certificate2 certificate = new X509Certificate2(@"C:\portecle-1.5\12345.P12", "12345");
        X509Store stores = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        stores.Open(OpenFlags.ReadWrite);
        stores.Add(certificate);
        stores.Close();

        String sto = X509CertificateStore.MyStore;
        // Open the Certificates Stores
        X509CertificateStore store = X509CertificateStore.CurrentUserStore(sto);
        store.OpenRead();

        // We look for the certificate that we will use to perform the signature
        String certname = "conticert";

        Microsoft.Web.Services2.Security.X509.X509CertificateCollection certcoll = store.FindCertificateBySubjectString(certname);

        if (certcoll.Count != 0)
        {
            Microsoft.Web.Services2.Security.X509.X509Certificate cert = certcoll[0];

            SoapContext ctx = conexion.RequestSoapContext;
            SecurityToken tok = new X509SecurityToken(cert);
            ctx.Security.Timestamp.TtlInSeconds = 120;
            ctx.Security.Tokens.Add(tok);
            // We signed the request
            ctx.Security.Elements.Add(new MessageSignature(tok));
        }

        //remote call
        getDataResponse response = new getDataResponse();

        response = conexion.getData(name);

        return response;
    }
person angelo    schedule 12.12.2013