Https的tomcat及spring配置


用SSL保护你的站点

         在日常使用在线站点时,你很可能已经听说或使用过SSL。安全套接字层(SSL)协议,以及其后续的传输层安全(TLS),被用来为网络上的HTTP事务提供传输层的安全——它们被称为安全的HTTP事务(HTTPS)。

         简而言之,SSL和TLS以一种对用户透明的方式保护原始的HTTP传输数据,这些数据在客户端浏览器和web服务器之间传输。但是作为开发人员,在设计安全站点时,规划使用SSL是很重要的。Spring Security提供了一系列的配置选项可以灵活的将SSL集成到web应用中。

【尽管SSL和TLS是不同的协议(TLS是更成熟的协议),单数大多数人更熟悉SSL这个术语,所以在本书的剩余部分,我们使用这个术语来代指SSL和TLS两个协议。】

详细介绍SSL协议的机制已经超出了本书的范围,有一些很好的书籍和技术论文很详细地介绍了其规范和协议(你可以从RFC:5246:传输安全协议(TLS)Version1.2开始,在以下地址http://tools.ietf.org/html/rfc5246)

配置Apache Tomcat以支持SSL

         首先且最重要的是,如果你计划执行如下SSL相关的例子,需要配置应用服务器以支持SSL连接。对于Apache Tomcat,这相对很容易。如果你在使用其它的应用服务器,请查看文档的相关部分。

生成server key store

         我们需要使用Java的keytool命令来生成一个key store。打开一个命令提示窗口,并输入以下的命令:

 

Java代码  
  keytool -genkeypair -alias jbcpserver -keyalg RSA -validity 365 -keystore tomcat.keystore -storetype JKS  

 

 按照提示进行如下的输入。输入密码password作为key store和个人密钥的密码。

 

Java代码  
  1. What is your first and last name?  
  2.   [Unknown]:  JBCP Pets Admin  
  3. What is the name of your organizational unit?  
  4.   [Unknown]:  JBCP Pets  
  5. What is the name of your organization?  
  6.   [Unknown]:  JBCP Pets  
  7. What is the name of your City or Locality?  
  8.   [Unknown]:  Anywhere  
  9. What is the name of your State or Province?  
  10.   [Unknown]:  NH  
  11. What is the two-letter country code for this unit?  
  12.   [Unknown]:  US  
  13. Is CN=JBCP Pets Admin, OU=JBCP Pets, O=JBCP Pets, L=Anywhere, ST=NH, C=US   
  14. correct?  
  15.   [no]:  yes  

 这将会在当前目录下,生成一个名为tomcat.keystore的文件。这就是启用Tomcat SSL所使用的key store。

 

【注意的是要执行的是genkeypair命令(在早于java 6的释放版本中要使用keytool的genkey命令)】

         为了下一步的操作,需要记住这个文件的地址。

配置Tomcat的SSL Connector

         在Apache Tomcat的conf目录下,用XML编辑器(Eclipse或类似的都可以)打开server.xml,并取消注释或添加SSL Connector声明。应该如下所示:

 

Xml代码  
  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
  2.   maxThreads="150" scheme="https" secure="true"  
  3.   sslProtocol="TLS"   
  4.   keystoreFile="conf/tomcat.keystore"  
  5.   keystorePass="password"/>  

 确保在上一步中生成的tomcat.keystore文件被copy到了Tomcat安装路径的conf目录下。在配置后,Tomcat服务器可以重启,JBCP  Pets应用能够在一个安全的端口https://localhost:8443/JBCPPets/上进行访问。

 

         取决于不同的浏览器,可能需要包含https而不是http。这样的问题可能会比较难发现,你可能会比较奇怪为什么不能看到JBCP  Pets的主页。

对站点进行自动的安全保护

         我们假设你在对客户的数据进行SSL保护时遇到了麻烦,你想把应用的特定部分置于SSL的保护之下。幸运的是,Spring Security让这一切变得很简单,只需要在<intercept-url>声明上添加一个配置属性。

         requires-channel属性能够添加到任何<intercept-url>声明中,以要求所有匹配的URL要以特定的协议(HTTP,HTTPS或都可以)进行传递。如果按照这种形式来增强JBCP Pets站点,配置可能如下所示:

 

Xml代码  
  1. <http auto-config="true" use-expressions="true">  
  2.   <intercept-url pattern="/login.do" access="permitAll"   
  3.                  requires-channel="https"/>  
  4.   <intercept-url pattern="/account/*.do"   
  5.                  access="hasRole('ROLE_USER') and fullyAuthenticated"   
  6.                  requires-channel="https"/>  
  7.   <intercept-url pattern="/*" access="permitAll"   
  8.                  requires-channel="any"/>  
  9.   <!-- ... -->  
  10. </http>    

 如果此时重启应用,你将会发现:

 

l  现在访问登录页和账号页需要HTTPS,浏览器将会为用户自动从不安全的(HTTP)URL重定向到安全的URL。例如,尝试访问http://localhost:8080/JBCPPets/login.do将会被定向到https://localhost:8443/JBCPPets/login.do

l  如果用户被切换到了安全的HTTPS URL,如果他访问一个不必要使用HTTPS的URL,他能继续保留在HTTPS状态。

 

我们可以想象这种配置对于安全的好处——大多数的现代应用服务器使用一个secure标识session的cookie,所以强制要求登录页是安全的(如果这是应用的session被首次分配的地方)能够保证session的cookie能够被安全的传输,所以出现session劫持的可能性也更小。另外,直接将SSL加密配置在安全声明上的做法,能够很容易的保证应用中所有敏感的页面被适当和完整的保护。

为用户自动切换适当协议(HTTP或HTTPS)的功能,通过Spring Security过滤器链上的另外一个servlet过滤器来实现的(它的位置很靠前,在SecurityContextPersistenceFilter后面)。如果任何URL用requires-channel属性声明使用特定类型的协议,o.s.s.web.access.channel.ChannelProcessingFilter将会自动添加到过滤器链上

         ChannelProcessingFilter在请求时的交互过程如下图所示:



 如果你的应用需要超出内置功能的复杂逻辑,ChannelProcessingFilter的设计可以进行扩展和增强。注意我们尽管只在图中说明了SecureChannelProcessor和RetryWithHttpsEntryPoint的实现,但是有类似的类去校验和处理声明为要求HTTP的URL。

         注意,ChannelEntryPoint使用了HTTP 302的URL重写,这就不能使用这种技术去重定向POST的URL(尽管典型的POST请求不应该在安全协议和不安全协议间传递,因为大多数的应用都会对这种行为提出警告)。

安全的端口映射

         在一些特定的环境中,可能不会使用标准的HTTP和HTTPS端口,其默认为80/443或8080/8443。在这种情况下,你必须配置你的应用包含明确的端口映射,这样ChannelEntryPoint的实现能够确定当重定向用户到安全或不安全的URL时,使用什么端口。

         这仅需要增加额外的配置元素<port-mappings>,它能够指明除了默认的端口以外,额外的HTTP 的HTTPS端口:

 

Xml代码  
  1. <port-mappings>  
  2.   <port-mapping http="9080" https="9443"/>  
  3. </port-mappings>  

 如果你的应用服务器在反向代理后的话,端口映射将会更加的重要。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM