E-İmza İle PDF İmzalama | C#

Merhaba, geçenlerde bir ihtiyaç üzerine Kamu Sertifikasyon Merkezi (https://yazilim.kamusm.gov.tr) tarafından sunulan e-imza kütüphanesi ile tanıştım.
Burada hem C#, hem de Java örnek kodları vardı.
Örneği ayağa kaldırmaktansa, onu referans alarak basit bir uygulama yazdım.
Hem oradaki gibi .p7s dosyası oluşturabildim, hem de bir PDF belgesini imzalayabildim.
İhtiyacı olanlar için de buraya çalışan halini koyuyorum.

  • Öncelikle KamuSm’den indirdiğim örnek projenin içerisindeki BENİOKU.txt içerisinde verilen yönergeleri uyguladım.
    http://depo.kamusm.gov.tr/depo/SertifikaDeposu.svt adresinden “SertifikaDeposu.svt” dosyasını,
    http://depo.kamusm.gov.tr/depo/SertifikaDeposu.xml adresinden “SertifikaDeposu.xml” dosyasını indirebilirsiniz.
    Bu dosyaları c:\Users\zamkinos.sertifikadeposu\ dizini altına kopyalamalısınız.
  • “lib” dizini altında kullanmanız gereken dll dosyaları bulunmaktadır. Onların hepsini projenin altında lib dizini içine koydum.
  • Ben C altına EImza diye bir dizin açtım. İşlemleri orada yaptım.
  • Aldığım hatalar neticesinde certval-policy.xml dosyasına aşağıdaki satırları ekledim.
  • Örnekle uyumlu olması açısından .net FrameWork 3.5 ile yazdım ben de.
  • Örneklerde PDF dosyasını imzalama yoktu. Onu da internette bir arkadaşın örneğinden faydalanarak hallettim.

Örnek projeyi de buraya bırakıyorum. Belki birilerinin işine yarar.

https://www.zamkinos.net/KonsolEImza.rar

Selamlar.

Kaynaklar:

https://github.com/mfarkan/E-Imza-iTextSharp-ESYA-Api

https://yazilim.kamusm.gov.tr/?q=/node/14

8 thoughts on “E-İmza İle PDF İmzalama | C#”

  1. Merhaba,

    Öncelikle çözümünüz için teşekkür ederim. Bir projem için e-imza okumam gerekiyor. Projenizi faydalanabileceğimi düşündüm ve lokalime indirip çalıştırdım. Ancak bir noktada hata almaktayım.

    SmartCardManager.cs sınıfı, 155. satırda SmartOp.getSlotAndCardType() metodu Unhandled Exception atmakta.

    Detaylı hata açıklaması:
    “Net.Pkcs11Interop.Common.UnmanagedException: ‘Unable to load library. Error code: 0x0000007E. Error detail: The specified module could not be found'”

    Çözüme dair bir fikriniz var ise, paylaşırsanız sevinirim.

    İyi çalışmalar.

  2. Merhaba, karşılaştığım bir hata değil. Ancak aşağıdakiler kontrol edilebilir:
    * ma3api-pkcs11-interop.dll’in referanslarda olduğu teyit edilebilir.
    * e-imza dongle’ına ait yazılımın doğru bir şekilde yüklendiğine emin olmak lazım.
    * https://docs.microsoft.com/tr-TR/cpp/windows/latest-supported-vc-redist adresinden Microsoft Visual C++ Yeniden Dağıtılabilir paketini indirip kurmayı deneyebilirsin.

    Bütün bunları denemene rağmen olmazsa da, uzaktan bağlanıp bakabilirim müsait bir zamanda.

    Selamlar.

    1. Cevabınız için teşekkür ederim. Başka bir bilgisayarda denedim, bu sefer çalıştı. Sanırım Smart Card Reader sürücüleri doğru şekilde yüklenmemişti.

      Şu an geldiğim noktada terminalleri okuyup, e-imza üzerinden verileri doğru şekilde alabiliyorum.

      Ancak imzalaBasitIcerik() içinde assert yaparken sdvr.getSDStatus() metodu NOT_ALL_VALID döndürüyor (Program.cs, satır: 149).

      sdvr.getSDValidationResults() metodu ile değerleri incelediğimde, “(-) Signature Checker Signature crypto verification is unsuccessful” mesajını görüyorum. Mesajın tamamı aşağıdaki gibidir;

      “{Pre-verification is done. Signature Checker Results: (-) Signature Checker Signature crypto verification is unsuccessful. (+) Message Digest Attribute Checker Message digest check is successful. (+) Signing Certificate V2 Attribute Checker Signing certificate attribute check is successful. (+) Certificate Validation Checker Certificate validation is successful (+) Content Type Attribute Checker Content Type attribute check is successful. }”

      Ben ACS Smart Card Reader üzerinden e-imza yüklü e-kimlik okuyorum. Sanırım sizin projeniz dongle okumak için tasarlanmış. Bende terminallerin ve e-imza verilerinin alınmasında bir problem oluşmadı ama belki bununla ilgili olabilir. Önerileriniz olursa dönüşlerinizi bekliyorum.

      Teşekkürler.

      1. Merhaba, öncelikle imzalaBasitIcerik() metodunu KamuSm’den aldığım örneği çalıştırabilecek miyim diye koymuştum oraya. Onun da çalıştığını teyit etmek için.
        Ancak PDF imzalamak için ona ihtiyacımız yok. Eğer sen PDF imzalayabiliyorsan o metodu es geçebilirsin. Bende ACS Smart Card Reader olmadığından deneyemiyorum, o yüzden sebebi ile ilgili net bir cevap veremiyorum, kusura bakma.

        Selamlar.

  3. Merhaba, paylaşımınız için çok teşekkür ederim, çalışan bir örnek bulmak gerçekten çok zor. Ben e-imzayı .pdf dosyası üzerinde bir alanda (koordinat belirterek) kullanmak istiyorum, adobe reader ‘da imzalama yaparken bir alan taradığımızda oraya imza yerleştiriyor. Amacım bir yazı oluşturduğumda isim soyisim göstererek imzalamak ve mouse ile üstüne gelince eimzayı göstermesi. Sizin örneğinizde nasıl bir değişiklik yapmam gerekli yada böyle bir çalışmanız var ise paylaşmanız mümkün mü? Umarım ne demek istediğimi anlatabilmişimdir.
    Tekrar teşekkürler.

    1. Merhaba, PdfSigner class’ında SignPDF metoduna şu iki satırı eklersen sanırım istediğin olacak. Rectangle nesnesinin parametreleri ile de koordinatlarını ayarlayabilirsin. Ben örnek bir PDF’te denedim ve görüntüleyebildim.
      ......
      PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

      signatureAppearance.SetVisibleSignature(new Rectangle(150, 1100, 500, 50), 1, "Signature");
      signatureAppearance.Reason = "Keyfimden...";

      crlList = new List();
      ........

      Selamlar

      1. Cevabın için teşekkür ederim, şu an şehir dışındayım deneme imkanım olmadı. Bu sanırım console uygulaması, msdos (siyah) ekranda açılıyor , ben windows form uygulaması yapmak istiyorum, yani imzalanacak dokümanı openfiledialog ile seçip, imza sonrası hangi klasöre atacak, eimza şifresi textbox ile girilecek, hatta 2 kişi imzalayacak gibi. Kodlar program.cs sınıfında başlangıç yapıyor, ben kodları form içindeki butondan çalıştırmak için denemeler yaptım, hatta program.cs’de sadece form1 açılsın dedim ama yine dos ekranı arkada açılıyor, bunun nedeni console application olmasından kaynaknalıyor olabilir mi? kodları windowsform uygulamasına taşımak için kolay bir yöntem varmı. Yardımcı olursan çok sevinirim. Teşekkürler kolay gelsin.

        1. Merhaba, form uygulamasına çevirmek kısmında e-imza ile ilgili hiç bir şey düşünme bence. Bahsettiğin şekilde bir Form Uygulaması yaz. Sadece dosya seçilsin. Bir butona basınca InputBox çıksın şifre alsın kullanıcıdan. Bir butona basınca imzaladım diye mesaj çıksın. Ama hiç bir işlem yapmasın. Yani uygulamanın iskeletini e-imza kodları olmaksızın yazarsan, butonun arkasında e-imza ile ilgili kısımları eklemek çok basit. Çünkü konsol da olsa, form da olsa aynı kod çalışacak. O noktada buradaki kodu kullanabilirsin. Ama önce içi boş bir form uygulaması oluşturman lazım.

          Selamlar.

Leave a Reply

Your email address will not be published.