签署JAR以允许其类访问Internet

时间:2014-04-07 00:41:26

标签: java security jar jar-signing

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

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

我尝试用以下方法修复它与jar的签名:

jarsigner myjar myalias

命令成功,但有以下警告:

  

警告:签名者证书将在六个月内到期。没有   提供了-tsa或-tsacert,这个jar没有带时间戳。如果没有时间戳,用户可能无法在此之后验证此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被强制执行)所以我不得不用一个简单的<html>标签替换它。

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

1 个答案:

答案 0 :(得分:1)

更多信息会很棒,您是否尝试使用原生包装进行部署,是否使用了webstart等。

无论如何,基于你的问题,我建议你看看让Netbeans帮你签名等。

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

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

这里有一些工作正常的示例代码,它使用WebView&amp;访问互联网获取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>

希望它有所帮助!