Applet Java manifeste - Permettre à tous les Appelant Admissibles à base de Code
de Java 7u45 une applet affiche un message d'avertissement (même si elle est signée de confiance avec un cert) si une page web essaie d'interagir avec lui via javascript et que la page n'est pas répertorié dans le manifeste de l'Appelant-Admissibles-attribut Codebase.
Release notes à propos de ce changement: http://www.oracle.com/technetwork/java/javase/7u45-relnotes-2016950.html
Oracle billet de blog à propos de ce bug: https://blogs.oracle.com/java-platform-group/entry/7u45_caller_allowable_codebase_and
Description de L'attribut: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#caller_allowable
j'ai essayé juste un Joker (*), mais j'ai toujours l'avertissement.
y a-t-il un autre moyen que d'énumérer toutes les bases de données où il peut être utilisé?
la raison c'est un problème pour moi est que cette applet fonctionne sur de nombreuses machines et réseaux différents, mais toujours sur intranets à divers endroits. Cette applet a également besoin de communiquer avec javascript parce qu'il parle à des échelles USB locales et affiche des résultats et interagit avec la page.
Applet en question: https://github.com/JaggedJax/CIO_Scale
16 réponses
Supprimer L'attribut de bibliothèque de confiance semble être obligatoire pour obtenir appelant-Allowable-Codebase de travail, pas plus d'Avertissements. Cependant, cela brise Java 7 Update 21-40 qui traite le code JavaScript qui appelle du code dans un applet signé avec toutes les permissions comme le code mixte et les dialogues d'avertissement sont soulevées si les fichiers JAR signés ne sont pas étiquetés avec L'attribut Trusted-Library=true.
Mes conclusions sont les mêmes:
Cela empêche les mises en garde avec Java 7u21 - 7u40:
Manifest-Version: 1.0
Trusted-Library: true
Ce exclusif empêche les mises en garde avec Java 7u45:
Manifest-Version: 1.0
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
le Mélange des deux ne fonctionnent pas dans 7u45.
et Maintenant? Quelqu'un a trouver un moyen pour permettre SIGNÉ applets avec "toutes les autorisations" à s'exécuter sans avertissements dans les deux JRE versions?
Ce que l'enfer est le problème avec oracle?
cela sera corrigé dans une prochaine version, selon le post du blog oracle:
https://blogs.oracle.com/java-platform-group/entry/7u45_caller_allowable_codebase_and
ils reconnaissent l'erreur "ces deux attributs doivent fonctionner ensemble pour supporter les différentes versions des installations du client". Mais pour l'instant, leur solution est: "la solution actuelle serait de favoriser l'utilisation de Caller-Allowable-Codebase over la vieille bibliothèque de confiance. "
j'ai eu le même problème. La Solution pour moi était d'utiliser les mêmes paramètres dans le manifeste que Oracle utilisé sur la page donwload dans applet pour vérifier la version java http://www.java.com/en/download/installed.jsp Leur applet ne fait apparaître aucun avertissement.
donc la solution est:
Manifeste-Version: 1.0
Codebase: *
Autorisation: toutes-permissions
Application-Bibliothèque-Admissible À Base De Code: *
Appelant Admissibles À Base De Code: *
Application - Name: APPNAME
il fonctionne sur:
1.7.0_17-b02
1.7.0_25-b17
1.7.0_45-b18
de l'oracle:
Zone: Déploiement / Plugin Synopsis: Caller-Allowable-Codebase peut être ignoré lorsqu'il est utilisé avec la bibliothèque de confiance.
si un jar signé de confiance utilise L'attribut caller-Allowable-Codebase manifest avec Trusted-Library, alors L'entrée Caller-Allowable-Codebase manifest sera ignorée et, par conséquent, un appel JavaScript -> Java affichera L'avertissement natif LiveConnect. La solution est de supprimer la bibliothèque de confiance l'entrée du manifeste.
http://www.oracle.com/technetwork/java/javase/7u45-relnotes-2016950.html
la seule solution que je puisse imaginer qui fonctionne avec 7u45 et les versions des bibliothèques de confiance (7u21, 7u25 et 7u40) est de créer deux bocaux différents avec des manifestes différents, puis de détecter la version de l'utilisateur et de charger le bon.
la version principale servie aux versions antérieures à 7u21 et 7u45 et plus aura la nouvelle base de données Caller-Allowable-Codebase et aucune entrée de bibliothèque de confiance. La seconde version produite aura une bibliothèque de confiance et ne sera servie qu'à 7u21, 7u25 et 7u40.
Voici une macro ant pour créer le nouveau bocal avec le manifeste modifié:
<macrodef name="addtrustedlibrarytojar">
<attribute name="jarpath" />
<attribute name="newjarpath" />
<sequential>
<echo>Unzipping @{jarpath} to add Trusted-Library</echo>
<mkdir dir="build/temp_trusted_library" />
<unjar src="@{jarpath}" dest="build/temp_trusted_library" />
<echo>Inserting Trusted-Library in manifest</echo>
<replaceregexp match="^" replace="Trusted-Library: true${line.separator}" flags="s">
<fileset dir="build/temp_trusted_library/META-INF" includes="MANIFEST.MF"/>
</replaceregexp>
<echo>Creating @{newjarpath}</echo>
<zip file="@{newjarpath}" basedir="build/temp_trusted_library" />
<echo>Deleting build/temp_trusted_library directory</echo>
<delete dir="build/temp_trusted_library" />
</sequential>
</macrodef>
appelez la macro comme ceci pour chaque pot qui a besoin du changement fait:
<addtrustedlibrarytojar jarpath="dist/myapplet.jar" newjarpath="dist/myapplet_tl.jar" />
N'oubliez pas de signer le nouveau bocal. Si elle a déjà été signée, cette modification invalidera la signature.
nous utilisons la bibliothèque PluginDetect pour détecter la version de Java. Il suffit d'extraire PluginDetect_Java_Simple.js et getJavaInfo.pot. Ce code obtiendra la version java:
<script type="text/javascript" src="js/PluginDetect_Java_Simple.js"></script>
<script type="text/javascript">
var javaVersionDetected = '0';
function javaDetectionDone(pd) {
javaVersionDetected = pd.getVersion("Java");
if (console) console.info('Detected java version: ' + javaVersionDetected);
}
PluginDetect.onDetectionDone("Java", javaDetectionDone, "js/getJavaInfo.jar", null);
</script>
nous utilisons javascript pour lancer nos applets, nous l'utilisons donc pour choisir entre les applets standard et ceux de la bibliothèque de confiance:
if (javaVersionDetected === '1,7,0,21' || javaVersionDetected === '1,7,0,25' || javaVersionDetected === '1,7,0,40') {
if (console) console.debug('Using TL applet');
attribs['archive'] = 'applets/myapplet_tl.jar';
}
else {
if (console) console.debug('Using normal applet');
attribs['archive'] = 'applets/myapplet.jar';
}
j'ai eu le même problème, donc j'ai enlevé la bibliothèque de confiance=vrai de mon manifeste.MF, appelant de travail-admissible-attribut Codebase amende.
pour la mise à jour 1.7.0_25 (et probablement 21-40), paramétrage des paramètres de sécurité sur le support dans le Panneau de configuration Java -> onglet Sécurité supprime l'interrogation lors de l'utilisation des étiquettes de manifestes pour la mise à jour 1.7.0_45.
cet ensemble d'attributs permet à l'applet de charger sans avertissements en Java 7u45:
Application-Name: ...
Main-Class: com...
Sealed: true
Codebase: *
Caller-Allowable-Codebase: *
Permissions: all-permissions
nous avons testé sur les JVM suivantes:
- Java 6u20 (OK, bien duh!)
-
Java 7u21- doit inclure une bibliothèque de confiance pour éviter l'avertissement -
Java 7u25- doit inclure une bibliothèque de confiance pour éviter l'avertissement -
Java 7u40- doit inclure une bibliothèque de confiance pour éviter l'avertissement - Java 7u45
ainsi le long et court est nous avons un dilemme; pour n'avoir aucun avertissement sur 7u21, 7u25 et 7u40 vous devez inclure bibliothèque de confiance:vrai, et pour n'avoir aucun avertissement sur 7u45 vous devez omettre cette propriété.
Merci Oracle pour un Kobayashi Maru-nous vous aimons.
je constate maintenant que certains de mes utilisateurs reçoivent encore cet avertissement" code mixte signé et non signé " (en raison des appels LiveConnect dans la page web à l'applet), même si j'ai mis Caller-Allowable-Codebase correctement, et la différence entre ceux qui l'obtiennent et ceux qui ne l'obtiennent pas est de savoir s'ils ont applet .la mise en cache des fichiers jar est activée dans l'hôte client. Ceux qui permettent à Java de conserver des fichiers temporaires sur le client (i.e., allow applet .les fichiers jar à être mis en cache) obtenir l'avertissement, et ceux qui ont désactivé la mise en cache (parce que la mise en cache des applets n'a jamais fonctionné correctement) ne reçoivent pas l'avertissement. Aller à la figure.
sans utiliser bibliothèque de confiance et le réglage:
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
ne marche pas pour moi, et je vois toujours l'avertissement.
Update : essayé aussi avec http://... mais ne fonctionne pas non plus.
Update2 : semble encore pire. Je n'ai pas mis à jour 7u40 (à 7u45) mais la console Java (débogage complet) affiche le texte "LiveConnect 1.7.45". Après cela, mon Javascript- > les appels Java sont bloqués .
Update 3 : j'ai remarqué que mon avertissement Affiche Application et Publisher = UNKNOWN. Je croyais avoir:
Application-Name: MyApplet
Implementation-Vendor: MyCompany
j'ai essayé D'utiliser JDK7u45 au lieu de JDK7u5 que j'utilisais.
pour désactiver ce popup" Security Warning " et d'autres popups connexes en utilisant la version Java 8 Update 45 JRE.
Trusted-Library: true
Caller-Allowable-Codebase: *.mycompany.com
Note: le popup d'avertissement de sécurité n'était pas désactivé avec les caractères génériques * et *.com.
nous avons eu ce problème aussi - nous construisions avec 1.4.2, sur la théorie que les clients pourraient ne pas avoir un plugin JRE mis à jour. En dépit de la mise en place des nouveaux attributs de manifeste, nous avons toujours eu les Avertissements popup dans le 1.7_u45 JRE. Nous avons reconstruit avec 1,6, et les avertissements ont disparu.
EDIT: comme il s'avère, notre application faisait quelque chose de différent si le fichier était dans un répertoire différent -- spécifiquement, il ne tentait pas d'accéder aux manifestes jar signés applet. Donc le fait que le fichier se trouve dans un répertoire différent n'est pas pertinent. Les informations ci-dessous ne sont donc pas exactes. J'ai décidé de détailler la vraie raison de l'avertissement dans une nouvelle question: à partir de Java 7 update 45, on ne peut plus chercher des informations manifestes sans déclencher un avertissement?
malheureusement, la solution donnée par Oracle et d'autres ici pour contourner le problème de update 45 ne fonctionne pas si votre application a besoin d'accéder à des fichiers dans un répertoire différent de celui d'où l'application est lancée.
avec mon application Web start, tout a bien fonctionné avec l'attribut" Trusted-Library " qui devait être ajouté pour 7u21. Avec 7u45, suppression de l'attribut" Trusted-Library " et ajouter tous les attributs supplémentaires dont il est question dans les autres réponses ne fonctionnera pas -- je recevrai le même avertissement que si vous exécutiez 7u21 sans l'attribut de bibliothèque de confiance (en indiquant que l'application contient à la fois du code signé et non signé).
il m'a fallu une éternité pour comprendre cela, parce que pour des raisons très inexplicables Oracle a décidé de ne pas imprimer aucune indication de ce que le code "non signé" est dans sa console, même en cours d'exécution au maximum traçage (niveau 5). Mais, fondamentalement, notre application a besoin d'accéder à un fichier de configuration qui peut être utilisé par l'utilisateur pour configurer les propriétés de l'application (par exemple, le niveau de journalisation de notre application). Ce fichier de configuration est un vieux fichier texte. Et nous enregistrons le fichier de configuration dans un répertoire co-situé à l'endroit où l'application s'exécute à partir de: ..\config\app.propriété. Nous accédons à ce fichier dans le cadre de la routine d'initialisation du pot principal. C'est là que l'avertissement se produit.
le contournement ici? Move app.propriétés dans le même répertoire où l'application est en cours d'exécution (et changer la référence dans le jar juste "app.propriété.)" Voilà, ça marche -- plus d'Avertissements (tant qu'on utilise les attributs codebase susmentionnés). Ce que l'enfer Oracle???
malheureusement, parce que notre application permet des fichiers de configuration personnalisés sur une base par utilisateur, il n'est pas aussi simple pour nous de mettre le fichier de configuration dans le répertoire de démarrage de l'application-depuis que ce n'est pas personnalisé sur une par utilisateur, nous ne pourrions autoriser qu'un utilisateur par machine à utiliser l'application simultanément.
j'ai cherché dans la documentation du Manifeste de Java pour voir s'il y avait un moyen de rendre le répertoire de fichier de configuration" sûr " de sorte que le chargement de ce fichier ne cause pas l'avertissement. La seule chose à laquelle je pense est soit d'être capable d'utiliser L'attribut Class-Path ou une combinaison des attributs de L'Extension ( http://docs.oracle.com/javase/7/docs/technotes/guides/plugin/developer_guide/extensions.html ), cependant tout cela semble conçu autour du but des pots, pas seulement des fichiers réguliers...
des idées? Et puisque Oracle a l'intention de corriger la question de la bibliothèque de confiance de toute façon, est de venir avec un (potentiellement) solution de contournement grandiose autour de cela vaut même la peine de l'effort? Grrr....
j'ai trouvé quelque chose d'étrange avec manifeste.MF fichier dans le champ d'application de la dernière Java de problème de sécurité avec de nouveaux attributs " Appelant Admissibles à base de Code ".
J'ai eu quelques problèmes, pourquoi ce nouvel attribut n'a pas été utile pour moi et j'ai commencé l'enquête
( Attention !: elle peut être liée qu'à mon local de la configuration de l'ordinateur - parce que je n'avais jamais vu de tels problèmes sur stackoverlow).
avait été amélioré selon la nouvelle caractéristique de sécurité:
Manifest-Version: 1.0
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
et *.jar a été construit, mais sans de signature.
, puis j'ai déballé mon *.jar et cherché dans le dossier META-INF dans le manifeste.MF, où source manifeste.mf doit être généré.
et j'ai été embarrassé par l'absence de dernière ligne, il a regardé ceci:
Manifest-Version: 1.0
Application-Library-Allowable-Codebase: *
j'ai testé ce comportement plusieurs fois et découvert, que la dernière ligne a toujours été échangée à l'espace blanc.
Donc, si ça peut aider quelqu'un, ajoute juste à la fin du Manifeste.Fichier MF un attribut non significatif, comme Codebase: *
, qui sera découpé pendant *.pot de construire.
si vous créez un fichier correctif manifeste, n'oubliez pas de vivre une ligne vide à la fin, sinon ça ne marchera pas. Par exemple vous pouvez faire un patch comme:
Permissions: all-permissions
Codebase: *
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
Mais vous devez ajouter une ligne vide (dans l'exemple 5 lignes au lieu de quatre!)
et ensuite l'ajouter au manifeste:
jar uvfm jarName.jar permissions.txt