【问题标题】:How to programmatically create a X509 cert from the digital signature parameters in a SAML assertion in .NET and C#如何以编程方式从 .NET 和 C# 中的 SAML 断言中的数字签名参数创建 X509 证书
【发布时间】:2012-06-13 21:49:33
【问题描述】:

我必须验证两个 SAML 2.0 断言签名。我可以解析出所有密钥和令牌参数,现在想使用 .NET CryptoUtils.VerifySignature() 或其他一些函数来验证签名。我有已签名的文本和作为 byte[] 数组的签名以及哈希 OID。我有 RSA 和 SAML 令牌参数,例如签名值、模数、指数等。我缺少的是要发送到 .NET VerifySignature() 例程的 x509 证书。我看不到如何通过参数以编程方式创建证书。

我也非常感谢任何关于库、c# 和 Java 的建议,这些库将处理创建、解析、验证 SAML 2.0 令牌(请求和响应)。

【问题讨论】:

  • WIF 怎么样?它应该包含你需要的一切。
  • 如果没有证书,则无法“重新创建”证书。应该有其他方法来验证签名。

标签: c# .net saml x509


【解决方案1】:

在 C# 中,您可以使用...

System.Security.Cryptography.Xml.SignedXml.CheckSignature(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate, bool verifySignatureOnly)

...验证签名。基本上,它会像这样工作:

 using System.Xml;
 using System.Security.Cryptography.X509Certificates;
 using System.Security.Cryptography.Xml;
 using System.Text;

 namespace MySamlDocumentExample
 {
     public class Saml20Transaction : SignedXml
     {
         public Saml20Transaction(XmlDocument doc) 
             : base (doc)
         {

         }
     }

     public class SamlVerifier
     {
         readonly XmlDocument _mySamlDocument = new XmlDocument();

         public SamlVerifier(string saml)
         {
             _mySamlDocument.LoadXml(saml);
         }

         public X509Certificate2 X509Certificate
         {
             get
             {
                 return new X509Certificate2(
                     Encoding.ASCII.GetBytes(X509CertificateString));
             }
         }

         public string X509CertificateString
         {
             get
             {
                 XmlNodeList xmlNodeList = _mySamlDocument.GetElementsByTagName("X509Certificate");
                 return xmlNodeList[0].InnerText;
             }
         }

         public bool ValidateSignature()
         {
             Saml20Transaction saml20Transaction = new Saml20Transaction(_mySamlDocument);
             XmlNodeList xmlNodeList = _mySamlDocument.GetElementsByTagName("Signature");
             saml20Transaction.LoadXml((XmlElement)xmlNodeList[0]);
             return saml20Transaction.CheckSignature(X509Certificate, true);
         }
     }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2010-09-20
    • 1970-01-01
    • 2020-12-30
    • 2013-07-25
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多