2012-01-04 35 views
6

Tôi đang sử dụng Spring RestTemplate trong ứng dụng của mình để truy cập các dịch vụ web bên ngoài. Tuy nhiên, SSL mũ dịch vụ web này được bật, với chứng chỉ tự ký (tên miền, v.v ... cũng không hợp lệ). Đây chỉ là một mạng cục bộ, vì vậy tôi không phải lo lắng về một số vấn đề bảo mật. Tôi muốn làm cho Spring chấp nhận chứng chỉ này. Đây là những gì tôi đã thực hiện cho đến nay:Cách đặt chứng chỉ được tin cậy cho Spring RestTemplate

1.) Tôi đã cấu hình JBOSS tôi 7 để sử dụng keystore này

<connector name="https" protocol="HTTP/1.1" socket-binding="https" scheme="https" enable-lookups="false" secure="true"> 
    <ssl name="ssl" key-alias="my-private-key" password="rmi+ssl" certificate-key-file="../standalone/configuration/server-keystore.jks" protocol="TLSv1" verify-client="false"/> 
</connector> 

2.) Sau đây là cấu hình của RestTemplate Bean của tôi (Tôi đang sử dụng autowireing trong các lớp học của tôi)

<bean id="stringHttpConverter" class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 

<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams"> 
    <property name="authenticationPreemptive" value="true"/> 
    <property name="connectionManagerClass" value="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"/> 
</bean> 

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <constructor-arg ref="httpClientParams"/> 
</bean> 

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean> 

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg ref="httpClientFactory"/> 
    <property name="messageConverters"> 
     <list> 
      <!-- <ref bean="marshallingConverter" /> --> 
      <ref bean="stringHttpConverter" />    
     </list> 
    </property> 
</bean> 

Tôi đã nhập chứng chỉ máy chủ vào kho khóa, chắc chắn là trong đó. Tôi còn phải làm gì nữa? Tôi đã kiểm tra tất cả các câu hỏi tương tự ở đây, nhưng không ai trong số họ đã giúp. Cảm ơn.

Trả lời

2

Máy chủ-keystore.jks mà bạn đã chỉ định trong trình kết nối cho jboss-web chỉ được sử dụng làm chứng chỉ máy chủ cho các kết nối đến.

Đối với các kết nối gửi đi, JBoss hoạt động giống như bất kỳ ứng dụng khách java nào khác, vì vậy bạn cần nhập chứng chỉ máy chủ vào kho lưu trữ java mặc định. Bạn có thể sử dụng mặc định% JAVA_HOME% \ lib \ security \ cacerts, và nhập chứng chỉ máy chủ của bạn sử dụng:

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias mycert -file mycert.cer 

Nếu bạn không muốn chỉnh sửa cacerts mặc định, bạn có thể xác định một truststore thay thế bằng hệ thống thiết các thuộc tính như được giải thích trong: Java client certificates over HTTPS/SSL.

Một cách thứ ba là để ghi đè lên https ProtocolSocketFactory để nó chấp nhận tất cả giấy chứng nhận, như: http://drumcoder.co.uk/blog/2011/mar/30/httpclient-self-signed-certificates/

+0

Vì vậy, trong trường hợp của tôi, tôi nên nhập chứng chỉ máy chủ vào máy chủ-keystore.jks? Hoặc nó là một kho khóa riêng biệt cho các chứng chỉ tin cậy? Và một câu hỏi khác, tôi có nên nhập chứng chỉ máy chủ hoặc chứng chỉ CA máy chủ không? Cảm ơn. –

0

tôi đã thực hiện một phương pháp đơn giản:

static HttpComponentsClientHttpRequestFactory requestFactory = null; 

/** 
* 
* @return 
*/ 
public static ServerProperties getServerProperties() { 
    return serverProperties; 
} 

/** 
* @return 
*/ 
public static HttpComponentsClientHttpRequestFactory getRequestFactory() { 
    if (requestFactory == null) { 
     TrustStrategy acceptingTrustStrategy = new TrustStrategy() { 
      @Override 
      public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { 
       return true; 
      } 
     }; 
     SSLContext sslContext = null; 
     try { 
      sslContext = org.apache.http.ssl.SSLContexts.custom() 
        .loadTrustMaterial(null, acceptingTrustStrategy) 
        .build(); 
      SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); 

      CloseableHttpClient httpClient = HttpClients.custom() 
        .setSSLSocketFactory(csf) 
        .build(); 
      requestFactory = new HttpComponentsClientHttpRequestFactory(); 
      requestFactory.setHttpClient(httpClient); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } 
    } 
    return requestFactory; 
} 

Sau đó, khi tôi dụ restTemplate:

RestTemplate restTemplate = new RestTemplate(getRequestFactory()); 

Đơn giản.

Các vấn đề liên quan