2

创建 javafx 包后,我使用 google map api 得到“peer not authenticated”。直接从代码或可执行 jar 文件运行时工作正常,以下是我得到的异常,

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
   at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:397)
   at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
   at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
   at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
   at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
   at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
   at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
   at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
   at com.precisionhawk.flightplanner.utils.LocationUtils.performAPICall(LocationUtils.java:109)
   at com.precisionhawk.flightplanner.utils.LocationUtils.getAutocompleteResults(LocationUtils.java:74)
   at com.precisionhawk.flightplanner.controls.AddressTextField$1$1.run(AddressTextField.java:103)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
   at java.util.concurrent.FutureTask.run(FutureTask.java:166)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)

我正在使用 http 客户端来调用 api。我已经尝试绕过 X509 证书,但仍然没有运气

下面是我的代码

SSLContext ctx = null;
 try {

            SSLUtilities.trustAllHostnames();
            SSLUtilities.trustAllHttpsCertificates();

            HttpClient httpClient = new DefaultHttpClient();

            HttpGet getRequest = new HttpGet(url.toString());
            getRequest.addHeader("accept", "application/json");

            HttpResponse response = httpClient.execute(getRequest);

            if (response.getStatusLine().getStatusCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatusLine().getStatusCode());
            }
            BufferedReader br = new BufferedReader(
                    new InputStreamReader((response.getEntity().getContent())));
            String inputLine;

            while ((inputLine = br.readLine()) != null) {
                result = result + inputLine;
            }
            br.close();
            LOG.info("Autocomplete API call Response: " + result);
            }
            catch (Exception e) {
                LOG.error("Autocomplete  Exception: "+e.getMessage());
            }
4

1 回答 1

0

如果“创建 javafx 包”是指创建自包含应用程序,那么原因是 sun 加密扩展不包含在JavaFX 部署博客中详述的默认自包含应用程序包中。

从部署博客中引用,有关于在 JavaFX 2.2 的自包含应用程序中包含 sun jce 提供程序的说明。对于 JavaFX 部署工具的未来版本,可能会提供一种更方便的方式来执行此操作。

微调应用程序包

如果您使用打包工具来生成可安装的包,则可能需要在将应用程序映像打包到安装程序之前对其进行调整。为什么?例如,您可能想要签署应用程序,因此它似乎不受操作系统的信任(例如,为了取悦 Mac OS X Gatekeeper)。

此外,默认情况下,自包含应用程序不包含 Java 运行时的完整副本。我们只包括一组强制性组件。采用这种方法的部分原因是我们希望减小封装尺寸。但是,在某些情况下,您的应用程序可能依赖于这些可选组件,在这种情况下,您将需要一种将它们添加到私有运行时的方法。例如,如果jre/lib/ext/sunjce_provider.jar缺少 https 连接将无法工作。

目前,这可以通过提供在填充应用程序映像后执行的自定义配置脚本来实现。与上面带有图标的示例一样,您需要启用详细输出以查找脚本文件的名称,然后将其拖放到打包工具可以找到它的位置。请注意,脚本语言也是特定于平台的。目前我们只支持 Mac/Linux 的 shell 和 windows 上的 Windows Script。

您如何找出应用程序图像的位置?当前自定义脚本在存储配置文件的目录中运行,但可以使用相对平台特定路径访问应用程序映像。您可以从详细输出或通过将环境变量设置JAVAFX_ANT_DEBUG为 true 来获取此路径以保留中间构建工件。

这是示例脚本(由 John Petersen 提供),您可以使用它添加jre/lib/ext/sunjce_provider.jar到 Windows 平台上的 MyApp 应用程序包中。使用 Javascript 编写脚本,但您也可以使用 VBScript 编写 Windows 脚本。

<?xml version="1.0" ?>  
<package>  
   <job id="postImage">  
    <script language="JScript">  
     <![CDATA[  
        var oFSO = new ActiveXObject("Scripting.FileSystemObject");  
        var oFolder = oFSO.getFolder(".");  
        var from = oFolder.path + "\\MyApp\\app\\sunjce_provider.jar";  
        var to = oFolder.path + "\\MyApp\\runtime\\jre\\lib\\ext";  
        if (!oFSO.FolderExists(to)) {  
          oFSO.CreateFolder(to);  
        }  
        to += "\\";  
        oFSO.CopyFile(from, to);  
     ]]>  
    </script>  
   </job>  
</package>

我正在使用 Maven。那么我应该如何从 pom.xml 调用这个脚本,它将在 jre/lib/ext 文件夹中创建 jar?

我不是专家。上面的解决方案适用于 apache ant。如果您希望继续使用 maven,您将需要制定自己的解决方案来解决此问题。

于 2013-04-30T17:03:53.783 回答