【问题标题】:Signing JAR to allow its classes to have internet access签署 JAR 以允许其类可以访问 Internet
【发布时间】:2014-05-19 01:45:04
【问题描述】:

我有一个需要 Internet 访问的 Java 应用程序,因为它通过 WebView JavaFX 组件嵌入了 Web 浏览器。

如果应用程序未打包在 Jar 中,则它可以毫无问题地执行。 但是,当打包在 Jar 中时,它无法再访问 Internet(例如,它无法加载所需的远程 Javascript 文件,例如 JQuery)。

我试图修复它签署 jar:

jarsigner myjar myalias

并且命令成功,尽管有以下警告:

警告:签名者证书将在六个月内过期。不 提供了 -tsa 或 -tsacert 并且这个 jar 没有时间戳。如果没有时间戳,用户可能无法在 签名者证书的到期日期 (2014-07-08) 或任何未来之后 撤销日期。

但是,应用程序仍然无法访问 Internet(嵌入式浏览器仍然无法加载远程脚本文件)。 我应该以其他方式签名吗?可能包括来自公认证书颁发机构的证书?

我还在我的~/.java.policy 文件中配置了如下权限:

keystore "file:<userpath>/.keystore", "jks";

grant signedBy "myalias" {
  permission java.security.AllPermission;
};

我正在尝试使用 OSX 10.9.2 和 Java 1.8.0-b132

更新

事实证明,如果应用程序是否嵌入到 Jar 中,嵌入式浏览器的执行方式会有所不同,这超出了安全权限。

我不知道这是什么原因,但是如果您不知道,这可能会导致您得出各种错误的结论。可能是一个讨厌的错误。

例如,我观察到的一件事是,当没有打包在 Jar 中时,像这样开始嵌入网页效果很好:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
...

但是当打包在一个 Jar 中时,这给了我一些问题(可能是 xhtml1-strict 被强制执行)所以我不得不用一个简单的&lt;html&gt; 标签替换它。

这不是唯一不同的行为,而是给我带来问题的主要问题。

【问题讨论】:

  • 定义“仍然无法访问 Internet”。会发生什么?
  • 无法加载嵌入式浏览器所需的远程脚本。显示所有 html 内容并且 Javascript 工作。
  • Trusted-Library 不适用于整个应用程序(顾名思义)。

标签: java security jar jar-signing


【解决方案1】:

更多信息会很好,您是否尝试使用本机打包进行部署,您是否使用 webstart 等等。

无论如何,根据您的问题,我建议您看看让 Netbeans 帮助您进行签名等。

我更喜欢创建基于 FXML 的应用程序,这样代码和界面就会保持分离。在这种情况下,我只是直接输入一些 HTML。

我已经使用 WebView 部署了许多 JavaFX 应用程序,没有任何问题。如果您在本地部署,我不会担心证书会在此时过期,除非您使用的是 webstart。

这里有一些运行良好的示例代码,它使用 WebView 并访问互联网来获取 jQuery。

主类:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author Sam
 */
public class WebViewTestJDK8 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

控制器:

import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;


public class FXMLDocumentController implements Initializable {

    @FXML
    private WebView webView;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                String html = "<html>\n"
                        + "<head>\n"
                        + "<title>jQuery Hello World</title>\n"
                        + " \n"
                        + "<script type=\"text/javascript\" src=\"http://code.jquery.com/jquery-1.2.6.min.js\"></script>\n"
                        + " \n"
                        + "</head>\n"
                        + " \n"
                        + "<body>\n"
                        + " \n"
                        + "<script type=\"text/javascript\">\n"
                        + " \n"
                        + "$(document).ready(function(){\n"
                        + " $(\"#msgid\").html(\"Hello World by JQuery\");\n"
                        + "});\n"
                        + " \n"
                        + "</script>\n"
                        + " \n"
                        + "Hello World by HTML\n"
                        + " \n"
                        + "<div id=\"msgid\">\n"
                        + "</div>\n"
                        + " \n"
                        + "</body>\n"
                        + "</html>";

                webView.getEngine().loadContent(html);
            }
        });

    }

}

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.web.*?>

<AnchorPane id="AnchorPane" fx:id="pane" prefHeight="367.0" prefWidth="446.0" xmlns:fx="http://javafx.com/fxml" fx:controller="webviewtest.jdk8.FXMLDocumentController">
  <children>
    <WebView fx:id="webView" prefHeight="367.0" prefWidth="446.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  </children>
</AnchorPane>

希望对你有帮助!

【讨论】:

  • 嗨@simsam7,我已经编辑了我的问题。 jar 没有嵌入到 html 中,但它嵌入了浏览器作为 JavaFX 组件。我没有使用 webstart,我不确定您提到的“本机包装”是什么。您的回答似乎暗示当前签名就足够了,对吗?请告诉我你是否知道如何调试它。
  • @Sergio,我的示例代码确实将浏览器嵌入为 JavaFX 组件——即“WebView”。老实说,我不会为试图让 JavaFX 编译并使用命令行正确签名而烦恼。如果这真的是你想要的,我会看看它。示例代码确实编译为 JAR(使用 Netbeans)并且工作正常。
  • 我不需要使用命令行编译或签名 jar。但我确实需要从命令行执行 jar,它实际上是从另一个程序调用的(所以 jar 应该在类路径中)。您能否发布示例的 jar 以查看它是否从命令行在我的计算机中执行?顺便说一句,您使用的是哪个操作系统?我正在使用 OSX 10.9.2。
  • 我同时使用 Linux (Ubuntu) 和 Windows 8。这个特殊的 JAR 是在 Windows 上编译的,但在 Linux 上运行良好,从命令行启动。这是 JAR 的链接:sharesend.com/xirm07x0
  • 谢谢。你能告诉我你是如何从终端执行的吗?我尝试在下载目录中使用“java webviewtest.jdk8.WebViewTestJDK8 classpath=WebViewTest-JDK8.jar”,但它不起作用。
猜你喜欢
  • 2021-10-13
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2020-01-21
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多