web-dev-qa-db-fra.com

Fournisseur SunPKCS11 dans Java 9

Jusqu'à Java 8 le fournisseur SunPKCS11 a été chargé comme ceci:

Provider provider = new Sun.security.pkcs11.SunPKCS11 (new ByteArrayInputStream (configFile.getBytes ()));
Security.addProvider (provider);

configFile est une chaîne avec les paramètres de configuration. Ainsi, si l'application devait fonctionner avec plusieurs cartes à puce connectées, elle pourrait créer plusieurs fournisseurs. Pour accéder à chaque fournisseur, le nom utilisé était "SunPKCS11-" suivi du nom que nous avons indiqué dans la configuration.

Dans Java 8, le Sun.security.pkcs11.SunPKCS11 classe a été supprimée dans le JDK. J'ai donc dû programmer l'appel précédent par réflexion.

Le fonctionnement du fournisseur PKCS # 11 dans Java 9 semble très différent:

  • Le SunPKCS11 le constructeur a été remplacé par un constructeur vide. La configuration est chargée par la méthode "configure", il est donc obligatoire qu'elle soit dans un fichier sur le disque et je ne peux plus la charger via un flux vers une chaîne.

  • Si nous essayons d'utiliser la réflexion, les avertissements suivants apparaissent:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by PruebaTarjeta (file:/C:/temp/pkcs11Java9/classes/) to constructor
Sun.security.pkcs11.SunPKCS11()
WARNING: Please consider reporting this to the maintainers of PruebaTarjeta
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
  • Dans Java 9, un fournisseur SunPKCS11 est généré automatiquement et figure dans la liste des fournisseurs de chiffrement. Il peut être obtenu à partir de la liste et configuré. Le problème est que vous ne pouvez avoir qu'un seul PKCS # 11 fournisseur chargé dans la liste. Le documentation Java 9 indique que nous pouvons obtenir le fournisseur PKCS # 11 avec "SunPKCS11-" suivi du nom que nous avons indiqué dans la configuration, mais ce n'est pas vrai. Si nous regardons dans la liste des fournisseurs, le seul est "SunPKCS11", donc je ne peux pas avoir un fournisseur par carte à puce.

Est-ce que cela arrive aussi à quelqu'un d'autre? Toute solution?

19
Pepe Gutiérrez

J'ai remarqué en regardant le javadoc pour configure :

Appliquez l'argument de configuration fourni à cette instance de fournisseur et renvoyez le fournisseur configuré. Notez que si ce fournisseur ne peut pas être configuré sur place, un nouveau fournisseur sera créé et renvoyé . Par conséquent, les appelants doivent toujours utiliser le fournisseur renvoyé.

Cela m'indique que le modèle de prototype est utilisé ici, et que le nouveau flux de contrôle pour créer plusieurs fournisseurs serait quelque chose comme:

Provider prototype = Security.getProvider("SunPKCS11");
Provider provider1 = prototype.configure(...);
Provider provider2 = prototype.configure(...);
...

Quant à l'utilisation d'arguments directement au lieu d'un nom de fichier, j'ai fait quelques recherches dans le code source et j'ai trouvé ceci dans Sun.security.pkcs11.Config:

Config(String fn) throws IOException {
    this.filename = fn;
    if (filename.startsWith("--")) {
        // inline config
        String config = filename.substring(2).replace("\\n", "\n");
        reader = new StringReader(config);

Notez la ligne avec filename.startsWith("--"), ce nom de fichier vient directement de l'argument à configure. Donc vous devriez pouvoir passer les arguments de configuration sous forme de chaîne tant que vous commencez la chaîne avec --, Puis délimitez vos paires key=value Avec \n. (Je ne suis actuellement pas en mesure de tester cela cependant).

Cependant, je ne peux trouver ce fait publiquement documenté nulle part, il peut donc être sujet à changement, ainsi que fonctionner différemment pour différents fournisseurs, c'est-à-dire utiliser à vos risques et périls! .

15
Jorn Vernee

Le problème est que vous ne pouvez avoir qu'un seul fournisseur PKCS # 11 chargé dans la liste.

La solution de votre problème semble être définie dans le doc lié lui-même.

Pour utiliser plusieurs emplacements par PKCS#11 implémentation, ou pour utiliser plusieurs PKCS#11 implémentation, il suffit de répéter l'installation pour chacun avec le fichier de configuration approprié. Ceci se traduira par une instance de fournisseur Sun PKCS # 11 pour chaque emplacement de chaque PKCS#11 implémentation.

Exemple de configuration suivant le format attribute=value serait:

name = FooAccelerator
library = /opt/foo/lib/libpkcs11.so
slot = 1

Vous pouvez en outre utiliser Attributs dans le fichier de configuration du fournisseur PKCS # 11 dans le même lien pour configurer plusieurs fournisseurs avec différents ID d'emplacement et listIndex et différents attributs.

0
Naman