2013-10-29 81 views
0

我在这个完整的初学者,我一直在试图与服务器的连接相当长的一段时间在服务器上验证使用HTTP共享客户端

public class Test { 

    public static void main(String[] args) throws ClientProtocolException, IOException { 

    DefaultHttpClient httpClient = new DefaultHttpClient(); 

     httpClient.getCredentialsProvider().setCredentials(
       new AuthScope("9.5.127.34", 80), 
       new UsernamePasswordCredentials("root", "passw0rd")); 

     String url_copied_from_firebug = "https://9.5.127.34/powervc/openstack/volume/v1/115e4ad38aef463e8f99991baad1f809//volumes/3627400b-cd98-46c7-a7e2-ebce587a0b05/restricted_metadata" 
     HttpGet httpget = new HttpGet(url_copied_from_firebug); 
     HttpResponse response = httpClient.execute(httpget); 

     BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
     String line = ""; 
     while ((line = rd.readLine()) != null) { 

      System.out.println(line); 

      } 
     } 
} 

我获得当我尝试错误运行该代码是

异常线程“main” javax.net.ssl.SSLPeerUnverifiedException:同行不认证

我试图改变从80到443的端口号,但它无法正常工作。我认为我从它开始,可能会错过很多东西。请指向正确的方向。

Thanx提前。

回答

1

你的问题不是HTTP身份验证。您的http客户端无法验证具有证书颁发机构的服务器的ssl证书 - 这可能是因为您正在使用自签名证书。

查看HttpClient documentation,获取有关如何自定义客户端以允许自签名证书的说明。

下面是创建接受所有证书和主机名的的HttpClient的例子 - 只记得与服务器使用它,你相信:

private DefaultHttpClient getSSLHttpClient(final URL url) throws RestClientException { 
    try { 
     final X509TrustManager trustManager = createTrustManager(); 
     SSLContext ctx = SSLContext.getInstance("TLS"); 
     ctx.init(null, new TrustManager[]{trustManager}, null); 
     SSLSocketFactory ssf = new SSLSocketFactory(ctx, createHostnameVerifier()); 
     AbstractHttpClient base = new DefaultHttpClient(); 
     ClientConnectionManager ccm = base.getConnectionManager(); 
     SchemeRegistry sr = ccm.getSchemeRegistry(); 
     sr.register(new Scheme(HTTPS, url.getPort(), ssf)); 
     return new DefaultHttpClient(ccm, base.getParams()); 
    } catch (final Exception e) { 
     throw new RestClientException(FAILED_CREATING_CLIENT, "Failed creating http client", 
       ExceptionUtils.getFullStackTrace(e)); 
    } 
} 


private X509TrustManager createTrustManager() { 
    X509TrustManager tm = new X509TrustManager() { 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 

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

     @Override 
     public void checkClientTrusted(final X509Certificate[] chain, final String authType) 
       throws CertificateException { 
     } 
    }; 
    return tm; 
} 


private X509HostnameVerifier createHostnameVerifier() { 
    X509HostnameVerifier verifier = new X509HostnameVerifier() { 

     @Override 
     public boolean verify(final String arg0, final SSLSession arg1) { 
      return true; 
     } 

     @Override 
     public void verify(final String host, final String[] cns, final String[] subjectAlts) 
       throws SSLException { 
     } 

     @Override 
     public void verify(final String host, final X509Certificate cert) 
       throws SSLException { 
     } 

     @Override 
     public void verify(final String host, final SSLSocket ssl) 
       throws IOException { 
     } 
    }; 
    return verifier; 
} 
+0

好吧,那么如何让它接受我的自签名证书? –

+0

为我的回复添加了一个示例。 – Barak

+0

Thanx @Barak,就像一个魅力。 –

0

首先你必须配置的server.xml file.You必须取消注释哪个线路启动连接器端口=“8443”

+0

我使用eclipse,我没有这样的文件。 –

+0

您可以在此路径下找到server.xml C:\ Program Files \ Apache Software Foundation \ Apache Tomcat 7.0.34 \ conf或上述路径 –