~~NOTOC~~ ====== Scenario 12.2: PFX/PKCS#12 Export ====== **Categoria:** [[.:start|Import/Export]] \\ **Complessita:** ⭐⭐⭐ (Media) \\ **Prerequisiti:** Certificato con Private Key \\ **Tempo stimato:** 15-20 minuti ---- ===== Descrizione ===== Questo scenario descrive l'**export e import in formato PFX/PKCS#12**. PFX (Personal Information Exchange) e il formato standard per Windows e .NET per memorizzare certificati insieme a chiavi private e opzionalmente la catena di certificati in un file protetto da password. **Caratteristiche PFX/PKCS#12:** * **Contenuto:** Certificato + Private Key + Chain * **Encoding:** Binary (ASN.1/DER) * **Crittografia:** Protetto da password * **Estensioni:** .pfx, .p12 ---- ===== Code-Esempio: Creare PFX ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Security.Cryptography.X509Certificates; using var ctx = PqCryptoContext.Initialize(); // Caricare certificato e chiave var cert = ctx.LoadCertificate("server.crt.pem"); var privateKey = ctx.LoadPrivateKey("server.key.pem", "KeyPassword!"); // Combinare certificato con chiave var certWithKey = ctx.CombineCertificateAndKey(cert, privateKey); // Esportare PFX byte[] pfxBytes = certWithKey.Export(X509ContentType.Pfx, "PfxPassword123!"); File.WriteAllBytes("server.pfx", pfxBytes); Console.WriteLine("PFX creato: server.pfx"); ---- ===== Code-Esempio: PFX con Chain ===== public class PfxExporter { public byte[] ExportWithChain( X509Certificate2 certificate, X509Certificate2Collection chain, string password, PfxExportOptions options = null) { options ??= PfxExportOptions.Default; using var ctx = PqCryptoContext.Initialize(); // Creare collection per export var exportCollection = new X509Certificate2Collection(); exportCollection.Add(certificate); // Aggiungere chain (senza Root, se desiderato) foreach (var caCert in chain) { if (options.IncludeRoot || !IsSelfSigned(caCert)) { exportCollection.Add(caCert); } } // Esportare PFX var pfxBytes = exportCollection.Export(X509ContentType.Pfx, password); Console.WriteLine($"PFX creato con {exportCollection.Count} certificati"); return pfxBytes; } private bool IsSelfSigned(X509Certificate2 cert) { return cert.Subject == cert.Issuer; } } ---- ===== Code-Esempio: Importare PFX ===== using var ctx = PqCryptoContext.Initialize(); // Caricare PFX var pfxBytes = File.ReadAllBytes("server.pfx"); var cert = new X509Certificate2( pfxBytes, "PfxPassword123!", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet ); Console.WriteLine($"Subject: {cert.Subject}"); Console.WriteLine($"Ha Private Key: {cert.HasPrivateKey}"); // Estrarre Private Key if (cert.HasPrivateKey) { var privateKey = cert.GetRSAPrivateKey() ?? cert.GetECDsaPrivateKey() ?? (AsymmetricAlgorithm)ctx.GetPqPrivateKey(cert); Console.WriteLine($"Tipo chiave: {privateKey.GetType().Name}"); } // Estrarre chain da PFX var collection = new X509Certificate2Collection(); collection.Import(pfxBytes, "PfxPassword123!", X509KeyStorageFlags.DefaultKeySet); Console.WriteLine($"Certificati in PFX: {collection.Count}"); foreach (var c in collection) { Console.WriteLine($" - {c.Subject}"); } ---- ===== PFX con OpenSSL ===== # Creare PFX da file PEM openssl pkcs12 -export \ -out server.pfx \ -inkey server.key \ -in server.crt \ -certfile chain.pem \ -passout pass:MyPassword # PFX con algoritmo moderno (AES-256) openssl pkcs12 -export \ -out server.pfx \ -inkey server.key \ -in server.crt \ -certfile chain.pem \ -aes256 \ -passout pass:MyPassword # Ispezionare PFX openssl pkcs12 -info -in server.pfx -passin pass:MyPassword # Estrarre PFX openssl pkcs12 -in server.pfx \ -out combined.pem \ -nodes \ -passin pass:MyPassword ---- ===== Requisiti PFX specifici per settore ===== ^ Settore ^ Key Storage ^ Export ^ Particolarita ^ | **Windows Server** | MachineKeySet | Exportable | IIS SSL-Binding | | **Azure** | UserKeySet | Non-Exportable | App Service | | **Code Signing** | MachineKeySet | Non-Exportable | Authenticode | | **Smart Card** | Hardware | Non-Exportable | Certificati PIV | ---- ===== Scenari correlati ===== ^ Relazione ^ Scenario ^ Descrizione ^ | **Alternativo** | [[.:pem_export|12.1 PEM Export]] | Formato Linux | | **Correlato** | [[.:pkcs7_chain|12.3 PKCS#7 Chain]] | Solo certificati | | **Prerequisito** | [[it:int:pqcrypt:szenarien:zertifikate:server_cert|3.1 Certificato server]] | Creare certificato | ---- << [[.:pem_export|← 12.1 PEM Export]] | [[.:start|↑ Import/Export]] | [[.:pkcs7_chain|12.3 PKCS#7 Chain →]] >> {{tag>scenario import export pfx pkcs12 windows}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//