2017-02-23 218 views
0

我正在編寫一個簡單的Java程序來調用RESTful Web服務,並且我已提供一個用於SSL身份驗證的.cer文件。在Java中使用cert文件進行SSL身份驗證

我不確定如何在java中使用.cer文件進行SSL握手,因爲我在嘗試調用Web服務時遇到SSL Handshake error

請您在這裏指導我。 在此先感謝。

回答

-1

您可以禁用握手。下面是測試代碼:

private static void sslTest(String serviceUrl, String username, String password) throws Exception { 
     System.setProperty("jsse.enableSNIExtension", "false"); 

     CredentialsProvider provider = new BasicCredentialsProvider(); 
     provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); 

     SSLContext sslContext = SSLContexts.custom() 
       .loadTrustMaterial(null, new TrustStrategy() { 

        @Override 
        public boolean isTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { 
         return true; 
        } 
       }) 
       .useTLS() 
       .build(); 

     SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); 
     CloseableHttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).setSSLSocketFactory(sslsf).build(); 

     String content = ""; 


     try { 
      HttpResponse response = client.execute(new HttpGet(serviceUrl)); 
      if (Integer.toString(response.getStatusLine().getStatusCode()).equalsIgnoreCase("200")) { 
       HttpEntity entity = response.getEntity(); 
       content = EntityUtils.toString(entity); 
       System.out.println(content); 
      } 
     } catch (Exception e) { 
      logger.error("Exception : {}", e.getMessage()); 
     } 
    } 
+0

這個不安全的代碼不會禁用TLS握手。它禁用檢查握手期間收到的證書。不回答問題並且不安全使用。 – EJP

+0

我是一個jeresy rest客戶端,上面的代碼不會工作。 –

0

I have been provided with a .cer file for SSL authentication.

這是不夠的。

你應該有一個私鑰,你應該自己創建它,沒有給它,你應該已經從它生成一個自簽名證書或者證書籤名請求(CSR),並且已經產生了CSR由證書頒發機構(CA)簽署。

要使用這個在Java中驗證自己的身份,無論是私有密鑰和證書需要在相同的別名下一個密鑰,你需要提供通過系統屬性javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword,或密鑰庫及其密碼否則通過更復雜的代碼方法,您將在JSSE參考指南中找到它們。

+0

是的我使用下面的命令從.cer文件生成JKS:「keytool -importcert -file」exxon-devca-client.cer「-keystore exxon-devca-client.jks -alias」exxon-devca-client「」 我的jeresy rest客戶端代碼中還添加了以下行: File resourcesDirectory = new File(System.getProperty(「user.dir」)+「/resources/exxon-devca-client.jks」); \t \t System.setProperty(「javax.net.ssl.keyStore」,resourcesDirectory.getAbsolutePath()); \t \t System.setProperty(「javax.net.ssl.keyStorePassword」,「password」); 但現在我得到以下錯誤: javax.net.ssl.SSLHandshakeException:收到致命警報:bad_certificate –

+0

我只能重複。你應該用私鑰啓動*,爲此你必須從JKS文件開始。從.cer文件生成新的JKS文件是沒有問題的。您必須使用相同的別名將其導入到您生成CSR的相同密鑰庫中。 NB請不要在評論中發佈計算機命令或輸出或代碼。你可以親眼看到它是完全難以辨認的。 – EJP