2015-08-14 3 views
1

Вот код, который ломает IIS, после выполнения исследований я обнаружил следующую запись X509Certificate2 makes IIS crash и фиксированная моя проблемаX509Certificate2 сбой IIS

 var cert = new X509Certificate2(); 
     cert.Import(Resources.wildcard, "xxx", X509KeyStorageFlags.Exportable); 

Фиксированный код

 var cert = new X509Certificate2(); 
     cert.Import(Resources.wildcard, "xxx", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); 

Но теперь это вызывает мое подписание, чтобы исключить следующее:

n exception of type 'System.Security.Cryptography.CryptographicException' occurred in mscorlib.dll but was not handled in user code 
Additional information: Invalid provider type specified. 

Мой код

public class RsaSha1 
{ 
    private readonly X509Certificate2 _certificate; 

    public RsaSha1(X509Certificate2 certificate) 
    { 
     _certificate = certificate; 
    } 

    public string Sign(string signatureBaseString) 
    { 
     return SignCore(signatureBaseString); 
    } 

    string SignCore(string baseString) 
    { 
     using (var hash = Hash(baseString)) 
     { 
      return Base64Encode(Sign(hash)); 
     } 
    } 

    private static string Base64Encode(byte[] signature) 
    { 
     return Convert.ToBase64String(signature); 
    } 


    private byte[] Sign(SHA1CryptoServiceProvider hash) 
    { 
     var formatter = new RSAPKCS1SignatureFormatter(_certificate.PrivateKey). 
      Tap(it => it.SetHashAlgorithm("MD5")); 
    //The line above throws the Exception if X509KeyStorageFlags.MachineKeySet is added, 
    //but without X509KeyStorageFlags.MachineKeySet my application works in a console application (stress testing) but not in IIS (in a web application) 
     return formatter.CreateSignature(hash); 
    } 

    SHA1CryptoServiceProvider Hash(string signatureBaseString) 
    { 
     var sha1 = new SHA1CryptoServiceProvider(); 

     var bytes = Encoding.ASCII.GetBytes(signatureBaseString); 

     using (var crypto = new CryptoStream(Stream.Null, sha1, CryptoStreamMode.Write)) 
     { 
      crypto.Write(bytes, 0, bytes.Length); 
     } 

     return sha1; 
    } 
} 

EDIT 1: Новая информация, кажется, что, когда я добавляю X509KeyStorageFlags.MachineKeySet затем _certificate.PrivateKey бы бросить исключение, но когда я удалить X509KeyStorageFlags.MachineKeySet, то IIS будет врезаться. PS Я использую сертификат сгенерированный из StartSSL

ответ

1

Я импортировал сертификат в LocalMachine Store (не через код) то в моем Software я изменил

var cert = new X509Certificate2(); 
    cert.Import(Resources.wildcard, "xxx", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); 

в

 X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly); 
     foreach (X509Certificate2 certificate in store.Certificates) 
     { 
      if (certificate.SubjectName.Name != null && certs.SubjectName.Name.Contains("*.domain.xxx")) 
      { 
       cert = certificate; 
      } 
     } 

Это казалось работать лучше, чем загружать сертификат из файла, а также не прерывать IIS при загрузке

Смежные вопросы