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.
Référence API : les endpoints d'API détaillés ainsi que les formats de requête/réponse sont documentés séparément dans la documentation développeur.
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