Altbilgi içeriğine atla
ÜRüN KARşıLAşTıRMALARı
C# ile ITextSharp Kullanarak PDF'e Dijital İmza Nasıl Eklenir?

iTextSharp Kullanarak C#'ta PDF'ye Dijital İmza Ekleme

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

Hızla değişen dünyamızda, fiziksel evrak işleri hızla elektronik belgelerle değiştiriliyor. İster bir sözleşmeyi imzalamak, bir faturayı onaylamak veya bir devlet formu teslim etmek olsun, dijital dokümantasyon standart hale geldi. Ancak, bu kolaylık yeni bir meydan okuma getiriyor: dijital belgelerin özgünlüğünü ve bütünlüğünü sağlamak.

Elektronik imzalar bir çözüm sunuyor. Bir dokunmatik ekranda bir çizik olmaktan öte, dijital imzalar, imzalayanın kimliğini doğrulamak ve bir belgenin içeriğinin değişmeden kaldığını sağlamak için kriptografik teknikler kullanır. C# geliştiricileri için, bu düzeyde güvenlik, özellikle IronPDF ve iTextSharp gibi araçlarla PDF iş akışlarına entegre etmek artık her zamankinden daha erişilebilir. Bu makalede, dijital olarak PDF imzalama süreci hakkında size rehberlik edeceğiz, kütüphaneleri karşılaştıracağız, en iyi uygulamaları sunacağız ve bir sonraki projeniz için doğru çözümü seçmenize yardımcı olacağız.

Dijital İmzaları Anlamak

Dijital imza, dijital bir mesaj veya belgenin özgünlüğünü ve bütünlüğünü doğrulamak için kullanılan bir kriptografik tekniktir. Basit bir resim tabanlı imza veya yazılı bir isimden farklı olarak, dijital bir imza, belgenin bir hash'ini şifrelemek için özel bir anahtar kullanır. Bu şifrelenmiş hash, imzalayanın genel anahtarını kullanarak herkes tarafından doğrulanabilir.

Bu neden önemlidir? Çünkü iki şeyi garanti eder:

  1. Kimlik Doğrulama – İmza, belirtilen göndericiden gelen PDF belgelerini doğrular.

  2. Bütünlük – Belge, imzalandığından beri değiştirilmemiştir. Küçük bir değişiklik bile imzayı geçersiz kılar.

Dijital imzalar birçok hukuk sisteminde yasal bağlayıcıdır ve finans, sağlık, hukuk ve hükümet gibi sektörlerde yaşamsal öneme sahiptir.

Neden PDF'lerde Dijital İmzalar Kullanılmalı?

PDF'ler, yasal sözleşmelerden resmi raporlara kadar profesyonel belgeleri dağıtmak için standart formattır. PDF'lere dijital imzalar eklemek, birkaç kritik amaç hizmet eder:

  • Yasallık & Uyumluluk: Dijital imzalar, eIDAS (Avrupa), ESIGN (ABD) gibi düzenlemelere uyumludur ve yasal olarak tanınır.

  • Güvenlik: İmzalanmış belgeler, imzayı bozmadan değiştirilemez, müdahaleye veya sahteciliğe karşı koruma sağlar.

  • Verimlilik: Baskı, imzalama ve tarama gereksinimi yok. Güvenli dijital onaylarla zaman kazanın ve iş akışlarını basitleştirin.

  • Güven: Müşteriler ve ortaklar, belgelerin kaynağını ve bütünlüğünü güvenle doğrulayabilir.

Özetle, dijital imzalar, belge iş akışlarınıza güven ve verimlilik getirir.

iTextSharp ve IronPDF Karşılaştırması

C#'ta dijital imzaları uygularken, iki kütüphane genelde öne çıkar: iTextSharp ve IronPDF. Her ikisi de yetenekli araçlardır, ancak farklı türlerdeki geliştiriciler ve proje gereksinimlerine hitap ederler. Gerçek dünyadaki kullanımlarında nasıl karşılaştırıldıklarına bir bakalım.

iTextSharp: Karmaşıklıkla Gelen Güç

iTextSharp, PDF manipülasyonu dünyasında iyi bilinen bir isimdir. Daha geniş iText 7 ekosisteminin bir parçasıdır ve kriptografik dijital imzalama dahil düşük seviyeli PDF işlemleri için kapsamlı destek sunar.

İmza görünümü, hash algoritmaları, sertifika zincirleri ve özel doğrulama iş akışları üzerinde ince kontrol gerektiren geliştiriciler iTextSharp'ı çok yetenekli bulacaklardır. Oldukça genişleyebilir ve karmaşık kurumsal ihtiyaçlar için tasarlanmıştır.

Ancak, bu esneklik bir maliyetle gelir. Öğrenme eğrisi dik. Görünür bir imza eklemek gibi basit görevler genellikle birden fazla sınıf, akış ve yapılandırma adımı gerektirir. Yeni kullanıcılar için bu bunaltıcı olabilir.

Ayrıca, iTextSharp, AGPL lisansı altındadır ve uygulamanızın açık kaynaklı olmasını gerektirir, aksi takdirde ticari bir lisans satın almalısınız—birçok kapalı kaynak veya özel proje için bir engeldir.

IronPDF: Basitlik Profesyonellikle Buluşuyor

IronPDF ise modern, geliştirici öncelikli bir yaklaşım benimser. API'si, dijital imzalar, oluşturma, birleştirme ve düzenleme gibi yaygın PDF görevleri için minimal kurulumla tasarlanmıştır ve .NET çerçevesi projeleri için güçlü bir PDF kütüphanesi oluşturur.

Örneğin, IronPDF'de bir PDF imzalamak, doğrudan akışlarla veya kriptografik ayarlarla çalışmayı gerektirmez. Sadece PDF'yi yükleyin, SignPdf() çağırın ve sertifikanızı ekleyin. İmzalayanın konumu, nedeni ve iletişim bilgileri gibi ekstra meta verileri bile destekler — hepsi tek bir metot çağrısı içinde.

Diğer önemli bir fayda lisanslamadır. IronPDF, profesyonel ve kurumsal sınıf uygulamalar için ideal olan, AGPL kısıtlamaları olmadan ticaret dostu bir lisans sunar. Ve ücretli bir ürün olmasına rağmen, cömert bir ücretsiz deneme, taahhütte bulunmadan önce değerlendirmeyi kolaylaştırır.

Yan Yana Özet

Özellik iTextSharp IronPDF
Kullanım Kolaylığı Dik öğrenme eğrisi Başlangıç dostu, minimal kod
Lisans AGPL (veya ticari lisans) Açık kaynak zorunluluğu olmayan ticari lisans
İmza Özelleştirme Kriptografi kontrolü ile oldukça özelleştirilebilir Opsiyonel meta veri alanlarıyla basitleştirilmiş API
Dokümantasyon Detaylı, ancak yoğun Geliştirici odaklı belgelerle açık örnekler
En İyi Uygulama Derin özelleştirme gerektiren kurumsal uygulamalar Hızlı uygulama ve destek arayan ekipler

iTextSharp ve IronPDF ile Başlamak

Dijital imza uygulamalarına dalmadan önce, her kütüphane ile nasıl başlamanız gerektiğini anlamak çok önemli. İster kurumsal düzeyde bir çözüm ister hızlı bir dahili araç inşa ediyor olun, doğru kurulum tüm farkı yaratabilir.

iTextSharp Kurulumu

iTextSharp, güçlü Java tabanlı iText PDF kütüphanesinin .NET sürümüdür. Başlamak için, NuGet aracılığıyla yüklemeniz ve projenizde doğru ad alanlarını referans almanız gerekir.

Kurulum

iTextSharp kütüphanesini projenize kolayca NuGet Paket Yöneticisi konsolu aracılığıyla yükleyebilirsiniz. Tek yapmanız gereken şu komutu çalıştırmaktır:

Install-Package iTextSharp

iTextSharp Yükleme

Bu kolay kurulum, C# projeniz içinde bu kütüphanenin hızlı bir şekilde uygulanmasını sağlar.

Temel Kurulum

Yüklendikten sonra, iTextSharp ad alanlarını projenizde kullanmaya başlayabilirsiniz:

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
Imports iTextSharp.text.pdf
Imports iTextSharp.text.pdf.security
$vbLabelText   $csharpLabel

iTextSharp'ın modüler olduğunu unutmayın. Gelişmiş kriptografik özellikleri veya zaman damgalamayı kullanmayı planlıyorsanız, muhtemelen BouncyCastle.Cryptography gibi ek paketlere ihtiyaç duyabilirsiniz. Bu, iTextSharp gibi benzer şekilde yüklenebilir, sadece satırı çalıştırın:

Install-Package BouncyCastle.Cryptography

Dikkat Edilmesi Gerekenler

  • Lisanslama: AGPL lisansı, iTextSharp kullanan herhangi bir yazılımın açık kaynak olmasını gerektirir, aksi halde ticari bir lisans satın almalısınız.

  • Bağımlılıklar: Kriptografik işlemler genellikle sertifika işlemleri için BouncyCastle gerektirir.

  • Öğrenme Eğrisi: Temel imzalama bile PdfSigner, IExternalSignature ve çeşitli kriptografik sağlayıcıları anlamayı gerektirir.

Bu yapı taşlarını yapılandırmada rahatsanız ve imzalama süreci üzerinde tam kontrol ihtiyaçı duyuyorsanız (örn. görünümü ayarlamak, doğrulama seviyesi veya zaman damgalama sunucuları), iTextSharp sağlam bir seçenektir.

IronPDF Kurulumu

IronPDF, geliştirici verimliliği göz önünde bulundurularak oluşturulmuş ticari bir PDF kütüphanesidir. Minimal zahmetle PDF oluşturmak, düzenlemek ve imzalamak isteyen .NET geliştiriciler için tasarlanmıştır. IronPDF, temiz API'ler ve hızlı sonuçları değer verenler için çok daha sorunsuz bir başlangıç deneyimi sunar.

Kurulum

NuGet aracılığıyla en son IronPDF paketini yükleyin:

Install-Package IronPdf

NuGet konsolu üzerinden IronPDF yükleme

Ya da .NET CLI kullanın:

Install-Package IronPdf

Temel Kurulum

Ana IronPDF ad alanını ithal ederek başlayın:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

Hepsi bu—bir PDF yüklemeye ve dijital imzalar eklemeye hazırsınız.

IronPDF her şeyi dahili olarak yönetir: sertifika yükleme, görünür imza konumlandırma, meta veriler ve nihai dışa aktarma. PDF akışlarını veya kriptografik algoritmaları manuel olarak yönetmek zorunda değilsiniz, bu da hızlı geliştirme için büyük bir avantajdır.

Yeni Başlayanlar İçin Temel Avantajlar

  • Tümü Bir Arada: Ekstra bağımlılıklar veya kriptografi kütüphaneleri gerekmez.

  • AGPL endişesi yok: IronPDF süresiz lisans ve cömert bir ücretsiz deneme sunar.

  • Görsel İşleme: IronPDF, PDF'leri basıldıklarında nasıl görüneceklerse öyle işler, bu da onu sözleşmeler ve resmi belgeler için ideal hale getirir.

Adım Adım: Dijital İmza Ekleme

1. Sertifikanızı Hazırlayın

.pfx dijital sertifika dosyası ve bir şifre gerekli olacaktır. Bunlar dijital imza oluşturmak için kullanılır. Bir sertifikayı güvenilir bir Sertifika Otoritesi'nden (CA) alabilir veya dahili kullanım için OpenSSL gibi araçlar kullanarak üretebilirsiniz.

2. iTextSharp ve BouncyCastle ile PDF İmzalama

Gerekli ad alanlarını dahil edin

İlk olarak, iTextSharp ile bir PDF'yi dijital olarak imzalamak için gerekli olan çeşitli sınıf ve yöntemlere erişmek için doğru using ifadelerine sahip olduğumuzdan emin olmamız gerekir.

using System;
using System.IO;
using System.Linq;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using System;
using System.IO;
using System.Linq;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
Imports System
Imports System.IO
Imports System.Linq
Imports iTextSharp.text.pdf
Imports iTextSharp.text.pdf.security
Imports Org.BouncyCastle.Crypto
Imports Org.BouncyCastle.Pkcs
$vbLabelText   $csharpLabel

Giriş PDF'sini Tanımlayın ve PdfReader'a Yükleyin

Ardından mevcut PDF'nin yolunu belirtir ve PdfReader'a yükleriz. Ayrıca kodda daha sonra kullanılacak bazı dize değişkenlerini atayacağız.

// Path to the unsigned PDF you want to sign
string filename = "example.pdf";

// Load the existing PDF into a reader
PdfReader pdfReader = new PdfReader(filename);

string reason = "Digital Signature Reason";
string location = "Digital Signature Location";
// Path to the unsigned PDF you want to sign
string filename = "example.pdf";

// Load the existing PDF into a reader
PdfReader pdfReader = new PdfReader(filename);

string reason = "Digital Signature Reason";
string location = "Digital Signature Location";
' Path to the unsigned PDF you want to sign
Dim filename As String = "example.pdf"

' Load the existing PDF into a reader
Dim pdfReader As New PdfReader(filename)

Dim reason As String = "Digital Signature Reason"
Dim location As String = "Digital Signature Location"
$vbLabelText   $csharpLabel

Sertifika Yolu ve Şifresini Tanımlayın

Sonra, .pfx sertifika dosyasına işaret eder ve onu korumak için kullanılan şifreyi sağlarız.

// Path to your .pfx certificate file (must contain private key)
string pfxFilePath = "certificate-file.pfx";

// Password for the certificate (make sure to protect this securely!)
string pfxPassword = "Password";
// Path to your .pfx certificate file (must contain private key)
string pfxFilePath = "certificate-file.pfx";

// Password for the certificate (make sure to protect this securely!)
string pfxPassword = "Password";
' Path to your .pfx certificate file (must contain private key)
Dim pfxFilePath As String = "certificate-file.pfx"

' Password for the certificate (make sure to protect this securely!)
Dim pfxPassword As String = "Password"
$vbLabelText   $csharpLabel

Pkcs12Store Kullanarak .PFX Sertifikasını Yükleyin

BouncyCastle'ı kullanarak sertifikayı ve özel anahtarı güvenli bir depoya yüklüyoruz.

// Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Pkcs12StoreBuilder pkcs12StoreBuilder = new Pkcs12StoreBuilder();
Pkcs12Store pfxKeyStore = pkcs12StoreBuilder.Build();

// Load the certificate and private key from the PFX file
using (FileStream pfxStream = new FileStream(pfxFilePath, FileMode.Open, FileAccess.Read))
{
    // Load into the key store using the provided password
    pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray());
}
// Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Pkcs12StoreBuilder pkcs12StoreBuilder = new Pkcs12StoreBuilder();
Pkcs12Store pfxKeyStore = pkcs12StoreBuilder.Build();

// Load the certificate and private key from the PFX file
using (FileStream pfxStream = new FileStream(pfxFilePath, FileMode.Open, FileAccess.Read))
{
    // Load into the key store using the provided password
    pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray());
}
' Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Dim pkcs12StoreBuilder As New Pkcs12StoreBuilder()
Dim pfxKeyStore As Pkcs12Store = pkcs12StoreBuilder.Build()

' Load the certificate and private key from the PFX file
Using pfxStream As New FileStream(pfxFilePath, FileMode.Open, FileAccess.Read)
	' Load into the key store using the provided password
	pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray())
End Using
$vbLabelText   $csharpLabel

Bir İmza Eklemek İçin PdfStamper Hazırlayın

PdfStamper, orijinal içeriği korurken dijital bir imza uygulamamıza olanak tanır.

// Create a PdfStamper that enables signing and appends the signature to the document
PdfStamper pdfStamper = PdfStamper.CreateSignature(
    pdfReader,
    new FileStream("MyPDF_Signed.pdf", FileMode.Create), // Output path
    '\0',                                                // PDF version (unchanged)
    null,                                                // Temp file path (optional)
    true                                                 // Append mode (preserves original content)
);
// Create a PdfStamper that enables signing and appends the signature to the document
PdfStamper pdfStamper = PdfStamper.CreateSignature(
    pdfReader,
    new FileStream("MyPDF_Signed.pdf", FileMode.Create), // Output path
    '\0',                                                // PDF version (unchanged)
    null,                                                // Temp file path (optional)
    true                                                 // Append mode (preserves original content)
);
Imports Microsoft.VisualBasic

' Create a PdfStamper that enables signing and appends the signature to the document
Dim pdfStamper As PdfStamper = PdfStamper.CreateSignature(pdfReader, New FileStream("MyPDF_Signed.pdf", FileMode.Create), ControlChars.NullChar, Nothing, True)
$vbLabelText   $csharpLabel

İmza Görünümünü Özelleştirin

Şimdi belgede imzanın görsel olarak nasıl ve nerede görüneceğini tanımlarız.

// Access the signature appearance settings
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

// Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason;
signatureAppearance.Location = location;

// Position the visible signature on the page (x, y, width, height in points)
float x = 360;
float y = 130;
signatureAppearance.Acro6Layers = false;              // Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark; // Custom label text
signatureAppearance.SetVisibleSignature(
    new iTextSharp.text.Rectangle(x, y, x + 150, y + 50), // Rectangle position
    1,                                                    // Page number
    "signature"                                           // Field name
);
// Access the signature appearance settings
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

// Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason;
signatureAppearance.Location = location;

// Position the visible signature on the page (x, y, width, height in points)
float x = 360;
float y = 130;
signatureAppearance.Acro6Layers = false;              // Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark; // Custom label text
signatureAppearance.SetVisibleSignature(
    new iTextSharp.text.Rectangle(x, y, x + 150, y + 50), // Rectangle position
    1,                                                    // Page number
    "signature"                                           // Field name
);
' Access the signature appearance settings
Dim signatureAppearance As PdfSignatureAppearance = pdfStamper.SignatureAppearance

' Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason
signatureAppearance.Location = location

' Position the visible signature on the page (x, y, width, height in points)
Dim x As Single = 360
Dim y As Single = 130
signatureAppearance.Acro6Layers = False ' Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark ' Custom label text
signatureAppearance.SetVisibleSignature(New iTextSharp.text.Rectangle(x, y, x + 150, y + 50), 1, "signature")
$vbLabelText   $csharpLabel

Özel Anahtarı Çıkarın ve PDF'yi İmzalayın

Özel anahtarı içeren sertifika kaydının takma adını (adını) alırız. Takma ad varsa, SHA-256 kullanarak dijital imza oluşturmaya ve yerleştirmeye devam ederiz.

// Find the first alias in the PFX that has a private key entry
string alias = pfxKeyStore.Aliases.Cast<string>().FirstOrDefault(
    entryAlias => pfxKeyStore.IsKeyEntry(entryAlias)
);

// Ensure a valid alias (certificate) was found
if (alias != null)
{
    // Retrieve the private key for signing
    ICipherParameters privateKey = pfxKeyStore.GetKey(alias).Key;

    // Create a signer using SHA-256 and the private key
    IExternalSignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256);

    // Perform the digital signing operation using CMS format
    MakeSignature.SignDetached(
        signatureAppearance,     // Signature appearance
        pks,                     // External signature handler
        new Org.BouncyCastle.X509.X509Certificate[] {
            pfxKeyStore.GetCertificate(alias).Certificate
        },                       // Certificate chain (basic single-cert example)
        null, null, null,        // Optional CRL, OCSP, TSA
        0,                       // Estimated size for the signature (0 = auto)
        CryptoStandard.CMS       // Signature standard (CMS vs CAdES)
    );
}
else
{
    Console.WriteLine("Private key not found in the PFX certificate.");
}
// Find the first alias in the PFX that has a private key entry
string alias = pfxKeyStore.Aliases.Cast<string>().FirstOrDefault(
    entryAlias => pfxKeyStore.IsKeyEntry(entryAlias)
);

// Ensure a valid alias (certificate) was found
if (alias != null)
{
    // Retrieve the private key for signing
    ICipherParameters privateKey = pfxKeyStore.GetKey(alias).Key;

    // Create a signer using SHA-256 and the private key
    IExternalSignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256);

    // Perform the digital signing operation using CMS format
    MakeSignature.SignDetached(
        signatureAppearance,     // Signature appearance
        pks,                     // External signature handler
        new Org.BouncyCastle.X509.X509Certificate[] {
            pfxKeyStore.GetCertificate(alias).Certificate
        },                       // Certificate chain (basic single-cert example)
        null, null, null,        // Optional CRL, OCSP, TSA
        0,                       // Estimated size for the signature (0 = auto)
        CryptoStandard.CMS       // Signature standard (CMS vs CAdES)
    );
}
else
{
    Console.WriteLine("Private key not found in the PFX certificate.");
}
' Find the first alias in the PFX that has a private key entry
Dim [alias] As String = pfxKeyStore.Aliases.Cast(Of String)().FirstOrDefault(Function(entryAlias) pfxKeyStore.IsKeyEntry(entryAlias))

' Ensure a valid alias (certificate) was found
If [alias] IsNot Nothing Then
	' Retrieve the private key for signing
	Dim privateKey As ICipherParameters = pfxKeyStore.GetKey([alias]).Key

	' Create a signer using SHA-256 and the private key
	Dim pks As IExternalSignature = New PrivateKeySignature(privateKey, DigestAlgorithms.SHA256)

	' Perform the digital signing operation using CMS format
	MakeSignature.SignDetached(signatureAppearance, pks, New Org.BouncyCastle.X509.X509Certificate() { pfxKeyStore.GetCertificate([alias]).Certificate }, Nothing, Nothing, Nothing, 0, CryptoStandard.CMS)
Else
	Console.WriteLine("Private key not found in the PFX certificate.")
End If
$vbLabelText   $csharpLabel

Belgeyi Tamamlayın

Son olarak, imzalama işlemini tamamlamak ve imzalı PDF'yi diske yazmak için stamper'ı kapatırız.

// Close the stamper to save and finalize the signed PDF
pdfStamper.Close();
// Close the stamper to save and finalize the signed PDF
pdfStamper.Close();
' Close the stamper to save and finalize the signed PDF
pdfStamper.Close()
$vbLabelText   $csharpLabel

Çıktı

iTextSharp kullanılarak imzalanmış PDF

Bootstrap Güvenlik Yapılandırma Formu

Profesyonel PDF güvenliği sezgisel yapılandırma arayüzleri gerektirir. Bu Bootstrap 5 örneği, IronPDF'in doğrulama durumları ve ilerleme izleme ile çok aşamalı güvenlik yapılandırma formlarını işleme yeteneğini gösterir.

using IronPdf;

var renderer = new ChromePdfRenderer();

string securityConfigForm = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(securityConfigForm);
pdf.SaveAs("security-configuration.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string securityConfigForm = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(securityConfigForm);
pdf.SaveAs("security-configuration.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim securityConfigForm As String = "
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(securityConfigForm)
pdf.SaveAs("security-configuration.pdf")
$vbLabelText   $csharpLabel

Çıktı: Bootstrap 5 adım göstergeleri, form kontrolleri, anahtarlar ve doğrulama uyarıları içeren profesyonel bir güvenlik yapılandırma formu PDF'si. IronPDF, iTextSharp'ın programatik yaklaşımına kıyasla üstün form işleme yeteneklerini göstererek mükemmel bir şekilde tüm form stillendirmelerini, yardımcı sınıfları ve etkileşimli öğeleri işler.

Bootstrap form desteği hakkında daha fazla bilgi için Bootstrap & Flexbox CSS Kılavuzu'na bakın.

3. IronPDF Kullanarak C# ile PDF'leri Dijital İmzalama

Gerekli ad alanlarını dahil edin

PDF imzalama, sertifika işleme ve resim konumlandırma ile çalışmak için gerekli olan ad alanlarını içeri aktarmaya başlıyoruz.

using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.Security.Cryptography.X509Certificates;
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.Security.Cryptography.X509Certificates;
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports System.Security.Cryptography.X509Certificates
$vbLabelText   $csharpLabel

İmzalamak istediğiniz PDF'yi yükleyin

IronPDF'in basit PdfDocument API'sini kullanarak diskteki mevcut bir PDF dosyasını yüklüyoruz. Bu görev için yeni bir PDF belgesi de oluşturabilirsiniz.

var pdf = PdfDocument.FromFile("example.pdf");
var pdf = PdfDocument.FromFile("example.pdf");
Dim pdf = PdfDocument.FromFile("example.pdf")
$vbLabelText   $csharpLabel

İmzalamada kullanılan PFX Sertifikasını Yükleyin

Özel anahtarı içeren .pfx sertifikasını yüklüyoruz. İmzalama anahtarına erişilebilmesi için İhraç Edilebilir bayrak gereklidir.

X509Certificate2 cert = new X509Certificate2(
    "IronSoftware.pfx",
    "Password",
    X509KeyStorageFlags.Exportable
);
X509Certificate2 cert = new X509Certificate2(
    "IronSoftware.pfx",
    "Password",
    X509KeyStorageFlags.Exportable
);
Dim cert As New X509Certificate2("IronSoftware.pfx", "Password", X509KeyStorageFlags.Exportable)
$vbLabelText   $csharpLabel

Sertifikayı kullanarak yeni bir PdfSignature oluşturun

Yüklenen sertifikadan yeni bir PdfSignature nesnesi oluşturuyoruz.

var sig = new PdfSignature(cert);
var sig = new PdfSignature(cert);
Dim sig = New PdfSignature(cert)
$vbLabelText   $csharpLabel

İmzayı uygulayın ve çıktıyı kaydedin

PDF'yi dijital olarak imzalıyoruz ve imzalı PDF belgesini yeni bir dosya olarak kaydediyoruz.

pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig)
pdf.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

Çıktı

IronPDF kullanılarak imzalanmış PDF

4. Kod Açıklaması

  • IronPDF imzalama sürecini basit ve okunabilir tutar. Bir PDF yüklersiniz, bir sertifika sağlarsınız ve SignPdf() çağırırsınız. İsteğe bağlı meta veriler (iletişim, konum, neden) profesyonellik katar.

  • iTextSharp daha fazla kontrol sağlar ancak karma algoritmaları, akışları ve sertifika zincirleri ile ayrıntılı kurulum gerektirir.

Özet: Sadece birkaç satır kodla, IronPDF standart .pfx sertifikalarını kullanarak dijital imzaları uygulamayı inanılmaz derecede kolaylaştırır—düşük seviyeli kriptografi gerekmez. Bu, aynı görev için gerekli olan daha uzun kodu gerektiren iTextSharp gibi kütüphanelerle karşılaştırıldığında uygulamayı daha kolay hale getirir.

5. Gerçek Hayat Kullanım Durumları

  • Hukuk Ekipleri: Şablonlardan oluşturulan sözleşmeleri otomatik olarak imzalayın.

  • Finans: Faturaları ve raporları dijital olarak imzalayarak sahteciliği önleyin.

  • Devlet Portalları: Düzenleyici standartlara uygunluk sağlamak için gönderim öncesi formları imzalayın.

Dijital İmzalar İçin En İyi Uygulamalar

Dijital imzalama uygulamanızdan en iyi şekilde yararlanmak için:

  • Güçlü Sertifikalar Kullanın: 2048 bit RSA anahtarları veya daha güçlü olanları seçin.

  • Özel Anahtarları Güvende Tutun: Sertifikaları güvenli bir şekilde saklayın, ideal olarak bir donanım güvenlik modülü (HSM) içinde.

  • İmzalarınızı Tarih Damgası ile Damgalayın: İmzanın geçerliliğini sertifika süresi dolduktan sonra bile korumasını sağlamak için güvenilir bir tarih damgası ekleyin.

  • İmzaları Doğrulayın: Uygulamanızda sahtecilik veya süresi dolmuş sertifikaları tespit etmek için doğrulama dahil edin.

  • Otomatizasyon: Belge bütünlüğünü sürekli sağlamak için dağıtım hattınızda imzalama işlemlerini planlayın.

Sonuç

PDF belgelerine dijital imzalar eklemek artık bir lüks değil — günümüzün güvenlik bilincine sahip dijital dünyasında bir gerekliliktir. İster sözleşmeleri, faturaları, raporları ister yasal belgeleri koruyor olun, güvenilir bir sertifika ile desteklenen değişikliklere karşı duyarlı bir imza, dosyalarınızın otantikliğini ve bütünlüğünü korumanızı sağlar.

Bu makalede, C#'ta PDF imzalamaya ilişkin iki güçlü yaklaşımı keşfettik:

  • iTextSharp, düşük seviyeli kriptografik kontrol ve esneklik sağlayan ancak BouncyCastle ile daha fazla kod şablonu ve aşinalık gerektiren.

  • IronPDF, güvenli imzaların uygulanması sürecini pürüzsüz ve geliştirici dostu hale getiren modern, yüksek seviye bir API sunar.

Her iki araç da güvenli .pfx sertifikalarını destekler ancak IronPDF iş akışını açıkça basitleştirir — kriptografik köklerle daha az zaman harcamak ve daha fazla iş değeri sunmak isteyen .NET geliştiricileri için idealdir.

iTextSharp ve IronPDF karşılaştırma tablosu

Sonraki Adımlar

Henüz yapmadıysanız, IronPDF'un ücretsiz deneme sürümünü indirmeyi düşünün ve kendi PDF'lerinizi sadece birkaç satır kodla imzalamayı deneyin. Özellikle zamanın önemli olduğu projelerde çalışırken, sadece üretkenlik kazançları bile değişimi değerli kılıyor.

Lütfen dikkate aliniTextSharp, ilgili sahibine ait tescilli bir marka. Bu site, iTextSharp ile ilişkili, onaylanmış veya desteklenmiş değildir. Tüm ürün adları, logolar ve markalar ilgili sahiplerine aittir. Karşılaştırmalar yalnızca bilgilendirme amaçlıdır ve yazım sırasında kamuya açık bilgileri yansıtır.

Sıkça Sorulan Sorular

Dijital imzalar bir PDF belgesinin doğrulugunu nasıl teminat altina alir?

Dijital imzalar, imzalayanin kimligini doğrulamak ve belgenin değiştirilmediğinden emin olmak için kriptografik teknikler kullanir. Bu, belgenin özel bir anahtarla şifrelenmis bir karmasini saglayarak hem kimlik doğrulama hem de bütünlük sağlar.

Dijital imzalar elektronik belgeler için neden önemlidir?

Dijital imzalar, elektronik belgelerde yasalığı, güvenlik, verimliligi ve güveni saglamak için kritik öneme sahiptir. Düzenlemelere uyumu saglar, değişiklikleri onler, belge işlem akislarini hızlandırır ve belgenin kaynağını ve bütünlüğünü doğrular.

C#'da bir PDF'ye dijital imza nasıl eklenir?

C#'da, IronPDF kullanarak bir PDF'ye dijital imza ekleyebilirsiniz. Süreç, PDF'yi yüklemeyi, bir .pfx sertifikasi saglamayi X509Certificate2 kullanarak ve imzayi uygulamak için Sign metodunu çağırmayı icerir.

Dijital imzalar için iTextSharp ve baska bir PDF kütüphanesi arasindaki temel farklar nelerdir?

iTextSharp, detaylı PDF işlemeleri için geniş destek sunar ancak dik bir öğrenme egisi ve özel bir lisans gerektirir. IronPDF ise karsilastirmali olarak başlangıç dostu ve basitlestirilmis bir API ile hızlı uygulamaya izin verir ve acık kaynak lisansları gerektirmez.

C#'da belgelerin imzalanması için bir PDF kutuhanesi nasıl yüklenir?

NuGet kullanarak Install-Package IronPdf komutuyla ya da .NET CLI kullanarak dotnet add package IronPdf ile IronPDF'yi yükleyebilirsiniz.

iTextSharp kullanarak bir PDF'yi dijital olarak imzalamak için hangi adımlar gereklidir?

iTextSharp kullanarak bir PDF'yi dijital olarak imzalamak için, PdfStamper yapılandırmalı, imza gorunumunu özellestirmeli, BouncyCastle kullanarak bir .pfx sertifikasi yükleyip ve kriptografik operasyonlar için PdfSigner ve IExternalSignature kullanmalısınız.

PDF'lerde dijital imzaları uygulamak için en iyi uygulamalar nelerdir?

En iyi uygulamalar güçlü sertifikalar kullanmayı, özel anahtarları guven altına almayı, imzalara zaman damgası eklemeyi, imzaları düzenli olarak doğrulamayı ve imzalama süreçini otomatikleştirerek belgenin butunlugunu saglamayı icerir.

PDF belgelerinde dijital imzaların gerçek dunya uygulamaları nelerdir?

Dijital imzalar, hukuk departmanlarında sözleşmelerin imzalanmasında, finans sektorunde faturaların ve raporların onaylanmasında ve devlet ajanslarında düzenleyici standartlarla uyumu saglamak için formların işlenmesinde yaygin olarak kullanilur.

Hızlı dijital imza uygulamasina ihtiyaçı olan geliştiriciler için hangi PDF kütüphanesi daha iyidir?

Dijital imzalarin hızlı bir şekilde uygulanmasını isteyen geliştiriciler için IronPDF, imzalama sürecini basitleştiren ve minimum kod gerektiren bir API sunarak önerilir.

IronPDF, .NET 10 ile dijital imza ekleme ve doğrulama için uyumlu mu?

Evet - IronPDF tamamen .NET 10 ile uyumludur. Hem .NET 10 (NET 9, 8, 7 vs. ile birlikte) destekler ve onun dijital imza özellikleri (örn. PdfSignature, X509Certificate2, imzalama ve doğrulama) .NET 10 çalışma zamanında chalistir.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında lisans derecesine sahiptir (Carleton Üniversitesi) ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirme üzerine uzmanlaşmıştır. Kullanıcı dostu ve estetik açıdan hoş arayüzler tasarlamaya tutkuyla bağlı olan Curtis, modern çerç...

Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara