Due famiglie di crittografia asimmetrica
RSA e ECDSA sono i due algoritmi di firma digitale più usati nei certificati SSL/TLS moderni. RSA si basa sulla difficoltà di fattorizzare grandi numeri primi; ECDSA (Elliptic Curve Digital Signature Algorithm) si basa sul problema del logaritmo discreto su curve ellittiche. Entrambi forniscono autenticazione del server e firma del key exchange, ma con caratteristiche operative molto diverse.
Dimensione delle chiavi
La differenza più visibile è la lunghezza delle chiavi per equivalenti livelli di sicurezza:
- RSA 2048 bit ≈ ECDSA P-256 (256 bit)
- RSA 3072 bit ≈ ECDSA P-384 (384 bit)
- RSA 7680 bit ≈ ECDSA P-521 (521 bit)
Una chiave RSA 2048 bit pesa 256 byte; una ECDSA P-256 pesa solo 32 byte. Il certificato ECDSA risulta nettamente più piccolo, con benefici sui round trip dell'handshake e sull'uso di banda.
Performance
ECDSA è significativamente più veloce di RSA nelle operazioni di firma (lato server) e key generation. Numeri tipici su CPU moderne:
- Firma ECDSA P-256: ~50.000 op/s
- Firma RSA 2048: ~5.000 op/s
- Verifica ECDSA P-256: ~25.000 op/s
- Verifica RSA 2048: ~140.000 op/s
Notabile: ECDSA firma più rapidamente, RSA verifica più rapidamente. Per un web server che genera molti handshake (= firma), ECDSA è la scelta ottimale; per un client che verifica molti certificati, RSA è leggermente più rapido.
Compatibilità
RSA è universalmente supportato: ogni browser, OS, libreria TLS nata negli ultimi 20 anni gestisce RSA senza problemi. ECDSA richiede client più recenti:
- Browser desktop: pieno supporto dal 2014
- Android: dal 4.0 (2011)
- iOS: dal 7.0 (2013)
- Java: dal 7 (con SunEC)
- Windows XP, vecchi Symbian, BlackBerry legacy: NO ECDSA
Se il pubblico ha esigenze di accessibilità da dispositivi molto obsoleti, RSA resta più sicuro.
Soluzione: doppio certificato
Il modo migliore per avere il meglio di entrambi è installare due certificati sullo stesso vhost, uno ECDSA e uno RSA, lasciando al server la scelta in base alle capacità del client. Configurazione Nginx:
ssl_certificate /path/ecdsa.crt;
ssl_certificate_key /path/ecdsa.key;
ssl_certificate /path/rsa.crt;
ssl_certificate_key /path/rsa.key;
Nginx 1.11+ supporta nativamente il dual cert. Apache 2.4.x altrettanto con direttive SSLCertificateFile doppie. Il server presenta automaticamente il certificato giusto in base alle cipher suite supportate dal client.
Forward Secrecy
Entrambi gli algoritmi supportano cipher con Forward Secrecy via ECDHE. La firma del certificato non incide sulla protezione del traffico passato; quello che conta è la modalità di key exchange. ECDSA si combina con ECDHE-ECDSA (firma + key exchange entrambi su curve ellittiche), RSA con ECDHE-RSA.
Quali curve scegliere
Le curve raccomandate per ECDSA in produzione sono:
- P-256 (secp256r1): default, performance ottime, livello AES-128
- P-384 (secp384r1): livello AES-192, lievemente più lenta
- P-521 (secp521r1): livello AES-256, rara in pratica
Evita curve esotiche come secp192r1 o secp224r1. La curva Curve25519 (Ed25519) sta emergendo per firme TLS 1.3 ma il supporto delle CA pubbliche è ancora limitato.
Generazione CSR
Per una CSR ECDSA con OpenSSL:
openssl ecparam -genkey -name prime256v1 -out ecdsa.key
openssl req -new -key ecdsa.key -out ecdsa.csr -sha256
Per RSA:
openssl req -newkey rsa:2048 -keyout rsa.key -out rsa.csr -nodes -sha256
Quando preferire RSA
Se servi un pubblico legacy molto esteso, se ti integri con software embedded vecchio, se la tua CA pubblica non emette ECDSA, RSA 2048 resta una scelta solida. Per tutti gli altri scenari, doppio cert'ECDSA+RSA o solo ECDSA P-256 è la via moderna.
Hai bisogno di aiuto?
Se vuoi gestione SSL dal team di G Tech Group, scrivici tramite il modulo di contatto.