使用https来呼叫网络服务

时间:2016-03-15 11:04:45

标签: java xml eclipse web-services jboss

我目前正在使用http的网络服务!我被要求更改(使用) https 而不是调用此网络服务!

我正在使用eclipse kepler和JBoss EAP6.1

我在互联网上发现我必须创建密钥库并编辑 server.xml 文件。 问题是我在这个xml版本中找不到JBOss文件[我有一个 standalone.xml 文件是否相同? ] 并且为了生成密钥库我必须这样做吗? 谢谢你的配件! 如果我走错了路,你能不能指引我走正确的道路?

再次感谢!

3 个答案:

答案 0 :(得分:1)

获取HTTPS网址的证书。 (您可以通过在浏览器中键入URL然后从浏览器证书安装位置提取证书来完成此操作)。之后,将此证书添加到JBOSS服务器使用的应用程序的JRE中。这很可能是你在系统环境中给出的JRE。您可以谷歌获取如何在密钥库中安装证书。可能这会起作用。

答案 1 :(得分:0)

您通过https呼叫远程网络服务,对吧?

好的,您可以在密钥库中导入远程服务的证书(有很多指南,请查看this other question示例)

OR

您可以绕过整个https证书(在远程调用之前启动此静态方法):

/**
 * Bypassing SSL certificate check
 * 
 * @throws Exception
 */
public static void doTrustToCertificates() throws Exception {
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            }

            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            }
        }
    };

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    HostnameVerifier hv = new HostnameVerifier() {
        @Override
        public boolean verify(String urlHostName, SSLSession session) {
            if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                logger.warn("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
            }
            return true;
        }
    };
    HttpsURLConnection.setDefaultHostnameVerifier(hv);
}

答案 2 :(得分:0)

除了回答@Rahul之外,您还可以在Windows操作系统的命令提示符下使用以下命令导入证书(.cer)文件:

(假设您已设置所需的Java路径)

keytool -importcert -file <path of certificate>\<YourCertificateName>.cer -keystore D:\java\jdk1.7.0_40\jre\lib\security\cacerts -alias <certificateAliasName> -storepass <Password>

通常默认<password>是&#39; changeit&#39;。

如果webservice用于第三方客户端,那么您可以使用HttpClient进行交互。我不确定您使用该Web服务执行什么样的操作。我假设您要将一些xml发送到该URL。您可以参考以下代码:

            HttpPost httppost = new HttpPost(url);
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY,
                    new UsernamePasswordCredentials(username, password));
            CloseableHttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
            StringEntity entity = null;
            try {
                entity = new StringEntity(xmlToSend);
            } catch (UnsupportedEncodingException e) {
                LOG.error("Unsupported Encoding ", e);
            }
            entity.setContentType("text/xml");
            httppost.setEntity(entity);
            try{
                CloseableHttpResponse response = client.execute(httppost);
                returnCode = response.getStatusLine().getStatusCode();
                EntityUtils.consume(entity);
                LOG.debug("HttpResponse :" + EntityUtils.toString(response.getEntity()));
            }catch(IOException e){
                LOG.error("Error occured while sending the xml");
            }