Flux de communication
Comprendre le flux de communication aide à diagnostiquer les problèmes et à optimiser les performances. Cette page offre une vue d'ensemble de la manière dont les opérations transitent dans le système, depuis Oracle Database vers DuoKey Cockpit et retour.
Vue d'ensemble
Flux d'opération typique
Flux d'initialisation
Étapes :
- Oracle appelle C_Initialize() : l'initialisation de la bibliothèque commence
- Lecture de la configuration : la bibliothèque lit
server_urletaccess_guiddepuispkcs11.toml - Authentification : la bibliothèque présente son jeton bearer
access_guidau Cockpit lors de sa première requête - Validation côté serveur : le Cockpit valide le jeton et résout le tenant à partir de l'identité de l'application ; aucun échange de jeton distinct n'est effectué
- Vérification du coffre : vérifie l'accès au coffre spécifié
- Retour de succès : la bibliothèque est prête pour les opérations
Flux de création de session
Étapes :
- Oracle appelle C_OpenSession() : demande une nouvelle session
- Validation du slot : s'assure que l'ID de slot est valide
- Création de la session : crée l'objet session interne
- Initialisation des tables : crée la table de mappage des handles pour la session
- Retour du handle : renvoie le handle de session à Oracle
Remarque : La création de session ne nécessite pas d'appels API. Les sessions sont gérées localement.
Flux de connexion
Étapes :
- Oracle appelle C_Login() : demande la connexion de la session
- Vérification du jeton : vérifie que le jeton bearer
access_guidest configuré danspkcs11.toml - Marquage de la session : marque la session comme authentifiée
- Retour de succès : renvoie CKR_OK
Remarque : Pour DuoKey PKCS#11, l'authentification a lieu pendant C_Initialize(), lorsque la bibliothèque présente son jeton bearer access_guid au Cockpit. La fonction C_Login() confirme que le jeton est disponible mais n'effectue pas d'appels API supplémentaires.
Flux de génération de clé
Étapes :
- Oracle appelle C_GenerateKey() : demande la génération d'une clé
- Analyse du modèle : extrait les attributs de clé (type, taille, label)
- Construction de la requête API : crée la requête de génération de clé
- Appel API : envoie la requête de génération de clé au Cockpit
- Génération HSM : le HSM backend génère la clé
- Réception de l'UUID : le Cockpit renvoie l'UUID de la clé
- Création du handle : mappe l'UUID vers un handle PKCS#11
- Retour du handle : renvoie le handle à Oracle
Flux de chiffrement
Étapes :
- Oracle appelle C_Encrypt() / C_WrapKey() : demande un wrap sur le chemin de la clé maître (par exemple pour protéger une clé de tablespace)
- Recherche du handle : trouve l'UUID correspondant au handle de clé maître fourni
- Analyse du mécanisme : extrait l'algorithme (AES-CBC / AES-CBC-PAD) et l'IV
- Construction de la requête : crée la requête de wrap
- Appel API : envoie la requête de wrap au Cockpit
- Wrap HSM : le HSM backend effectue le wrap AES-CBC(-PAD) préservant la longueur
- Réception de la clé enveloppée : obtient les données enveloppées
- Retour du résultat : renvoie à Oracle
Remarque : Le wrap utilise un mécanisme AES-CBC / AES-CBC-PAD préservant la longueur. Une enveloppe AES-GCM expansive ne doit pas être utilisée sur ce chemin — elle casse le SET KEY d'Oracle avec l'erreur ORA-00600 [kcbtse_populate_tbskey_1]. Le chiffrement en masse des tables et des tablespaces est effectué localement par Oracle à l'aide d'AES-NI et ne quitte jamais la base de données.
Flux de déchiffrement
Étapes :
- Oracle appelle C_Decrypt() / C_UnwrapKey() : demande un unwrap sur le chemin de la clé maître (par exemple pour récupérer une clé de tablespace à l'ouverture du keystore /
SET KEY) - Recherche du handle : trouve l'UUID correspondant au handle de clé maître fourni
- Analyse du mécanisme : extrait l'algorithme (AES-CBC / AES-CBC-PAD) et l'IV
- Construction de la requête : crée la requête d'unwrap
- Appel API : envoie la requête d'unwrap au Cockpit
- Unwrap HSM : le HSM backend effectue l'unwrap AES-CBC(-PAD) préservant la longueur
- Réception de la clé de tablespace : obtient la clé désenveloppée
- Retour du résultat : renvoie à Oracle
Flux de recherche d'objets
Étapes :
- C_FindObjectsInit() : initialise la recherche avec un modèle
- Analyse du modèle : extrait les critères de recherche (label, classe, etc.)
- C_FindObjects() : exécute la recherche
- Appel API : envoie la requête de recherche d'objets au Cockpit
- Réception des UUID : obtient les UUID des objets correspondants
- Création des handles : mappe les UUID vers des handles
- Retour des handles : renvoie le tableau de handles à Oracle
- C_FindObjectsFinal() : nettoie l'état de recherche
Flux de gestion des erreurs
Gestion des erreurs réseau
Gestion des erreurs d'authentification
Remarque : L'access_guid est un jeton bearer statique unique. Il n'existe aucun endpoint de jeton ni cycle de rafraîchissement ; un jeton rejeté constitue donc une erreur terminale (vérifiez l'access_guid dans pkcs11.toml) plutôt qu'une opération que la bibliothèque réessaie.
Gestion des erreurs HSM
Optimisation des performances
Réutilisation des connexions
Avantages :
- Élimine le surcoût de la négociation TCP
- Réduit le temps d'établissement des connexions
- Améliore le débit global
Jeton bearer
La bibliothèque authentifie chaque requête à l'aide d'un unique jeton bearer access_guid intégré dans le server_url de l'app proxy. Il n'existe aucun endpoint de jeton ni cycle de rafraîchissement : le même jeton est présenté à chaque requête et validé côté serveur par le Cockpit, qui résout le tenant à partir de l'identité de l'application.
Avantages :
- Aucun aller-retour d'échange de jeton
- Aucun secret à rotationner à l'exécution (pas de
client_id/client_secret) - Le maintien des connexions (keep-alive) réduit les négociations TLS par opération
Mise en cache des handles
Avantages :
- Évite les appels API en double
- Résolution de handle plus rapide
- Trafic réseau réduit
Supervision et débogage
Traçage des requêtes
Activez la journalisation de débogage pour tracer les requêtes :
export DKE_PKCS11_LOGGING_LEVEL=debug
export DKE_PKCS11_LOGGING_FOLDER=/var/log/dke-pkcs11
Sortie de journal :
[2025-12-19 10:30:45] [DEBUG] C_Initialize() called
[2025-12-19 10:30:45] [DEBUG] Reading pkcs11.toml (server_url, access_guid)
[2025-12-19 10:30:45] [INFO] Connecting to DuoKey Cockpit: https://cockpit-api-dev.duokey.cloud
[2025-12-19 10:30:46] [INFO] access_guid bearer token validated by Cockpit
[2025-12-19 10:30:46] [DEBUG] C_Initialize() completed: CKR_OK
Métriques de performance
Surveillez les métriques clés :
- Latence des requêtes : temps entre l'appel Oracle et la réponse
- Latence API : temps des appels à l'API DuoKey Cockpit
- Taux d'erreur : pourcentage de requêtes échouées
- Échecs d'authentification : nombre de jetons bearer
access_guidrejetés
Supervision réseau
Surveillez le trafic réseau :
- Connexions HTTPS : nombre de connexions actives
- Tailles requête/réponse : tailles des charges utiles
- Nombre de nouvelles tentatives : nombre de réessais par requête
- Événements de timeout : fréquence des timeouts
Bonnes pratiques
Gestion des erreurs
- Réessayer les erreurs transitoires : erreurs réseau, timeouts
- Ne pas réessayer les erreurs d'authentification : identifiants invalides
- Journaliser toutes les erreurs : pour le diagnostic
- Renvoyer les codes appropriés : traduire en codes PKCS#11
Performance
- Réutiliser les connexions : utiliser le pool de connexions
- Maintenir les connexions actives : amortir les négociations TLS sur plusieurs opérations
- Regrouper les opérations : lorsque c'est possible (futur)
- Surveiller la latence : suivre les métriques de performance
Sécurité
- Utiliser TLS : toutes les connexions chiffrées
- Valider les certificats : validation stricte des certificats
- Sécuriser les identifiants : ne jamais journaliser l'
access_guid - Protéger pkcs11.toml : traiter le jeton bearer
access_guidcomme un secret ; restreindre les permissions du fichier
Étapes suivantes
- Vue d'ensemble de l'architecture → - Comprendre l'architecture globale
- Couche interface PKCS#11 → - En savoir plus sur la couche interface
- Couche SDK DuoKey → - Comprendre la communication API