0

我正在尝试使用 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 来解决这个问题。

有什么帮助吗?

4

1 回答 1

1

HTTP 基本身份验证在通过 HTTPS 使用时相当安全,因为用户和密码字段是通过加密连接发送的,因此它们不太容易受到中间人攻击。这里有一些有趣的点:保护 API:SSL 和 HTTP 基本身份验证与签名

在我看来,如果您正在创建一个可以访问用户敏感数据(即银行帐户详细信息、信用卡号、电子邮件地址和密码)的 API,那么您可能需要一种更安全的方法,因为 HTTP 基本身份验证很容易受到暴力攻击,因为它始终可用(除非您建立了诸如最大重试次数等威慑措施)。如果您的 API 用于游戏或基本业务数据,那么黑客花时间在上面的吸引力应该较小。

您的服务器是否支持 HTTPS - 通常您需要为 HTTPS 证书支付额外费用,或者您必须使用共享一次,这会为您提供共享 HTTPS 域上的子域 - 即https//your-site.your-hosting-provider.com/。你可能需要检查一下。

更新 1:您的问题似乎出在您的服务器上,而不是您的程序上。查看这篇博文,了解如何在 Tomcat 服务器上设置 HTTPS。您需要先执行此操作,然后才能从 Spring 应用程序使用 HTTPS - 查看您的代码,除了您的服务器之外似乎没有问题。

也试试这个

更新 2获得访问权限后,您将需要信任 Android 设备上的证书(如果您正在制作桌面/Web 应用程序,则需要信任您的 Java 安装)。它需要被信任,因为您是自己创建的,而不是 CA 机构。请参阅此答案:通过 HTTPS 使用 HttpClient 信任所有证书(不是关于信任所有证书的部分 - 这可能很危险)。

于 2013-01-04T09:49:46.230 回答