2014-12-04 20 views
12

SignedXml.CheckSignature'un yalnızca SHA1 kullanan imzalı belgeler için çalışıyor gibi görünüyor. SHA256 ile imzalanmış bir XML belgesinin imzası nasıl denetlenir?

ben algoritma SHA256 ekleyerek this code çalıştı ve CheckSignature iyi çalıştı ama WIF sınıfları aşağıdaki özel durum atmaya başladı:

System.Security.Cryptography.CryptographicException: Belirtilen geçersiz algoritması.

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), 
          "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 

Ne kaçırdım: Bu yöntem görüşmesinde System.IdentityModel.Services.FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest

ProcessSignInRequest içten burada kılınmış olup algoritma SHA1 kullandığı görünüyor? CheckSignature'da algoritmayı nasıl belirleyebilirim?

+2

Bu belirli bir .NET 4.5 sorunu mu? Normalde etiketi değiştiririm, ancak temsilcinize verilirse, bir cevap bekleyeceğim. (Kahretsin, nasıl bu kadar çok altın aldın?) – leppie

+0

Evet. .Net 4.5 sorunu sadece. – Homam

cevap

3

Bugün aynı sorunu yaşadım. WIF imzalama sertifikasının SHA256 desteği olmayan bir CSP kullanılarak oluşturulduğu ortaya çıktı (more details).

System.IdentityModel kaynak koduna göz attım ve bu durum için özel işlem içerdiğini keşfettim. Global olarak kaydedilen ilgili algoritmaya sahip olduğunuzda, WIF bunu dahili uygulama yerine kullanır ve RSAPKCS1SHA256SignatureDescription sınıfı bu özel işleme dahil değildir.

Bu nedenle, RSACryptoServiceProvider'u, SHA256 desteğini içeren varsayılan parametrelerle yeniden oluşturan kendi SignatureDescription uygulamanızı yaptım.

/// <summary> 
/// Represents the sha256RSA signature algorithm. 
/// </summary> 
public sealed class RsaPkcs1Sha256SignatureDescription : SignatureDescription 
{ 
    /// <summary> 
    /// This type of CSP has SHA256 support 
    /// </summary> 
    private const int PROV_RSA_AES = 24; 

    public RsaPkcs1Sha256SignatureDescription() 
    { 
     KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName; 
     DigestAlgorithm = typeof(SHA256Cng).FullName; 
     FormatterAlgorithm = typeof(RSAPKCS1SignatureFormatter).FullName; 
     DeformatterAlgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName; 
    } 

    /// <summary> 
    /// Adds support for sha256RSA XML signatures. 
    /// </summary> 
    public static void RegisterForSignedXml() 
    { 
     CryptoConfig.AddAlgorithm(
      typeof (RsaPkcs1Sha256SignatureDescription), 
      "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); 
    } 

    public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) 
    { 
     if (key == null) throw new ArgumentNullException("key"); 

     key = GetSha2CompatibleKey(key); 

     var signatureDeformatter = new RSAPKCS1SignatureDeformatter(key); 
     signatureDeformatter.SetHashAlgorithm("SHA256"); 
     return signatureDeformatter; 
    } 

    public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) 
    { 
     if (key == null) throw new ArgumentNullException("key"); 

     key = GetSha2CompatibleKey(key); 

     var signatureFormatter = new RSAPKCS1SignatureFormatter(key); 
     signatureFormatter.SetHashAlgorithm("SHA256"); 
     return signatureFormatter; 
    } 

    // Some certificates are generated without SHA2 support, this method recreates the CSP for them. 
    // See https://stackoverflow.com/a/11223454/280778 
    // WIF handles this case internally if no sha256RSA support is installed globally. 
    private static AsymmetricAlgorithm GetSha2CompatibleKey(AsymmetricAlgorithm key) 
    { 
     var csp = key as RSACryptoServiceProvider; 
     if (csp == null || csp.CspKeyContainerInfo.ProviderType == PROV_RSA_AES) 
      return key; 

     var newKey = new RSACryptoServiceProvider(new CspParameters(PROV_RSA_AES)); 
     newKey.ImportParameters(csp.ExportParameters(true)); 
     return newKey; 
    } 
} 
+0

Çalışmadı, bir Kriptografi istisnası atıyor. 'Anahtar, belirtilen durumda kullanılmak için geçerli değil.' – Homam

İlgili konular