j'arrive à me connecter au token en PKCS#11 mais je n'ai pas encore trouvé
la façon de faire pour en exploiter les clefs afin de signer des fichiers.
j'arrive à me connecter au token en PKCS#11 mais je n'ai pas encore trouvé
la façon de faire pour en exploiter les clefs afin de signer des fichiers.
j'arrive à me connecter au token en PKCS#11 mais je n'ai pas encore trouvé
la façon de faire pour en exploiter les clefs afin de signer des fichiers.
En PKCS#11, il faut :
[snip]
En PKCS#11, il faut :
[snip]
En PKCS#11, il faut :
[snip]
According to yann :j'arrive à me connecter au token en PKCS#11 mais je n'ai pas encore trouvé
la façon de faire pour en exploiter les clefs afin de signer des fichiers.
En PKCS#11, il faut :
-- initialiser le module PKCS#11 (C_Initialize())
-- ouvrir une session "user" (C_OpenSession())
-- se logguer (C_Login()) (ça dépend du token, mais habituellement les
clés privées ne sont accessibles que lorsqu'on est logué sur le token)
-- obtenir un handle sur la clé privée à coups de C_FindObjectsInit(),
C_FindObjects() et C_FindObjectsFinal()
-- faire la signature : C_SignInit() puis C_Sign()
-- fermer la porte en sortant : C_CloseAllSessions() puis C_Finalize()
Pour les détails, il faut faire un peu de C_GetSlotList() (pour avoir la
liste des "slots" présents -- il faut un "slot ID" pour C_OpenSession())
et de C_GetTokenInfo() pour savoir comment faire le C_Login() (en gros,
il faut regarder les flags : si CKF_LOGIN_REQUIRED est présent, il faut
faire un C_Login() ; si CKF_PROTECTED_AUTHENTICATION_PATH est absent, il
faut aussi fournir un code PIN, demandé à l'utilisateur, dont la taille
est indiquée dans la structure remplie par C_GetTokenInfo()).
Il reste la question de quelle clé choisir quand il y en a plusieurs.
L'usage le plus répandu consiste à stocker sur le token un certificat
X.509 et sa clé privée, avec la même valeur de l'attribut CKA_ID pour
les deux. Comme ça, on énumère les certificats, on choisit celui qu'on
veut, on récupère son CKA_ID et on cherche les clés privées selon ce
CKA_ID.
According to yann <yannlegloinec@noos.fr>:
j'arrive à me connecter au token en PKCS#11 mais je n'ai pas encore trouvé
la façon de faire pour en exploiter les clefs afin de signer des fichiers.
En PKCS#11, il faut :
-- initialiser le module PKCS#11 (C_Initialize())
-- ouvrir une session "user" (C_OpenSession())
-- se logguer (C_Login()) (ça dépend du token, mais habituellement les
clés privées ne sont accessibles que lorsqu'on est logué sur le token)
-- obtenir un handle sur la clé privée à coups de C_FindObjectsInit(),
C_FindObjects() et C_FindObjectsFinal()
-- faire la signature : C_SignInit() puis C_Sign()
-- fermer la porte en sortant : C_CloseAllSessions() puis C_Finalize()
Pour les détails, il faut faire un peu de C_GetSlotList() (pour avoir la
liste des "slots" présents -- il faut un "slot ID" pour C_OpenSession())
et de C_GetTokenInfo() pour savoir comment faire le C_Login() (en gros,
il faut regarder les flags : si CKF_LOGIN_REQUIRED est présent, il faut
faire un C_Login() ; si CKF_PROTECTED_AUTHENTICATION_PATH est absent, il
faut aussi fournir un code PIN, demandé à l'utilisateur, dont la taille
est indiquée dans la structure remplie par C_GetTokenInfo()).
Il reste la question de quelle clé choisir quand il y en a plusieurs.
L'usage le plus répandu consiste à stocker sur le token un certificat
X.509 et sa clé privée, avec la même valeur de l'attribut CKA_ID pour
les deux. Comme ça, on énumère les certificats, on choisit celui qu'on
veut, on récupère son CKA_ID et on cherche les clés privées selon ce
CKA_ID.
According to yann :j'arrive à me connecter au token en PKCS#11 mais je n'ai pas encore trouvé
la façon de faire pour en exploiter les clefs afin de signer des fichiers.
En PKCS#11, il faut :
-- initialiser le module PKCS#11 (C_Initialize())
-- ouvrir une session "user" (C_OpenSession())
-- se logguer (C_Login()) (ça dépend du token, mais habituellement les
clés privées ne sont accessibles que lorsqu'on est logué sur le token)
-- obtenir un handle sur la clé privée à coups de C_FindObjectsInit(),
C_FindObjects() et C_FindObjectsFinal()
-- faire la signature : C_SignInit() puis C_Sign()
-- fermer la porte en sortant : C_CloseAllSessions() puis C_Finalize()
Pour les détails, il faut faire un peu de C_GetSlotList() (pour avoir la
liste des "slots" présents -- il faut un "slot ID" pour C_OpenSession())
et de C_GetTokenInfo() pour savoir comment faire le C_Login() (en gros,
il faut regarder les flags : si CKF_LOGIN_REQUIRED est présent, il faut
faire un C_Login() ; si CKF_PROTECTED_AUTHENTICATION_PATH est absent, il
faut aussi fournir un code PIN, demandé à l'utilisateur, dont la taille
est indiquée dans la structure remplie par C_GetTokenInfo()).
Il reste la question de quelle clé choisir quand il y en a plusieurs.
L'usage le plus répandu consiste à stocker sur le token un certificat
X.509 et sa clé privée, avec la même valeur de l'attribut CKA_ID pour
les deux. Comme ça, on énumère les certificats, on choisit celui qu'on
veut, on récupère son CKA_ID et on cherche les clés privées selon ce
CKA_ID.
Beurk. Un C_CloseSession() suivi d'un C_Finalize() suffiront, pas la peine
de fermer la porte de tes voisins... ;)
Et en espérant que le constructeur n'ait pas intégré de mécanisme
d'authentification plus poussé que le PKCS#11 standard, qui est quand
même très faible.
Beurk. Un C_CloseSession() suivi d'un C_Finalize() suffiront, pas la peine
de fermer la porte de tes voisins... ;)
Et en espérant que le constructeur n'ait pas intégré de mécanisme
d'authentification plus poussé que le PKCS#11 standard, qui est quand
même très faible.
Beurk. Un C_CloseSession() suivi d'un C_Finalize() suffiront, pas la peine
de fermer la porte de tes voisins... ;)
Et en espérant que le constructeur n'ait pas intégré de mécanisme
d'authentification plus poussé que le PKCS#11 standard, qui est quand
même très faible.
According to Erwann ABALEA :Beurk. Un C_CloseSession() suivi d'un C_Finalize() suffiront, pas la peine
de fermer la porte de tes voisins... ;)
Ça ne change rien. Le C_CloseAllSessions() et/ou le C_CloseSession() sont
cosmétiques, puisque le C_Finalize() coupe tout de toutes façons. Par
ailleurs, la portée du C_CloseAllSessions() et celle du C_Finalize() sont
identique : toute l'application, rien que l'application. Normalement, ça
n'influe pas sur les autres applications qui utilisent le même token en
même temps.
Et en espérant que le constructeur n'ait pas intégré de mécanisme
d'authentification plus poussé que le PKCS#11 standard, qui est quand
même très faible.
C'est normalement transparent : si le token sait faire de
l'authentification autre que le code PIN, il la fait et puis basta. Le
flag CKF_PROTECTED_AUTHENTICATION_PATH permet d'indiquer à l'application
qu'il n'y a pas besoin de code PIN parce que l'authentification faite
par ailleurs suffit.
Évidemment, il y a des applications buggués (Netscape...) qui imaginent
autrement.
According to Erwann ABALEA <erwann@abalea.com>:
Beurk. Un C_CloseSession() suivi d'un C_Finalize() suffiront, pas la peine
de fermer la porte de tes voisins... ;)
Ça ne change rien. Le C_CloseAllSessions() et/ou le C_CloseSession() sont
cosmétiques, puisque le C_Finalize() coupe tout de toutes façons. Par
ailleurs, la portée du C_CloseAllSessions() et celle du C_Finalize() sont
identique : toute l'application, rien que l'application. Normalement, ça
n'influe pas sur les autres applications qui utilisent le même token en
même temps.
Et en espérant que le constructeur n'ait pas intégré de mécanisme
d'authentification plus poussé que le PKCS#11 standard, qui est quand
même très faible.
C'est normalement transparent : si le token sait faire de
l'authentification autre que le code PIN, il la fait et puis basta. Le
flag CKF_PROTECTED_AUTHENTICATION_PATH permet d'indiquer à l'application
qu'il n'y a pas besoin de code PIN parce que l'authentification faite
par ailleurs suffit.
Évidemment, il y a des applications buggués (Netscape...) qui imaginent
autrement.
According to Erwann ABALEA :Beurk. Un C_CloseSession() suivi d'un C_Finalize() suffiront, pas la peine
de fermer la porte de tes voisins... ;)
Ça ne change rien. Le C_CloseAllSessions() et/ou le C_CloseSession() sont
cosmétiques, puisque le C_Finalize() coupe tout de toutes façons. Par
ailleurs, la portée du C_CloseAllSessions() et celle du C_Finalize() sont
identique : toute l'application, rien que l'application. Normalement, ça
n'influe pas sur les autres applications qui utilisent le même token en
même temps.
Et en espérant que le constructeur n'ait pas intégré de mécanisme
d'authentification plus poussé que le PKCS#11 standard, qui est quand
même très faible.
C'est normalement transparent : si le token sait faire de
l'authentification autre que le code PIN, il la fait et puis basta. Le
flag CKF_PROTECTED_AUTHENTICATION_PATH permet d'indiquer à l'application
qu'il n'y a pas besoin de code PIN parce que l'authentification faite
par ailleurs suffit.
Évidemment, il y a des applications buggués (Netscape...) qui imaginent
autrement.
Et Netscape fait bien pire encore:
Et Netscape fait bien pire encore:
Et Netscape fait bien pire encore:
Erwann ABALEA wrote:Et Netscape fait bien pire encore:
Netscape _4_ fait cela.
On parle là d'une appli qui n'a subi aucune refonte significative depuis
1997.
C'est Mozilla ou les Netscape 7.x qui représentent l'état actuel.
Erwann ABALEA wrote:
Et Netscape fait bien pire encore:
Netscape _4_ fait cela.
On parle là d'une appli qui n'a subi aucune refonte significative depuis
1997.
C'est Mozilla ou les Netscape 7.x qui représentent l'état actuel.
Erwann ABALEA wrote:Et Netscape fait bien pire encore:
Netscape _4_ fait cela.
On parle là d'une appli qui n'a subi aucune refonte significative depuis
1997.
C'est Mozilla ou les Netscape 7.x qui représentent l'état actuel.
Non. Le C_Finalize() ne coupe pas les autres sessions ouvertes sur le
token (je ne parle pas des sessions ouvertes par le même programme, qui
sont effectivement coupées à l'appel de C_Finalize()).
C_CloseAllSessions() coupe *toutes* les sessions ouvertes, mêmes celles
que *tu* n'as pas ouvertes.
Faux. J'utilisais parfois un C_CloseAllSessions() pour fermer les sessions
déclarées ouvertes par un programme qui avait planté (et donc qui ne
libérait rien).
Non. Le C_Finalize() ne coupe pas les autres sessions ouvertes sur le
token (je ne parle pas des sessions ouvertes par le même programme, qui
sont effectivement coupées à l'appel de C_Finalize()).
C_CloseAllSessions() coupe *toutes* les sessions ouvertes, mêmes celles
que *tu* n'as pas ouvertes.
Faux. J'utilisais parfois un C_CloseAllSessions() pour fermer les sessions
déclarées ouvertes par un programme qui avait planté (et donc qui ne
libérait rien).
Non. Le C_Finalize() ne coupe pas les autres sessions ouvertes sur le
token (je ne parle pas des sessions ouvertes par le même programme, qui
sont effectivement coupées à l'appel de C_Finalize()).
C_CloseAllSessions() coupe *toutes* les sessions ouvertes, mêmes celles
que *tu* n'as pas ouvertes.
Faux. J'utilisais parfois un C_CloseAllSessions() pour fermer les sessions
déclarées ouvertes par un programme qui avait planté (et donc qui ne
libérait rien).
According to Erwann ABALEA :Non. Le C_Finalize() ne coupe pas les autres sessions ouvertes sur le
token (je ne parle pas des sessions ouvertes par le même programme, qui
sont effectivement coupées à l'appel de C_Finalize()).
C_CloseAllSessions() coupe *toutes* les sessions ouvertes, mêmes celles
que *tu* n'as pas ouvertes.
On n'a pas lu le même PKCS#11 alors.
Dans celui qui se télécharge
sur le site web de RSA Labs,
il est bien spécifié que les sessions
sont spécifiques aux applications, et que le C_CloseAllSessions()
ferme toutes les sessions _de l'application qui appelle le
C_CloseAllSessions()_. L'exemple détaillé dans la section 6.6.7 est très
instructif de ce point de vue. On voit une application tenter d'accéder
à une session d'une autre application, et se faire jeter (paragraphe 8 :
« The attempt fails, because A and B have no access rights to each
other's sessions or objects. »). Plus loin (paragraphe 26), une
application appelle C_CloseAllSessions() et ça ne ferme pas les sessions
des autres applications.
La spécification de C_CloseAllSessions() en
rajoute une couche (page 159) : « C_CloseAllSessions closes all sessions
an application has with a token. slotID specifies the tokents slot. »
Enfin, la section 11.6, page 156, décrit en quelques points comment les
choses devraient raisonnablement se passer :
[...]
5. Call C_CloseSession once for each session that the application
has with the token, or call C_CloseAllSessions to close all the
applicationas sessions simultaneously.
As has been observed, an application may have concurrent sessions with
more than one token. It is also possible for a token to have concurrent
sessions with more than one application.
Appels non conformes au standard pour obtenir un résultat lui aussi non
conforme au standard.
According to Erwann ABALEA <erwann@abalea.com>:
Non. Le C_Finalize() ne coupe pas les autres sessions ouvertes sur le
token (je ne parle pas des sessions ouvertes par le même programme, qui
sont effectivement coupées à l'appel de C_Finalize()).
C_CloseAllSessions() coupe *toutes* les sessions ouvertes, mêmes celles
que *tu* n'as pas ouvertes.
On n'a pas lu le même PKCS#11 alors.
Dans celui qui se télécharge
sur le site web de RSA Labs,
il est bien spécifié que les sessions
sont spécifiques aux applications, et que le C_CloseAllSessions()
ferme toutes les sessions _de l'application qui appelle le
C_CloseAllSessions()_. L'exemple détaillé dans la section 6.6.7 est très
instructif de ce point de vue. On voit une application tenter d'accéder
à une session d'une autre application, et se faire jeter (paragraphe 8 :
« The attempt fails, because A and B have no access rights to each
other's sessions or objects. »). Plus loin (paragraphe 26), une
application appelle C_CloseAllSessions() et ça ne ferme pas les sessions
des autres applications.
La spécification de C_CloseAllSessions() en
rajoute une couche (page 159) : « C_CloseAllSessions closes all sessions
an application has with a token. slotID specifies the tokents slot. »
Enfin, la section 11.6, page 156, décrit en quelques points comment les
choses devraient raisonnablement se passer :
[...]
5. Call C_CloseSession once for each session that the application
has with the token, or call C_CloseAllSessions to close all the
applicationas sessions simultaneously.
As has been observed, an application may have concurrent sessions with
more than one token. It is also possible for a token to have concurrent
sessions with more than one application.
Appels non conformes au standard pour obtenir un résultat lui aussi non
conforme au standard.
According to Erwann ABALEA :Non. Le C_Finalize() ne coupe pas les autres sessions ouvertes sur le
token (je ne parle pas des sessions ouvertes par le même programme, qui
sont effectivement coupées à l'appel de C_Finalize()).
C_CloseAllSessions() coupe *toutes* les sessions ouvertes, mêmes celles
que *tu* n'as pas ouvertes.
On n'a pas lu le même PKCS#11 alors.
Dans celui qui se télécharge
sur le site web de RSA Labs,
il est bien spécifié que les sessions
sont spécifiques aux applications, et que le C_CloseAllSessions()
ferme toutes les sessions _de l'application qui appelle le
C_CloseAllSessions()_. L'exemple détaillé dans la section 6.6.7 est très
instructif de ce point de vue. On voit une application tenter d'accéder
à une session d'une autre application, et se faire jeter (paragraphe 8 :
« The attempt fails, because A and B have no access rights to each
other's sessions or objects. »). Plus loin (paragraphe 26), une
application appelle C_CloseAllSessions() et ça ne ferme pas les sessions
des autres applications.
La spécification de C_CloseAllSessions() en
rajoute une couche (page 159) : « C_CloseAllSessions closes all sessions
an application has with a token. slotID specifies the tokents slot. »
Enfin, la section 11.6, page 156, décrit en quelques points comment les
choses devraient raisonnablement se passer :
[...]
5. Call C_CloseSession once for each session that the application
has with the token, or call C_CloseAllSessions to close all the
applicationas sessions simultaneously.
As has been observed, an application may have concurrent sessions with
more than one token. It is also possible for a token to have concurrent
sessions with more than one application.
Appels non conformes au standard pour obtenir un résultat lui aussi non
conforme au standard.
Quelle version? Il y a la 1.0, 2.0 (non supportée), 2.01, et 2.10. :)
Quelle version? Il y a la 1.0, 2.0 (non supportée), 2.01, et 2.10. :)
Quelle version? Il y a la 1.0, 2.0 (non supportée), 2.01, et 2.10. :)