X509Certificate2 กับ .NET 6 Console

ดูข้อมูลของ certificate

using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Xml;

namespace ConsoleApp6;

class Program
{
    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

    static void Main()
    {
        try
        {
            XmlDocument log4netConfig = new XmlDocument();
            log4netConfig.Load(File.OpenRead("log4net.config"));
            var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
                       typeof(log4net.Repository.Hierarchy.Hierarchy));
            log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

            log.Info("Hello World!");

            //Create X509Certificate2 object from .p12 file.
            X509Certificate2 x509 = new X509Certificate2(@"C:\file.p12", "password",
                X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);

            //Create X509Certificate2 object from .cer file.
            //byte[] rawData = ReadFile(args[0]);
            //x509.Import(rawData);

            //Log information contained in the certificate.
            log.Info(string.Format("Subject: {0}", x509.Subject));
            log.Info(string.Format("Issuer: {0}", x509.Issuer));
            log.Info(string.Format("Version: {0}", x509.Version));
            log.Info(string.Format("Valid Date: {0}", x509.NotBefore));
            log.Info(string.Format("Expiry Date: {0}", x509.NotAfter));
            log.Info(string.Format("Thumbprint: {0}", x509.Thumbprint));
            log.Info(string.Format("Serial Number: {0}", x509.SerialNumber));
            log.Info(string.Format("Friendly Name: {0}", x509.PublicKey.Oid.FriendlyName));
            log.Info(string.Format("Public Key Format: {0}", x509.PublicKey.EncodedKeyValue.Format(true)));
            log.Info(string.Format("Raw Data Length: {0}", x509.RawData.Length));
            log.Info(string.Format("Certificate to string: {0}", x509.ToString(true)));
            log.Info(string.Format("Certificate to XML String: {0}", x509.PublicKey.Key.ToXmlString(false)));

            ////Add the certificate to a X509Store.
            //X509Store store = new X509Store();
            //store.Open(OpenFlags.MaxAllowed);
            //store.Add(x509);
            //store.Close();
        }
        catch (Exception ex)
        {
            log.Error(ex.Message);
            log.Error(ex.ToString());
        }
    }
}

Stamp CA ลงไฟล์ PDF

ติดตั้ง Package

PM> Install-Package iTextSharp -Version 5.5.13.2
PM> Install-Package System.Windows.Extensions -Version 6.0.0
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using System.Reflection;
using System.Runtime.Versioning;
using System.Security.Cryptography.X509Certificates;
using System.Xml;

namespace ConsoleApp6;

[SupportedOSPlatform("windows")]
class Program
{
    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

    static void Main()
    {
        try
        {
            XmlDocument log4netConfig = new XmlDocument();
            log4netConfig.Load(File.OpenRead("log4net.config"));
            var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
                       typeof(log4net.Repository.Hierarchy.Hierarchy));
            log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

            log.Info("Hello World!");

            //Create X509Certificate2 object from .p12 file.
            X509Certificate2 x509 = new X509Certificate2(@"C:\file.p12", "password",
                X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);

            //Create X509Certificate2 object from .cer file.
            //byte[] rawData = ReadFile(args[0]);
            //x509.Import(rawData);

            //Add the certificate to a X509Store.
            X509Store store = new X509Store();
            store.Open(OpenFlags.MaxAllowed);
            store.Add(x509);


            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
            // X509Certificate2Collection sel = store.Certificates;

            X509Certificate2 cert = sel[0];

            Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] {
            cp.ReadCertificate(cert.RawData)};

            //IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");
            //IExternalSignature externalSignature = new X509Certificate2Signature(cert, DigestAlgorithms.SHA256);

            // var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(x509.PrivateKey).Private;
            var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(x509.GetRSAPrivateKey()).Private;
            IExternalSignature externalSignature = new PrivateKeySignature(pk, "SHA-256");

            string pathToBasePdf = @"c:\tmp\InputPDF.pdf";
            string pathToSignPdf = @"c:\tmp\OutputPDF.pdf";
            //string pathToSignatureImage = "";
            PdfReader pdfReader = new PdfReader(pathToBasePdf);

            var signedPdf = new FileStream(pathToSignPdf, FileMode.Create);

            PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0');
            PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

            // signatureAppearance.SignatureGraphic = Image.GetInstance(pathToSignatureImage);
            signatureAppearance.SetVisibleSignature(new Rectangle(100, 100, 250, 150), pdfReader.NumberOfPages, "Signature");
            //signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;
            signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;

            MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);

            store.Close();
        }
        catch (Exception ex)
        {
            log.Error(ex.Message);
            log.Error(ex.ToString());
        }
    }
}