Nouvelle exception java.security.AccessControlException in Java 8

Auparavant, le code de réseau java.security.AccessControlException lançait une java.security.AccessControlException dans une applet Java entièrement en sandbox.

 Can't get socket 2255: java.security.AccessControlException: access denied ("java.net.SocketPermission" "50.31.1.13:2255" "connect,resolve") 

Qu’est-ce que Oracle a changé – quel nouveau cerceau de sécurité faut-il sauter pour que les sockets fonctionnent?

Cela a fonctionné / fonctionne en Java 1.7.0_55 et toutes les versions précédentes de Java.

Cela a en effet changé… De la documentation

http://docs.oracle.com/javase/8/docs/technotes/guides/jweb/enhancements-8.html

  • Pour les RIA de sandbox, URLPermission est maintenant utilisé pour permettre aux connexions de revenir au serveur à partir duquel elles ont été démarrées. URLPermissions est accordé en fonction du protocole, de l’hôte et du port de la source de code. Ce changement a les implications suivantes:

    • Pour les RIA de sandbox, SocketPermissions pour l’hôte d’origine n’est plus accordé. Les appels depuis le code JavaScript vers le RIA ne sont pas accordés aux SocketPermissions commençant à partir du JDK 8.

En d’autres termes, vous ne pouvez plus créer un nouveau Socket dans un sandbox. Vous pouvez uniquement créer une URL utilisant le même hôte, le même port et le même protocole que la base de code à partir d’un applet entièrement en mode bac à sable.

À moins que Oracle ne change d’avis, il est impossible pour une applet en mode bac à sable de contourner ce problème (sinon, le concept de sécurité entier serait brisé).

Pour moi, il semblerait que Oracle ait décidé de renforcer les exigences de sécurité des applets. Voici ce que j’ai trouvé sur CodeRanch :

Assurez-vous que SecurityManager accepte les vérifications d’autorisation liées aux sockets:

 System.getSecurityManager().checkPermission(new SocketPermission("50.31.1.13:2255", "accept, connect, listen")); //I used IP address from your exception 

Maintenant, vérifications liées aux threads:

 System.getSecurityManager().checkPermission(new RuntimePermission("readerThread")); 

Ces lignes doivent être placées au début de main() méthode main() .

La deuxième chose à faire est de signer votre fichier jar/war/ear . Commencez par créer un magasin de clés:

 keytool -genkey -alias philip -keystore keystore 

Maintenant, placez-y le certificate signé par l’autorité de certificateion dans votre fichier de clés certifiées ou créez un certificate auto-signé:

 keytool -selfcert -alias philip -keystore keystore 

Et enfin, signez le fichier:

 jarsigner -keystore keystore -signedjar WhatYouWantTheSignedJarToBeNamed.jar ThePreviousJARYouCreated.jar philip 

En réalité, pour les fichiers JAR signés, la magie liée à SecurityManager peut-être une surcharge, mais à mon avis, il est plus prudent de faire les deux.

Sachez également que vous pouvez parfois avoir besoin de signer des jar externes, pas seulement le jar où réside votre applet.

Ajoutez l’autorisation dans client.policy (pour le client d’application) ou dans server.policy (pour les modules Web) pour l’application devant définir la propriété. Par défaut, les applications ont uniquement le droit de lecture sur les propriétés.

Par exemple, pour accorder une autorisation de lecture / écriture à tous les fichiers du répertoire codebase, ajoutez ou ajoutez les éléments suivants à client.policy ou server.policy:

grant codeBase “fichier: /…/ build / sparc_SunOS / sec / -” {autorisation java.util.PropertyPermission “*”, “lecture, écriture”; };