2013-01-04 3 views
0

Spring을 사용하여 RESTful 웹 서비스를 구현하려고합니다. 나는 Spring Security가 REST 서비스에 적용되는 링크들에 대해 작업하도록 설정했다. Android 애플리케이션에서이 웹 서비스에 대한 호출을합니다. 지금까지 기본 인증을 사용하여 연결했습니다. 내가 고민하는 것은 이것이 얼마나 안전 한가에 관해 알맞은 정보를 찾는 것이다. 최소한 SSL이나 무언가를 통해 이러한 전화를해야한다고 생각합니까?Spring Rest 서비스 보안

내가 지금 내 봄 보안 설정에 넣어 한 어떤 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

그것이 작동하지 않는다는 것을 의미합니까? 오류가 있습니까, 아니면 응답을 반환하지 않습니까? 요청이 여전히 "http"로 설정되어 있기 때문에 "https"요청을 시도 했습니까? –

+0

여전히 http로 설정되어 있지만 변경 여부와 관계가 있습니다. 이제 웹 서비스에 연결하려고하면 SSLException이 수신됩니다. – Eels

+0

SSLException이란 무엇입니까? 귀하의 질문에 그것을 추가, 정말 도움이 될 것입니다. –

답변

1

HTTP 기본 인증은 암호화 된 연결을 통해 사용자 및 암호 필드가 전송되므로 HTTPS를 통해 사용되는 경우 합리적으로 안전하므로 man-in-the-middle 공격에 훨씬 덜 취약합니다. 몇 가지 흥미로운 점은 여기에 있습니다 : 당신은 사용자의 민감한 데이터에 액세스 할 수있는 API를 만드는 경우 Securing an API: SSL & HTTP Basic Authentication vs Signature 제 생각에는

가 (즉, 은행 계좌 정보, 신용 카드 번호, 전자 메일 주소 및 암호)를 좀 더 보안을 할 수 있습니다 접근 방식은 HTTP 기본 인증이 항상 사용할 수 있기 때문에 무차별 대입 공격에 취약하기 때문에 (최대 재시도 횟수 등의 억제책을 구축하지 않는 한) API가 게임 또는 기본 비즈니스 데이터 용으로 제공된다면 해커가 시간을 보내십시오.

서버가 HTTPS를 지원합니까? HTTPS 인증서를 추가로 지불해야하거나 공유 HTTPS 도메인에서 하위 도메인을 제공하는 한 번만 공유해야합니다 (예 : https//your-site.your-hosting-provider.com/). 아마 이것을 확인해야합니다.

업데이트 1 : 귀하의 문제는 귀하의 서버가 아닌 귀하의 프로그램에있는 것으로 보입니다. Tomcat Server에 HTTPS를 설정하는 방법에 대한 정보는 this blog post을 확인하십시오. Spring 애플리케이션에서 HTTPS를 사용하려면 먼저이 작업을 수행해야합니다. 코드를보고 서버가 아닌 다른 문제가없는 것 같습니다.

this도 참조하십시오.

업데이트 2 액세스가 완료되면 Android 장치 (또는 데스크톱/웹 응용 프로그램을 만드는 경우 Java 설치)에서 인증서를 신뢰해야합니다. CA 권한보다는 직접 작성했기 때문에 신뢰해야합니다. 이 답변을 참조하십시오 : Trusting all certificates using HttpClient over HTTPS (모든 인증서를 신뢰하는 것은 아닙니다 - 위험 할 수 있습니다).

+0

제 서버는 로컬 Tomcat 서버입니다 – Eels

+0

알았습니다. 지시 사항을 따르고 이제 브라우저를 통해 https 링크에 액세스 할 수 있습니다 . 그러나 안드로이드 클라이언트에서 다음을 얻습니다. 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 –