Een bevinding is geen fix
Bij PQNavigator zie ik veel scanresultaten. "Hier wordt RSA gebruikt", "daar ECDSA". Het klopt allemaal, en bijna niets ervan is op zichzelf bruikbaar. Een maintainer die een lijst met vijftig quantum-kwetsbare plekken krijgt, sluit het tabblad.
Dus koos ik drie bevindingen in open-source projecten van de Nederlandse overheid en probeerde ik van elk een pull request te maken die vandaag veilig te mergen is. Elk leerde me een ander patroon.
1. Stop met het algoritme hardcoden
In een proxy van het ministerie van VWS was het JWT-algoritme een klasseconstante. Dat is het tegenovergestelde van crypto-agility: aanpassen betekent een codewijziging, een review en een release.
class ClientAssertionJwtIssuer:- JWT_ALG: str = "RS256"+ KEY_STORE_FALLBACK_PRIVATE_KEY_ID: str = (+ "client_assertion_jwt_fallback_private_key"+ )De fix leest het algoritme uit de config, kiest standaard ML-DSA-65 en valt terug op RS256 als er geen post-quantum sleutel is. In productie verandert niets tot iemand de nieuwe sleutel toevoegt.
try: self.__private_key = self.__jwk_repository.get_first_key_from_store( self.KEY_STORE_PRIVATE_KEY_ID )except KeyError: self.__using_fallback_alg = True self.__private_key = self.__jwk_repository.get_first_key_from_store( self.KEY_STORE_FALLBACK_PRIVATE_KEY_ID )2. Kun je niet overstappen, verklein dan het venster
De Kubernetes-operator van Fundament maakt een RSA-4096-CA die tien jaar geldig is. Eerlijk antwoord: overstappen op ML-DSA kan nog niet, want cert-manager ondersteunt alleen RSA, ECDSA en Ed25519.
Het risico kun je wel verkleinen. De ongelijkheid van Mosca zegt dat je een probleem hebt als de tijd dat data veilig moet blijven (X) plus de migratietijd (Y) langer is dan de tijd tot er een quantumcomputer is (Z). Een CA van tien jaar maakt X enorm. Drie jaar, met vernieuwing 90 dagen voor het verlopen, maakt X klein en dwingt een nieuw beslismoment af voordat iemand zich opnieuw aan RSA vastlegt.
"privateKey": map[string]any{"algorithm": "RSA", "size": int64(4096)},"duration": "26280h", // 3 years"renewBefore": "2160h", // 90 days3. Bescherm wat aanvallers vandaag opnemen
De gemeente Amsterdam draait een proxy naar de Basisregistratie Personen. Burgerservicenummers blijven een leven lang gevoelig en zijn daarmee het schoolvoorbeeld van "harvest now, decrypt later".
De wijziging voegt hybride post-quantum TLS (X25519MLKEM768) toe op de uitgaande verbinding, achter een vlag, en controleert of de gekoppelde OpenSSL nieuw genoeg is. Zo niet, dan logt hij een waarschuwing en gebruikt hij klassieke TLS in plaats van te falen.
if ssl.OPENSSL_VERSION_INFO[:2] < _MIN_OPENSSL_FOR_PQC: logger.warning( "PQC TLS requested (BRP_ENABLE_PQC_TLS) but linked OpenSSL %s is older " "than 3.5 and does not support the ML-KEM hybrid TLS 1.3 group - " "falling back to classical TLS.",Wat ze gemeen hebben
- Elke wijziging is optioneel of heeft een terugval. Mergen verandert niets tot het team besluit.
- Elke wijziging legt zichzelf uit in de code, met een verwijzing naar de onderbouwing, zodat de volgende developer hem niet terugdraait.
- Elke wijziging is echt getest. De TLS-wijziging heeft een loopback-handshaketest, niet alleen een configcheck.
De post-quantum migratie gaat jaren duren. Niet in één big-bang project, maar in honderden kleine wijzigingen zoals deze. Hoe eerder die saai worden, hoe beter.