【问题标题】:Use https to call a webservice使用 https 调用 web 服务
【发布时间】:2016-06-30 18:50:08
【问题描述】:

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

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

我在互联网上发现我必须创建一个 keystore 并编辑 server.xml 文件。 问题是我在这个JBOss 版本中找不到xml 文件[我有一个 standalone.xml 文件是一样的吗? ] 对于密钥库 where 的生成,我必须这样做吗? 谢谢你的回答! 如果我走错了路,请您重新引导我走正确的路吗?

再次感谢!

【问题讨论】:

    标签: java xml eclipse web-services jboss


    【解决方案1】:

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

    【讨论】:

    • 如何获取HTTPS url的证书?我是 web 服务的新手,所以很困惑。
    • @Rohitjha :与我在答案中提到的相同。在浏览器中写下您的URL?wsdl。并从浏览器中提取证书。 ?wsdl 给出任何 web 服务的 wsdl
    【解决方案2】:

    您是通过 https 调用远程 Web 服务,对吗?

    好的,您可以在密钥库中导入远程服务的证书(有关此的大量指南,以 this other question 为例)

    你可以绕过整个 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);
    }
    

    【讨论】:

      【解决方案3】:

      除了@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>
      

      通常默认&lt;password&gt; 是'changeit'。

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

                  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");
                  }
      

      【讨论】:

      • 我真的不应该从哪里开始我应该配置服务器的 xml 文件,如果是的话,是哪一个?如果我必须从哪里创建或导入一个证书,我应该这样做....最后,我正在开发的网络服务是为另一家公司服务的,所以如果我将证书添加到 jdk 目录,那将如何为公司工作?
      • 我过去也遇到过类似的情况,所以在您的情况下,如果您的网络服务正在为其他公司工作,那么理想情况下您不应该导入任何证书(前提是您可以访问客户端的 jdk/jre)。我使用了 HttpClient 4.x,因为我必须以 xml 的形式向客户(其他公司)发送一些数据。你有该公司的 https URL 的 SLA 吗?我的意思是该公司是否有任何机制可以使用您的网络服务?如果是,那么您可以使用 httpclient(还有其他 API!)。如果您需要代码方面的帮助,请告诉我。
      • @Suyash 你能回答这个问题吗?我没有使用任何框架来创建 Web 服务。 stackoverflow.com/questions/60976773/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2017-05-09
      • 2012-12-05
      • 2011-08-03
      • 2017-07-08
      相关资源
      最近更新 更多