java - Spring REST 服务证书身份验证

标签 java spring rest spring-mvc spring-security

我已经编写了 Spring Controller 。这是来自客户的请求。这只是 REST 风格。

这很好。但我需要证书认证。只有客户端才能访问其余服务(spring Controller ),这些服务具有带 key 的客户端证书(换句话说,客户端应该拥有带 key 的 keystore )。

如何将此安全性配置为 spring?你能给我一个例子或链接吗?

谢谢

最佳答案

您要查找的内容称为 Mutual Authentication .

服务器负责制作/请求客户端发送其证书。每个服务器执行此操作的方式不同,您必须查看如何配置您的特定服务器。

对于 Spring Security,我建议查看 X.509 Authentication .这种类型的身份验证相当容易使用,并且可以根据需要进行扩展。

编辑

因此,这里有一些引用资料可以说明您所问的问题:

http://whiteycode.blogspot.com/2012/04/part-3-x509-authentication-with-spring.html

PDF 警告

<罢工> http://www.promixis.com/pdfs/SpringSecurityAndX509ClientCertificates.pdf

The above pdf file is no longer reachable...

这个例子很好地解释了如何设置您的证书和创建您自己的个人 CA(证书颁发机构)。警告,他们展示制作客户证书的方式只是一种方式,而不是方式。您的客户端(IE Web 浏览器或 java httpclient 客户端)应确定创建客户端证书的方式。 Java 当然喜欢使用它的 java keystore ,而浏览器往往喜欢 p12 样式的证书。

最终建议/警告...我不知道您对证书的了解程度,但是...相互身份验证就是关于谁信任谁。有责任说,我需要你用证书来验证自己,这里是我信任的证书提供者的列表。然后,客户端负责回复由这些服务器受信任的证书提供商之一签名的证书。应用程序有责任说,我是否根据证书中的姓名信任此人?当事情开始出错时,想想谁在信任谁,谁不信任谁。

一个很棒的工具是在您的应用程序上使用 -Djavax.net.debug=ssl。它将显示整个 ssl 握手以及请求的内容以及具体的响应是什么。该选项有点冗长,但在需要时使用它很不错。

编辑 X 2

这是在 Tomcat 7 上启用相互身份验证的方法。

在您的 server.xml 配置文件中,您应该看到接近以下内容的 SSL 连接器:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="want" sslProtocol="TLS"
           keystoreFile="C:\Java\Certs\localhost.jks"
           keystorePass="changeit"
           URIEncoding="UTF-8" />

需要注意的重要值是 clientAuth 值。

将 clientAuth 设置为“想要”告诉客户端从服务器信任的证书列表中发送签名的客户端 ssl 证书(如果有的话)。如果没有,请照常提出您的请求。

将 clientAuth 设置为“true”告诉客户端他们必须从服务器信任的证书列表中发送签名的客户端 ssl 证书。如果您没有由服务器信任的证书列表签名的证书,则不允许客户端发出请求。

服务器信任的证书列表来自默认的 java 信任库,或者可以使用 -Djavax.net.ssl.trustStore="C:\Java\Certs\jssecacerts1" 设置虚拟机选项。

通常,当您信任的特定 CA 证书不在默认 Java 信任库中时,会复制默认信任库,将新 CA 证书导入到复制的信任库中,然后与上述 VM 选项一起使用。

警告

不要更改默认的 Java 信任库,这一点非常重要。如果这样做,默认情况下该机器上的所有 Java 应用程序都将使用新更新的信任库。并不总是人们想要的,可能会导致安全风险。

关于java - Spring REST 服务证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26635728/

相关文章:

java - Netty 文件上传支持通过 HTTP PUT 方法

java - Spring Data Rest 单元测试选择性地通过

树结构的 REST URI 设计

java - Spring 卡夫卡听正则表达式

Restful 与其他 Web 服务

web-services - 用于 Java 的轻量级快速 REST 服务器库?

java - 贪婪的 Java 正则表达式

java - 访问匿名类中的重写函数

java - TextField 仅接受数字并存储在 ArrayList<Double> 中

django - Django框架中的Spring Interceptors/Filters相当于什么