.NetGurus

Diğer Yazılar

Google a Ekle

Add to Google



İmzalama İşlemlerinde Karşılaşılan CryptographicException

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
ya da
[System.Security.Cryptography.CryptographicException: Sistem belirtilen dosyayı bulamıyor.]


Yukarıdaki hata imzalama işlemi sırasında sıkça rastlanılan bir hatadır.
Bu hata kodun içinde imzalama işleminde kullanılacak sertifika dosyasına erişilememesinden kaynaklanır ve birçok neden bu hatayı doğurabilir.
Programı geliştirme ortamında debug ederken bir problemle karşılaşmıyor ancak sunucuya deploy ettiğinizde (kurduğunuzda) program bu hataya düşüyorsa büyük ihtimalle aldığıınız hatanın sebebi erişim hakkı eksikliğidir.

Şimdi varsayalım ki myCert.pfx adında bir sertifika dosyamız var ve imzalama işlemi için RSACryptoServiceProvider türünde bir nesne kullanacağız. Bunun için LoadRsaKey adında RSACryptoServiceProvider dönenen bir fonksiyonumuz olsun. Şöyle ki;

 

public static RSACryptoServiceProvider LoadRsaKey()
{
 string myPath; 

 myPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Keys/myCert.pfx"); 

 myPath = HttpUtility.HtmlDecode(myPath); 

 X509Certificate2 cert = new X509Certificate2(myPath, "şifre-password"); 

 RSACryptoServiceProvider crypto = cert.PrivateKey as RSACryptoServiceProvider; 

 return crypto;
} 

Yukarıdaki kodu debug edersek bir problemle karşılaşmayız. Ancak deploy ettiğimizde yazının başında da anlattığım üzere şu şekilde bir hata alabiliriz.

System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr) +33
   System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
   System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) +228
   System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password) +128
..............
..............


Bu hatayı tam da
 

 X509Certificate2 cert = new X509Certificate2(myPath, "şifre-password"); 

satırı çalıştığında alırız zira sertifika açılmaya(export edilmeye çalışılır).

Çözüme geçmeden önce isterseniz problemin sebebine değinelim. Sertifikaların işletim sistemi ve framework tarafından nasıl ele alındığı konusunda derin bir bilgiye sahip olmasam da denemelerim sonunda şu bilgilere ulaştım. Yazdığımız kodda sertifikamızı açmaya çalıştığımızda, sertifika varsayılan olarak uygulamanın çalıştığı kullanıcının varsayılan sertifika deposuna(UserKeySet) yüklenmeye çalışılır ancak kullanıcı bir servis kullanıcısı ise(network service vb.) sertifika makinenin sertifika deposuna(MachineKeySet) yüklenmeye çalışır. Kullanıcı sertifika deposunun kullanılabilir olması içinse kullanıcının oturum açmış olması gerekir.
Şimdi bu çıkarımlara göre, uygulamamız IIS in varsayılan kullanıcı ve güvenlik ayarlarında problemsiz çalışır zira otomatik olarak makine deposu kullanılacaktır. Diyelim ki uygulamamız başka bir kullanıcı altında çalışıyor bu durumda bu kullanıcı oturum açmadığı sürece sertifika deposu kullanılamaz olacaktır. Özetleyecek olursak bu işlem için uygulamanın makine sertifika deposunu kullanması ya da kullanıcı sertifika deposuna erişim hakkı olan ve oturum açmış bir kullanıcı hesabı altında çalışıyor olması gerekir. İşte bu sebeple kurulum sonrası alınabilen bu hata debug ortamında tekrarlamaz.

Şimdi gelelim çözüme. Yukarıdaki yetki karmaşasını gidermek için sertifikanın kullanıcının değil makinenin sertifika deposuna açılmasını sağlayabiliriz. Bunun için yukarıda verilen koddaki

 

 X509Certificate2 cert = new X509Certificate2(myPath, "şifre-password"); 

satırını şu şekilde değiştirmemiz yeterli olacaktır;

 

 X509Certificate2 cert = new X509Certificate2(myPath, " şifre-password", X509KeyStorageFlags.MachineKeySet); 

Bu sayede sertifika sorunsuz bir şekilde machinekeystore a açılacaktır.

Son olarak şunu da belirtmek isterim ki bu durumda da uygulamamızın altında çalıştığı kullanıcı hesabının machinekeystore’ a erişim hakkının bulunması gerekmektedir, ancak normal şartlar altında kullanıcılar zaten bu yetkiye sahiptirler. En azından ben bu konuda bir problemle karşılaşmadım.


Posted by yavuz on 07 Mayıs 2008 Çarşamba 21:04
Permalink | Yorumlar (0) | Post RSSRSS comment feed

Yorum ekle


(Gravatar simgesini gösterecek)

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading