我正在尝试使用Spring实现RESTful Web服务。我已经设置了Spring Security来处理适用于REST服务的链接。我从Android应用程序调用此Web服务。我现在所做的是使用基本身份验证连接到它。我正在努力的是找到关于这是多么安全的正确信息。我想我至少应该通过SSL或其他东西进行这些调用?
我在调用REST客户端的Android客户端上的代码
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();
}
}
所以我现在在Spring Security配置中添加了:
<http auto-config='true'>
<intercept-url pattern="/rest/**" access="ROLE_USER"
requires-channel="https" />
</http>
我无法弄清楚从那里去哪里,因为现在连接因为https而不再起作用了。我似乎无法找到如何使用Resttemplate来解决这个问题的正确例子。
任何帮助?
答案 0 :(得分: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 :您的问题似乎与您的服务器有关,而与您的程序无关。查看this blog post以获取有关如何在Tomcat服务器上设置HTTPS的信息。您需要在使用Spring应用程序中的HTTPS之前执行此操作 - 查看代码,除了您的服务器之外似乎没有问题。
另请尝试this。
更新2 一旦您有权访问,您就需要信任Android设备上的证书(如果您正在制作桌面/ Web应用程序,则需要信任Java安装)。它需要被信任,因为您自己创建它而不是CA权限。请参阅此答案:Trusting all certificates using HttpClient over HTTPS(不是关于信任所有证书的部分 - 这可能很危险)。