使用私钥和证书生成断言签名?

时间:2017-11-20 18:56:41

标签: c# .net single-sign-on saml-2.0 assertion

我已经提供私钥,公钥和证书来尝试为SSO申请生成签名,我现在已经在这方面苦苦挣扎了一段时间而且我已经认为我终于设法让一些代码在需要时接近工作。我在这里发了一段时间的帖子:iDP connecting to SP SAML / SSO这帮助我朝着正确的方向前进。

但是我仍然不确定我是如何签署此签名的,我似乎所有的代码都说我需要使用.Net类X509Certificate,它通常试图加载到另一个文件中,但证书是在断言文件本身。

<ds:X509Data>
    <ds:X509Certificate>X509Certificate Goes Here</ds:X509Certificate>
</ds:X509Data>

我在这里有这个方法:

  private SignedXml SignSignature(XmlDocument assertionDoc, string uri, string digest)
    {
        CspParameters cspParams = new CspParameters();
        cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

        RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

        SignedXml signedXml = new SignedXml(assertionDoc);
        Reference reference = new Reference();

        signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
        signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;

        reference.Uri = uri;     

        reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
        reference.AddTransform(new XmlDsigExcC14NTransform());
        reference.DigestMethod = SignedXml.XmlDsigSHA1Url;
        reference.DigestValue = Encoding.ASCII.GetBytes(digest);

        signedXml.AddReference(reference);
        signedXml.SigningKey = rsaKey;

        HMACSHA256 key = new HMACSHA256(Encoding.ASCII.GetBytes(PrivateKey));

        signedXml.ComputeSignature(key);

        return signedXml;
    }

我正在使用哪个来签署文档的SignatureValue,但是我只使用SHA256类中的私钥而不是证书,我甚至不确定我是否使用私钥正确地说,总的来说,我认为这使得它变得比它需要的更复杂,希望来自这里的人可以帮助我。

1 个答案:

答案 0 :(得分:0)

当您签署断言时,您只需要使用证书的私钥,这就是您的代码。

但是,通常将证书的公钥作为keyinfo插入签名中以通知接收方。这最终会像上面提到的ds:X509Data部分一样。为此,您需要在上面的方法中添加更多代码行。您可以在https://github.com/Safewhere/CHTestSigningService/blob/86a66950d1ffa5208b8bf80d03868a073ba29f12/Kombit.Samples.CHTestSigningService/Code/TokenSigningService.cs#L344找到示例代码(注意第361,362和368行)。