使用谷歌地图api时获得“同行未经过身份验证”

时间:2013-04-30 11:46:37

标签: java google-maps-api-3 httpclient

我在创建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());
            }

1 个答案:

答案 0 :(得分:0)

如果通过"创建javafx包"你的意思是创建一个Self-Contained Application,原因是sun {{{}}中详述的默认自包含应用程序包中不包含sun cryptography扩展。

从部署博客引用,有关于将sun jce提供程序包含在JavaFX 2.2的自包含应用程序中的说明。可能对于JavaFX部署工具的未来版本,将提供更方便的方法来实现此目的。

  

微调应用程序包

     

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

     

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

     

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

     

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

     

以下是您可以使用的示例脚本(由John Petersen提供)在Windows平台上将jre/lib/ext/sunjce_provider.jar添加到MyApp的应用程序包中。脚本使用Javascript,但您也可以使用VBScript for 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,则需要制定自己的解决方案。