2013-01-04 111 views
0

我試圖使用Spring實現一個RESTful Web服務。我已經設置了Spring Security來處理適用於REST服務的鏈接。我從Android應用程序調用此Web服務。我現在所做的是使用基本身份驗證連接到它。我正在努力尋找關於這是多麼安全的體面信息。我想我至少應該通過SSL或者其他什麼來撥打這些電話?保護Spring Rest服務

我的Android客戶端調用REST客戶

public MyClass callRest() { 
    final String url = "http://10.0.2.2:8080/myservice/rest/getSomething"; 

    HttpAuthentication authHeader = new HttpBasicAuthentication(username, 
      password); 
    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setAuthorization(authHeader); 
    requestHeaders.setAccept(Collections 
      .singletonList(MediaType.APPLICATION_JSON)); 

    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.getMessageConverters().add(
      new MappingJacksonHttpMessageConverter()); 
    try { 
     ResponseEntity<MyClass> response = restTemplate.exchange(url, 
       HttpMethod.GET, new HttpEntity<Object>(requestHeaders), 
       MyClass.class); 
     return response.getBody(); 
    } catch (HttpClientErrorException e) { 
     return new MyClass(); 
    } 

} 

所以,我已經把我的春季安全配置,現在的代碼:

<http auto-config='true'> 
    <intercept-url pattern="/rest/**" access="ROLE_USER" 
     requires-channel="https" /> 
</http> 

我想不通的地方從那裏去,因爲現在連接不再工作了,當然是因爲https。我似乎無法找到如何使用Resttemplate解決這個問題的體面的例子。

任何幫助?

+1

你是什麼意思它不起作用 - 你是否得到任何錯誤,或者它只是沒有返回響應?您是否嘗試請求「https」,因爲您的請求仍設置爲「http」。 –

+0

我知道它仍然設置爲http,但我是否改變:如果我嘗試連接到Web服務,現在我收到一個SSLException。 – Eels

+0

什麼是SSLException?將它添加到你的問題,這將真的幫助。 –

回答

1

由於用戶和密碼字段是通過加密連接發送的,所以HTTP基本驗證在HTTPS上使用時相當安全,因此它們不易受到中間人攻擊。這裏有一些有趣的地方:Securing an API: SSL & HTTP Basic Authentication vs Signature

在我看來,如果你正在製作一個訪問用戶敏感數據的API(例如銀行賬戶信息,信用卡號碼,電子郵件地址和密碼),那麼你可能想要一個更安全方法,因爲HTTP基本認證可以應對強力攻擊,因爲它始終可用(除非您構建威脅,例如最大重試次數等)。如果您的API用於遊戲或基本業務數據,那麼對於黑客來說,花時間在上面。

您的服務器是否支持HTTPS - 通常您需要爲HTTPS證書支付額外費用,或者您必須使用共享一次,這會在共享HTTPS域上爲您提供子域名 - 即https//your-site.your-hosting-provider.com/。你需要檢查這可能。

更新1:您的問題似乎與您的服務器,而不是您的程序。有關如何在Tomcat服務器上設置HTTPS的信息,請查看this blog post。您需要在您的Spring應用程序中使用HTTPS之前執行此操作 - 查看您的代碼,除了服務器以外似乎沒有其他問題。

也試試this

更新2一旦你有權訪問,你將需要信任Android設備上的證書(或者你的Java安裝,如果你正在製作桌面/ Web應用程序)。它需要被信任,因爲你自己創建它而不是CA權威。看到這個答案:Trusting all certificates using HttpClient over HTTPS(不是關於信任所有證書的部分 - 這可能是危險的)。

+0

我的服務器是本地Tomcat服務器 – Eels

+0

好吧,我按照這些說明,現在我可以通過我的瀏覽器訪問https鏈接。然而,從android客戶端,我得到以下內容:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到證書路徑的信任錨點。 – Eels

+0

您現在需要將您的服務器證書的公共部分添加到Java中的信任庫中 - 但對於Android來說,這可能有一個特殊的方法。請看@elton在這裏提供的答案:http://stackoverflow.com/questions/6825226/trust-anchor-not-found-for-android-ssl-connection –