0. 引子
公司需要部署一个邮件系统以满足沟通的需要,经过测试初步敲定国内某品牌的企业邮箱。而基于安全需求,又订购了某证书产品对http传输进行加密。为了使用方便和信息化建设,还需要将邮箱和现有的信息系统进行整合,这就需要对其进行二次开发。本文所记述的就是对邮箱系统和证书产品以及信息系统进行整合的技术细节及发生问题的处理方式。
1. 环境
邮箱系统部署在CentOS 6.7 x86_64 上面,采用的web服务器为6.0.43,JVM版本为1.7.0_11。
证书使用的加密算法为sha2,采用TLS协议。
信息系统平台为Windows 2008 R2,基于.net 1.1框架进行开发。
2. Tomcat启用HTTPS
证书供应商提供了多种形式的证书,对应Tomcat的是*.jks文件,其设置方法如下:
|
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150"
scheme="https"
secure="true"
SSLEnabled="true"
keystoreFile="/home/**/conf/*.jks"
keystorePass="*********"
sslProtocol="TLS"
clientAuth="false"
/>
|
然而,这个并没什么卵用。因为该邮件厂商对tomcat进行私自定制,阉割的地方太多,竟然无法解析*.jks文件,只能使用传统的的证书设置,设置方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150"
enableLookups="false" disableUploadTimeout="true"
useBodyEncodingForURI="true"
acceptCount="100"
scheme="https"
secure="true"
SSLEnabled="true"
SSLCertificateFile="/home/**/conf/mail_bundle.crt"
SSLCertificateKeyFile="/home/**/conf/mail.key"
SSLCertificateChainFile="/home/**/conf/mail_root_bundle.crt"
SSLPassword=""
SSLProtocol="TLSv1"
/>
|
做以上修改后重启Tomcat即可使用https://XXXXXXXX进行访问。
3. 对http进行强制跳转https
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
|
在web.xml文件末尾</web-app>前增加以上内容。重启Tomcat后就只能使用https进行访问,输入http://也会自动跳转到https://。
url-pattern有如下三种匹配方式:
-
前缀匹配 /user/*
-
后缀匹配 *.do
-
绝对匹配 /myservlet
4. 增加http跳转https例外
上面的配置基本上满足的需求,但是当二次开发的时候出现了问题,因为原有信息系统的开发平台是.net 1.1 对https传输的支持并不是很好,连接https的web service会报出”The underlying connection was closed: Could not establish secure channel for SSL/TLS.(基础连接已关闭: 无法建立安全通道的SSL/TLS。)”错误,所以需要将其提供的web service链接排除到https强制跳转之外。配置方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<security-constraint>
<web-resource-collection>
<web-resource-name>Unprotected Pages</web-resource-name>
<url-pattern>/services/API</url-pattern>
<http-method>PUT</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
|
需要说明的是web service的url-pattern与其他的资源并不尽相同。因为web service有命名空间的存在所以在写url-pattern规则的时候不要将命名空间路径带出,比如下面的链接http://XXXX/apiws/services/API?wsdl,由xml文件可以看出apiws为命名空间,所以url-pattern规则只用写/services/API。
其他的诸如*.jpg,*.jsp,*.css等可以如此设置:
|
<url-pattern>*.ico</url-pattern>
<url-pattern>/img/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/index.jsp</url-pattern>
|
5. 参考资料
5.1 Making Authenticated Web Service Callouts Using Two-Way SSL
5.2 How to configure Tomcat to always require HTTPS
(责任编辑:IT) |