一直想就SSL安全通讯部分写一些东西,今天就和大家一起探讨一下。
首先来介绍一下什么是SSL: SSL (Secure Socket Layer) 为Netscape所研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听,现已成为该领域中全球化的标准。
那么,应该如何将SSL应用到实际的项目开发当中去呢?我们需要先了解一个叫做证书的东西。
SSL通讯协议中有专用的SSL证书,其通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layer)。SSL技术已建立到所有主要的浏览器和WEB服务器程序中,因此,仅需安装服务器证书就可以激活该功能了,用户可以通过服务器证书验证他所访问的网站是否是真实可靠。
接下来,我们要做的第一步就是建立本地SSL证书。
1. 首先,我们应确认自己的电脑上已经安装好了JDK1.6或以上版本。并配置好了相关路径(JAVA_HOME,PATH,CLASSPATH),因为下面会用到其中自带的一个keytool工具来生成密钥文件。另外,还应安装TOMCAT6.0或以上版本,后面会对其相关配置进行修改。
2.单击开始—>运行—>cmd—>定位到你要生成keystore的路径(定位路径大家应该都会吧,基本操作命令,我就不写了)—>按照下列步骤输入命令:(注意:输入命令时的%JAVA_HOME%为你的JDK安装目录)
第一步:为服务器生成证书
假定目标机器的域名是“localhost”,keystore文件存放在“C:\tomcat.keystore”(此时应定位到c:\目录下,否则会在相应目录下生成keystore),口令为“password”(自己设定),使用如下命令生成:
%JAVA_HOME%\bin\keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomcat.keystore
如果Tomcat所在服务器的域名不是“localhost”,应改为对应的域名,如“www.sina.com.cn”,否则浏览器会弹出警告窗口,提示用户证书与所在域不匹配。在本地做开发测试时,应填入“localhost”(不填默认为本地)。
第二步:为客户端生成证书
下一步是为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:
%JAVA_HOME%\bin\keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore c:\my.p12
对应的证书库存放在“C:\my.p12”,客户端的CN可以是任意值。稍候,我们将把这个“my.p12”证书库导入到IE和Firefox中。
第三步:让服务器信任客户端证书
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:
%JAVA_HOME%\bin\keytool -export -alias mykey -keystore my.p12 -storetype PKCS12 -storepass password -rfc -file c:\my.cer
通过以上命令,客户端证书就被我们导出到“C:\my.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:
%JAVA_HOME%\bin\keytool -import -v -file my.cer -keystore tomcat.keystore
通过list命令查看服务器的证书库,我们可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书:
%JAVA_HOME%\bin\keytool -list -keystore tomcat.keystore
第四步:配置Tomcat服务器
打开Tomcat根目录下的/conf/server.xml,找到如下配置段,修改如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="C:/tomcat.keystore" keystorePass="password"
truststoreFile="C:/tomcat.keystore" truststorePass="password"
/>(此处的相关文件目录设置为自己生成的key所在目录即可,password为自己设定的password)
第五步:导入客户端证书
如果设置了clientAuth="true",则需要强制验证客户端证书。双击“C:\my.p12”即可将证书导入至IE:(也可用浏览器进行访问时进行导入)
p12 证书直接双击然后按提示下一步就可导入。
呵呵 到这一步,我们的所有证书就全搞定了,我们可以启动tomcat服务器(去tomcat安装目录下的bin\startup.bat),在浏览器中输入:https://localhost:8443,如果配置都正确的话,应该可以跳转到index.jsp。
下面要讲的就是如何在我们写的JSP中使用SSL了。
我用的是从网上下载的一个不错的基于Struts2框架的SSL插件,下载地址为:http://code.google.com/p/struts2-ssl-plugin/
首先当然把jar包COPY到lib下,之后在struts.xml中设置:
<constant name="struts2.sslplugin.httpPort" value="8085"/>
<constant name="struts2.sslplugin.httpsPort" value="8443"/>
<package name="default" extends="ssl-default">
注意,default里可以继承这个ssl-default,因为其实这个ssl-default也是继承 struts-default的,放心用 。还要注意的是,需要使用SSL安全通讯的action要放到extends=ssl-default的包内,不然用submit提交的时候是不会自动跳转到https的。
之后在你要某个SSL的方法前,用注释,就行了:
@Secured
public String execute1() throws Exception {
…
}
如果要整个类都要SSL,则
@Secured
public class LoginAction extends ActionSupport {
….
}
下面,启动你的JSP项目,你会发现从http:…跳转时变为了https:…并且会有证书安全提示,呵呵,第一个SSL安全通讯就这么做好了,大家一起试一下吧,要是有什么不理想的地方留言一起讨论哈!
来源:oschina
链接:https://my.oschina.net/u/200090/blog/36595