~~NOTOC~~ ====== Scenario 12.4: Interoperabilita ====== **Categoria:** [[.:start|Import/Export]] \\ **Complessita:** ⭐⭐⭐⭐ (Alta) \\ **Prerequisiti:** Vari sistemi/piattaforme \\ **Tempo stimato:** 30-45 minuti ---- ===== Descrizione ===== Questo scenario descrive l'**interoperabilita cross-platform** di certificati e chiavi. Con la crittografia PQ e necessaria particolare attenzione poiche non tutti i sistemi supportano ancora ML-DSA/ML-KEM. **Sfide di interoperabilita:** * **Differenze di formato** - PEM vs. DER vs. PFX * **Supporto algoritmi** - Classico vs. PQ vs. Ibrido * **Particolarita piattaforma** - Windows, Linux, macOS, Java * **Differenze di versione** - OpenSSL 1.x vs. 3.x ---- ===== Matrice di compatibilita ===== ^ Sistema ^ RSA ^ ECDSA ^ ML-DSA ^ ML-KEM ^ Ibrido ^ | **OpenSSL 3.6+** | ✅ | ✅ | ✅ | ✅ | ✅ | | **OpenSSL 3.0-3.5** | ✅ | ✅ | ❌ | ❌ | ❌ | | **.NET 9+** | ✅ | ✅ | ✅ | ✅ | ✅ | | **Java 21+** | ✅ | ✅ | 🟡 (Bouncy Castle) | 🟡 | ❌ | | **Windows SChannel** | ✅ | ✅ | ❌ | ❌ | ❌ | | **macOS Security** | ✅ | ✅ | ❌ | ❌ | ❌ | | **Firefox/NSS** | ✅ | ✅ | ❌ | 🟡 | ❌ | | **Chrome/BoringSSL** | ✅ | ✅ | ❌ | 🟡 | ❌ | 🟡 = Supporto sperimentale/Preview ---- ===== Code-Esempio: Conversione formato ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; public class CertificateConverter { public byte[] ConvertFormat( byte[] sourceData, CertificateFormat sourceFormat, CertificateFormat targetFormat, string password = null) { // 1. Caricare in oggetto .NET var cert = LoadCertificate(sourceData, sourceFormat, password); // 2. Esportare nel formato destinazione return ExportCertificate(cert, targetFormat, password); } private X509Certificate2 LoadCertificate( byte[] data, CertificateFormat format, string password) { return format switch { CertificateFormat.Der => new X509Certificate2(data), CertificateFormat.Pem => X509Certificate2.CreateFromPem(Encoding.UTF8.GetString(data)), CertificateFormat.Pfx => new X509Certificate2(data, password, X509KeyStorageFlags.Exportable), _ => throw new NotSupportedException($"Formato {format} non supportato") }; } private byte[] ExportCertificate( X509Certificate2 cert, CertificateFormat format, string password) { return format switch { CertificateFormat.Der => cert.RawData, CertificateFormat.Pem => Encoding.UTF8.GetBytes(cert.ExportCertificatePem()), CertificateFormat.Pfx => cert.Export(X509ContentType.Pfx, password), _ => throw new NotSupportedException($"Formato {format} non supportato") }; } } public enum CertificateFormat { Der, Pem, Pfx, P7b } ---- ===== Code-Esempio: Fallback certificato ibrido ===== public class HybridCertificateFallback { public X509Certificate2 GetCompatibleCertificate( X509Certificate2 hybridCert, PlatformCapabilities targetCapabilities) { using var ctx = PqCryptoContext.Initialize(); // Verificare se certificato ibrido var algorithm = hybridCert.GetKeyAlgorithm(); if (!IsHybridAlgorithm(algorithm)) { // Non ibrido - restituire direttamente return hybridCert; } // Destinazione supporta PQ? if (targetCapabilities.SupportsPqAlgorithms) { return hybridCert; } // Fallback: estrarre parte classica Console.WriteLine("Destinazione non supporta PQ - uso fallback classico"); // Caricare catena certificati alternativa (se disponibile) var classicalCert = FindClassicalAlternative(hybridCert); if (classicalCert != null) { return classicalCert; } throw new NotSupportedException( "Sistema destinazione non supporta PQ e nessun fallback classico disponibile" ); } private bool IsHybridAlgorithm(string algorithm) { return algorithm.Contains("ML-DSA") || algorithm.Contains("ML-KEM") || algorithm.Contains("DILITHIUM") || algorithm.Contains("KYBER"); } private X509Certificate2 FindClassicalAlternative(X509Certificate2 hybridCert) { // Cercare certificato con stesso Subject ma algoritmo classico using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); var alternatives = store.Certificates .Find(X509FindType.FindBySubjectDistinguishedName, hybridCert.Subject, validOnly: true) .Where(c => !IsHybridAlgorithm(c.GetKeyAlgorithm())) .OrderByDescending(c => c.NotAfter) .FirstOrDefault(); return alternatives; } } public class PlatformCapabilities { public bool SupportsPqAlgorithms { get; set; } public bool SupportsTls13 { get; set; } public static PlatformCapabilities Detect() { return new PlatformCapabilities { SupportsPqAlgorithms = CheckPqSupport(), SupportsTls13 = CheckTls13Support() }; } private static bool CheckPqSupport() { try { // Verificare se OpenSSL 3.6+ con provider PQ disponibile return OpenSslInterop.IsOpenSsl36OrNewer(); } catch { return false; } } private static bool CheckTls13Support() { return Environment.OSVersion.Platform == PlatformID.Win32NT ? Environment.OSVersion.Version >= new Version(10, 0, 17763) : true; } } ---- ===== Interoperabilita specifica per settore ===== ^ Settore ^ Piattaforme principali ^ Formato ^ Particolarita ^ | **Banking** | Java + .NET | JKS, PFX | Compliance FIPS | | **Healthcare** | Windows + Linux | PFX, PEM | Integrazione HL7/FHIR | | **IoT** | Embedded Linux | DER | Risorse limitate | | **Cloud** | Multi-Platform | PEM | Container/Kubernetes | ---- ===== Scenari correlati ===== ^ Relazione ^ Scenario ^ Descrizione ^ | **Base** | [[.:pem_export|12.1 PEM Export]] | Formato Linux | | **Base** | [[.:pfx_export|12.2 PFX Export]] | Formato Windows | | **Correlato** | [[it:int:pqcrypt:szenarien:tls:hybrid_tls|10.4 TLS ibrido]] | Compatibilita PQ-TLS | | **Correlato** | [[it:int:pqcrypt:konzepte:algorithmen|Algoritmi]] | Fondamenti PQ | ---- << [[.:pkcs7_chain|← 12.3 PKCS#7 Chain]] | [[.:start|↑ Import/Export]] | [[it:int:pqcrypt:szenarien:start|→ Tutti gli scenari]] >> {{tag>scenario import export interop cross-platform java openssl}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//