2013-05-24 111 views
6

Windows 2008上で.Net Framework 3.5を使用してVS 2008を使用する。SSO SAMLの署名付きXML署名検証(sha256を使用)

セキュリティのためにSAMLを使用してSSOを実装しました。私たちは、クライアントのシステムから生成されたSigned XML SAML Assertuibトークンを検証するサービスプロバイダー側​​で作業します。 現在、署名アルゴリズムは「rsa-sha1」を使用していましたが、署名アルゴリズムが「rsa-sha256」というファイルを送信する新規顧客がありました。私は(署名アルゴリズムRSA-sha256h付き)この新しい顧客のために同じコードをしようとすると、

public static string VerifySignature() 
{ 
    if (m_xmlDoc == null) 
     return "Could not load XMLDocument "; 

    try 
    { 
     XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable()); 
     nsm.AddNamespace("dsig", SignedXml.XmlDsigNamespaceUrl); 
     XmlElement sigElt = (XmlElement)m_xmlDoc.SelectSingleNode(
      "//dsig:Signature", nsm); 

     // Load the signature for verification 
     SignedXml sig = new SignedXml(m_xmlDoc); 
     sig.LoadXml(sigElt); 

     if (!sig.CheckSignature()) 
      return "Invalid Signature"; 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
    return string.Empty; 
} 

さて、 - これが動作していないと私はエラー「SignatureDescriptionが供給署名アルゴリズムのために作成することができませんでした取得しています。 "

私はSignedXmlがsha256をサポートしていないことを知りました。ファイン。しかし、次に何が。 WIFを使用しているところでは、&も試しました。thisを試しました。

また、RSAPKCS1SignatureDeformatterのVerifySignatureメソッドを使用しようとしています。しかし、2つのパラメータがどのように渡されるのかは分かりません。

+0

X509Certificate2オブジェクトをサポートしているため、暗号化アルゴリズムがサポートされていたという印象を受けました。 sig.CheckSignature(...)メソッドには、X509Certificate2とboolの2つのパラメータをとるオーバーロードがあります。あなたはそれを使用しようとし、証明書を渡して、本当ですか? –

答えて

2

これは「シンプル」ではあるが、「解決策」ではない可能性があります:)これで遭遇した数少ないクライアントにとっては、SHA-1を使用してIdPを変更するよう依頼しました。彼らはそれを変えることができ、そうするときにそれは働く。

技術的な解決策ではありませんが、「現場で」働いていたので、私はそれについて言及したいと思いました。以前の.NET 4とのために

+0

私は顧客にその変更を拒否させました。 –

3

、 あなたはhttp://clrsecurity.codeplex.com/

からSecurity.Cryptographyを追加すると、私は次のように動作することを見出した(拇印での証明書ストアに署名証明書を探し、X509CertificateFinderは自分であることに注意してください)

 /// <summary> 
     /// Validate an XmlDocuments signature 
     /// </summary> 
     /// <param name="xnlDoc"> The saml response with the signature elemenet to validate </param> 
     /// <returns> True if signature can be validated with certificate </returns> 
     public bool ValidateX509CertificateSignature(XmlDocument xnlDoc) 
     { 
      XmlNodeList XMLSignatures = xnlDoc.GetElementsByTagName("Signature", "http://www.w3.org/2000/09/xmldsig#"); 

      // Checking If the Response or the Assertion has been signed once and only once. 
      if (XMLSignatures.Count != 1) return false; 

      var signedXmlDoc = new SignedXml(xnlDoc); 
      signedXmlDoc.LoadXml((XmlElement)XMLSignatures[0]); 

      var certFinder = new X509CertificateFinder(); 
      var foundCert = certFinder.GetSignatureCertificate(); 

      CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 
      return signedXmlDoc.CheckSignature(foundCert,false); 
     } 
+2

.NET 4.5以降では、.net 4.0以前とは異なり、サードパーティのライブラリをインストールする必要はありません。 System.Deploymentへの参照を追加し、 'System.Security.Cryptography.CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription)、RsaSha256Namespace);を呼び出して、元の質問のコードがSHA256ハッシュで動作するようにしてください。 http://blogs.msdn.com/b/winsdk/archive/2015/11/15/using-sha256-with-signedxml.aspx – Rory

+0

'const string RsaSha256Namespace =" http://www.w3.org/も参照してください。 2001/04/xmldsig-more#rsa-sha256 "; ' – maddoxej

1

SHA-256は、.NET 4.5ではデフォルトで有効になっていません。したがって、.NET 3.5または4.0を使用する場合は、codeplex.comからセキュリティライブラリをダウンロードする必要があります。 SHA-2アルゴリズムに対する検証とSAML署名作成の詳細については、http://www.componentpro.com/doc/saml/working-with-sha-256.htm およびhttp://www.componentpro.com/doc/saml/Verifying-XML-Signatures.htmを参照してください。

あなたはUltimate SAML library for .NET.

8

DOTNET 4.6.2+が組み込ま新しいshaハッシュを持っている。DOTNET 4 +の場合は、RSA-SHA512、RSA-SHA384、およびRSA-SHA256へのアクセスを得るために、あなたがすべき必要があります。このコードをどこかに含めてください。

/// <summary>Declare the signature type for rsa-sha512</summary> 
public class RsaPkCs1Sha512SignatureDescription : SignatureDescription 
{ 
    public RsaPkCs1Sha512SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA512CryptoServiceProvider).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = (AsymmetricSignatureDeformatter)CryptoConfig.CreateFromName(DeformatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA512"); 
     return sigProcessor; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureFormatter)CryptoConfig.CreateFromName(FormatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA512"); 
     return sigProcessor; 
    } 
} 

/// <summary>Declare the signature type for rsa-sha384</summary> 
public class RsaPkCs1Sha384SignatureDescription : SignatureDescription { 
    public RsaPkCs1Sha384SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA384CryptoServiceProvider).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = (AsymmetricSignatureDeformatter) CryptoConfig.CreateFromName(DeformatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA384"); 
     return sigProcessor; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureFormatter)CryptoConfig.CreateFromName(FormatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA384"); 
     return sigProcessor; 
    } 
} 

/// <summary>Declare the signature type for rsa-sha256</summary> 
public class RsaPkCs1Sha256SignatureDescription : SignatureDescription 
{ 
    public RsaPkCs1Sha256SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA256CryptoServiceProvider).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureDeformatter) CryptoConfig.CreateFromName(DeformatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA256"); 
     return sigProcessor; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     var sigProcessor = 
      (AsymmetricSignatureFormatter)CryptoConfig.CreateFromName(FormatterAlgorithm); 
     sigProcessor.SetKey(key); 
     sigProcessor.SetHashAlgorithm("SHA256"); 
     return sigProcessor; 
    } 
} 

次に、このようなコードを呼び出すことによってこれらのsigの説明をアクティブにする必要があります。必要に応じて静的なコンストラクタから呼び出すことができます。

CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha512SignatureDescription), 
     "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"); 
    CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha384SignatureDescription), 
     "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"); 
    CryptoConfig.AddAlgorithm(typeof(RsaPkCs1Sha256SignatureDescription), 
     "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 

ヒントO」SO上Microsoft's Carlos LopezBitSchupsterAndrewに帽子。

+0

これは動作しています..私に多くの時間を節約してくれてありがとう.. – amesh

+3

....そしてフレームワーク4.6.2が面倒です余分なコードを必要とせずにこの問題。 –

+0

@OllieJones - あなたのコードが後でターゲット4.6.2に移行する際に壊れるかどうか知りますか? –

0

.NETフレームワーク4.6.01590以上に更新するだけで、コードを変更せずにSHA-512までサポートします。

関連する問題