Scenario 12.2: PFX/PKCS#12 Export

Categoria: 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 12.1 PEM Export Formato Linux
Correlato 12.3 PKCS#7 Chain Solo certificati
Prerequisito 3.1 Certificato server Creare certificato

« ← 12.1 PEM Export | ↑ Import/Export | 12.3 PKCS#7 Chain → »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: il 30/01/2026 alle 00:21