SYNOPSIS
#include <openssl/tls1.h>
long SSL_CTX_set_tlsext_ticket_key_cb(SSL_CTX sslctx,
int (*cb)(SSL *s, unsigned char key_name[16],
unsigned char iv[EVP_MAX_IV_LENGTH],
EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc));
DESCRIPTION
SSL_CTX_set_tlsext_ticket_key_cb() définit une fonction de rappel cb pour gérer les tickets de session pour le contexte SSL sslctx. Les tickets de session définis dans la RFC5077 procurent une amélioration de capacité de reprise de session là où l’implémentation du serveur ne requiert pas la conservation de l’état par session. Cela ne s’applique qu’à TLS et il n’existe pas d’implémentation pour SSLv3.Le rappel est disponible lorsque la bibliothèque OpenSSL a été construite sans que OPENSSL_NO_TLSEXT soit défini.
La fonction de rappel cb sera appelée pour chaque client qui initie une session TLS lorsque l’extension de ticket de session est présentée dans le message « hello » de TLS. C’est la charge de cette fonction de créer ou d'extraire les paramètres de chiffrement et de conserver leur état.
La bibliothèque OpenSSL utilise la fonction de rappel pour mettre en œuvre un état commun de construction de ticket selon la section 4 de la RFC5077, et est telle que l’état de session l’état est inutile et qu’un petit ensemble de variables de chiffrement doit être conservé par l’implémentation de la fonction de rappel.
Pour réutiliser une session, un client TLS doit envoyer une extension de ticket de session au serveur. Le client ne peut envoyer qu’un seul ticket de session. Le serveur, à l’aide de la fonction de rappel, soit accepte de réutiliser les données du ticket de session, soit démarre une initialisation de connexion TLS complète pour créer un nouveau ticket de session.
Avant d’utiliser la fonction de rappel, ctx et hctx sont initialisés avec respectivement EVP_CIPHER_CTX_init et HMAC_CTX_init.
Pour les nouveaux tickets de session, quand le client n’en présente pas, qu'une recherche de ticket échoue, ou qu'un renouvellement d’option est présenté, la fonction de rappel sera demandée avec enc égal à 1. La bibliothèque OpenSSl demande que la fonction définisse un name arbitraire, initialise iv, et définisse le contexte du chiffrement ctx et le contexte du hachage hctx.
Le name comporte 16 caractères et est utilisé comme clef d’identification.
La longueur de iv est la longueur du vecteur d’initialisation de l’algorithme de chiffrement correspondant. La longueur maximale est EVP_MAX_IV_LENGTH octets définie dans evp.h.
Le vecteur d’initialisation iv doit être une valeur aléatoire. Le contexte de chiffrement ctx doit utiliser le vecteur iv. Le contexte peut être défini en utilisant EVP_EncryptInit_ex. Le contexte HMAC peut l’être avec HMAC_Init_ex.
Quand un client présente un ticket de session, la fonction de rappel sera appelée avec enc défini à 0, signifiant que la fonction cb doit retrouver un ensemble de paramètres. Dans ce cas, name et iv ont déjà été séparés du ticket de session. La bibliothèque OpenSSl s’attend à ce que name soit utilisé pour récupérer les paramètres de chiffrement et que le contexte de chiffrement ctx soit défini pour retrouver les paramètres et le vecteur d’initialisation iv, en utilisant une fonction telle que EVP_DecryptInit_ex. hctx doit être défini avec HMAC_Init_ex.
Si name est toujours valable mais qu’un renouvellement du ticket est demandé, la fonction de rappel renverra 2. La bibliothèque appellera de nouveau le rappel avec un argument pour enc égal à 1 pour définir le nouveau ticket.
La valeur de retour de la fonction cb est utilisée par OpenSSL pour déterminer quel est le traitement à venir. Les valeurs suivantes signifient :
- 2
- Cela indique que ctx et hctx ont été définis et que la session peut continuer avec ces paramètres. En plus, cela indique que le ticket de session est dans une période de renouvellement et devrait être renouvelé. La bibliothèque OpenSSL appellera de nouveau cb avec un argument enc de 1 pour définir le nouveau ticket (consultez la RFC5077 3.3, paragraphe 2).
- 1
- Cela indique que ctx et hctx ont été définis et que la session peut continuer avec ces paramètres.
- 0
-
Cela indique qu’il n’a pas été possible de définir ou retrouver un ticket de
session et que la session SSL/TLS continuera par une négociation d’un
ensemble de paramètres de chiffrement ou en utilisant le mécanisme de
reprise alternatif de SSL/TLS par identifiants de session.
Si appelée avec enc égal 0, la bibliothèque appellera de nouveau cb pour obtenir un nouveau jeu de paramètres.
- inférieur à 0
- Cela indique une erreur.
NOTES
La reprise de session court-circuite TLS de façon à ce que la négociation de certificat du client ne se produise pas. Pour cela, le certificat du client et toute autre information sur l’état de la négociation sont chiffrés dans le ticket. Dans une reprise de session, les applications auront toute l’information d’état disponible comme après une pleine négociation.Si un attaquant pouvait obtenir la clef utilisée pour chiffrer le ticket de session, il pourrait, pour tout ticket utilisant cette clef, obtenir la clef secrète maître et déchiffrer tous les messages émis par cette session, même si la suite de chiffrement prend en charge la confidentialité persistante. Par conséquent, les applications peuvent vouloir utiliser plusieurs clefs et éviter les clefs utilisées sur un long terme et stockées dans des fichiers.
Les applications peuvent utiliser des clefs plus longues pour conserver un niveau de sécurité constant. Par exemple, si la suite de chiffrement est basée sur 256 bits mais que la clef du ticket est basée sur 128 bits, la sécurité d’ensemble est basée sur 128 bits car le cassage de la clef de ticket permettra à un attaquant d’obtenir les clefs de session.
EXEMPLES
Implémentation de référence :SSL_CTX_set_tlsext_ticket_key_cb(SSL,ssl_tlsext_ticket_key_cb);
...
static int ssl_tlsext_ticket_key_cb(SSL *s, unsigned char key_name[16], unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc) { if (enc) { /* créer une nouvelle session */ if (RAND_bytes(iv, EVP_MAX_IV_LENGTH) ) { return -1; /* entropie insuffisante */ } key = currentkey(); /* quelque chose à mettre en œuvre */ if ( !key ) { /* la clef actuelle n’existe pas ou n’est pas valable */ key = createkey(); /* quelque chose à mettre en œuvre. * createkey doit initialiser un nom, * une clef AES, une clef HMAC et * peut-être une date limite. */ if ( !key ) { /* la clef n’a pu être créée */ return 0; } } memcpy(key_name, key->name, 16); EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key->aes_key, iv); HMAC_Init_ex(&hctx, key->hmac_key, 16, EVP_sha256(), NULL); return 1; } else { /* retrouver une session */ key = findkey(name); if (!key || key->expire < now() ) { return 0; } HMAC_Init_ex(&hctx, key->hmac_key, 16, EVP_sha256(), NULL); EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key->aes_key, iv); if (key->expire < ( now() - RENEW_TIME ) ) { /* return 2 ~ cette session doit obtenir un nouveau ticket même si l’actuel est encore valable */ return 2; } return 1; } }
VALEURS DE RETOUR
0 est renvoyé pour signifier qu’une fonction de rappel est définie.HISTORIQUE
Cette fonction a été introduite dans OpenSSL 0.9.8hTRADUCTION
La traduction de cette page de manuel est maintenue par les membres de la liste <debian-l10n-french AT lists DOT debian DOT org>. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.