【问题标题】:Securing Spring Rest service保护 Spring Rest 服务
【发布时间】:2013-01-04 09:26:25
【问题描述】:

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

有什么帮助吗?

【问题讨论】:

  • 你是什么意思它不起作用 - 你得到任何错误还是只是没有返回响应?您是否也尝试请求“https”,因为您的请求仍设置为“http”。
  • 我知道它仍然设置为 http,但无论我是否更改它:如果我现在尝试连接到 Web 服务,我会收到 SSLException。
  • 什么是 SSLException?将其添加到您的问题中,它真的会有所帮助。
  • org.springframework.web.client.ResourceAccessException:I/O 错误:连接被对等方关闭;嵌套异常是 javax.net.ssl.SSLException: Connection closed by peer
  • 您可以通过 HTTPS 访问 Web 浏览器中的 URL 吗?我认为您没有使用 HTTPS 的证书或配置。

标签: android spring https spring-security


【解决方案1】:

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

在我看来,如果您正在创建一个可以访问用户敏感数据(即银行账户详细信息、信用卡号、电子邮件地址和密码)的 API,那么您可能需要一种更安全的方法,因为 HTTP 基本身份验证很容易被暴力破解强制攻击,因为它始终可用(除非您构建了诸如最大重试次数等威慑措施) >

您的服务器是否支持 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(不是关于信任所有证书的部分 - 这可能很危险)。

【讨论】:

  • 我的服务器是本地Tomcat服务器
  • 好的,我按照这些说明进行操作,现在我可以通过浏览器访问 https 链接。但是,从 android 客户端,我得到以下信息:javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certificate path not found.
  • 您现在需要将服务器证书的公共部分添加到 Java 中的信任库中 - 不过对于 Android,这可能有一种特殊的方法。在此处查看@elton 提供的答案:stackoverflow.com/questions/6825226/…
猜你喜欢
  • 2016-04-29
  • 2017-05-27
  • 2023-03-11
  • 2015-03-23
  • 2014-04-13
  • 2017-07-12
  • 2020-10-31
  • 2012-01-23
  • 2021-02-04
相关资源
最近更新 更多