12.3.2 安全升级1—单向认证服务

为构建单向认证服务,我们需要构建相应的数字证书,配置Tomcat服务器,并修改测试用例。最后,我们将通过Wireshark监测网络中真正传输的SOAP内容是否加密成功。

1.构建证书

为构建单向认证服务,我们需要构建相应的数字证书。请读者参考第10章,完成OpenSSL相关配置并构建CA根证书目录。

❑初始化设置

在命令行下,将当前路径切换至CA根证书目录执行命令完成初始化设置。完整命令如代码清单12-36所示。

代码清单12-36初始化设置


echo off

echo构建目录

mkdir certs

mkdir crl

mkdir newcerts

mkdir private

echo构建文件

echo 0>index.txt

echo 01>serial

echo构建随机数private/.rand

openssl rand-out private/.rand 1000


❑构建CA根证书

接下来,我们需要构建CA根证书。完整命令如代码清单12-37所示。

代码清单12-37 构建CA根证书


echo构建根证书私钥private/ca.key.pem

openssl genrsa-aes256-out private/ca.key.pem 2048

echo生成根证书请求private/ca.csr

openssl req-new-key private/ca.key.pem-out private/ca.csr-subj

"/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=Zlex CA"

echo签发根证书private/ca.cer

openssl x509-req-days 10000-sha1-extensions v3_ca-signkey

private/ca.key.pem-in private/ca.csr-out certs/ca.cer

echo根证书转换private/ca.p12

openssl pkcs12-export-clcerts-in certs/ca.cer-inkey private/ca.key.pem-out

certs/ca.p12


上述命令执行过程中需要输入相应密码,此处一律输入密码“123456”。

❑导入证书

为方便演示,需将自签名CA个人信息交换文件ca.p12导入IE浏览器。点击IE浏览器“工具”菜单,在弹出菜单中点击“Internet选项”。在弹出的“Internet选项”对话框中选择“内容”选项卡,在证书栏中点击“证书”按钮。在弹出的“证书”对话框中选择“受信任的根证书颁发机构”选项卡,点击“导入”按钮导入CA个人信息交换文件ca.p12,在弹出的对话框中输入CA根证书密码(这里为“123456”),并确认导入该证书。

最终,我们将在“受信任的根证书颁发机构”选项卡中找到我们导入的自签名CA根证书,如图12-25所示。

figure_0441_0166

图 12-25 导入的自签名CA根证书

❑构建服务器证书

接下来,我们需要构建服务器证书。这里,作者将应用部署在虚拟机(IP:192.168.184.131)上,故使用IP作为用户名称构建数字证书,读者可根据实际情况指定相应的IP地址或域名构建服务器证书。完整命令如代码清单12-38所示。

代码清单12-38 构建服务器证书


echo构建服务器证书私钥private/server.key.pem

openssl genrsa-aes256-out private/server.key.pem 2048

echo生成服务器证书请求private/server.csr

openssl req-new-key private/server.key.pem-out private/server.csr-subj

"/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=192.168.184.131"

echo签发服务器证书private/server.cer

openssl x509-req-days 3650-sha1-extensions v3_req-CA certs/ca.cer-CAkey

private/ca.key.pem-CAserial ca.srl-CAcreateserial-in private/server.csr-out

certs/server.cer

echo服务器证书转换private/server.p12

openssl pkcs12-export-clcerts-in certs/server.cer-inkey private/server.key.pem

-out certs/server.p12


上述命令执行过程中需要输入相应密码,此处为方便演示,一律输入密码“123456”。

❑导出服务器证书私钥

为了能通过Wireshark监测网络中加密的数据,我们需要将服务器密钥以明文形式导出。完整命令如代码清单12-39所示。

代码清单12-39 导出服务器证书私钥


echo导出服务器证书私钥(明文)private/serkey.pem

openssl pkcs12-in certs/server.p12-out private/serkey.pem-nodes-nocerts


其中

pkcs12 PKCS#12 编码格式证书命令

-in 表示输入文件,这里为certs/server.p12

-out 表示输出文件,这里为private/serkey.pem

-nodes 不加密(No DES)

-nocerts 不导出证书

执行上述命令时,请输入密码“123456”,执行结果如图12-26所示。

figure_0442_0167

图 12-26 导出服务器密钥

接下来,我们将使用ca.p12和server.p12个人信息交换文件构建单向认证服务。

2.配置Tomcat

配置单向认证服务,需将上述操作获得的个人信息交换文件(ca.p12和server.p12文件)复制到Tomcat的conf目录下作为密钥库文件,并配置server.xml文件。server.xml文件详细配置如代码清单12-40所示。

代码清单12-40 server.xml配置—单向认证


<Connector

clientAuth="false"

SSLEnabled="true"

maxThreads="150"

port="443"

protocol="HTTP/1.1"

scheme="https"

secure="true"

sslProtocol="TLS"

keystoreFile="conf/server.p12"

keystorePass="123456"

keystoreType="PKCS12"

truststoreFile="conf/ca.p12"

truststorePass="123456"

truststoreType="PKCS12"/>


注意,参数clientAuth值为“false”,即不需要客户端认证—单向认证。这里我们将端口改为443(port="443"),直接通过HTTPS访问。

同时,将密钥库文件指向server.p12文件(keystoreFile="conf/server.p12"),并指定密码为“123456”(keystorePass="123456"),同时标明密钥库文件类型为PKCS#12(keystoreType="PKCS12")。

此外,我们需要配置信任库相关属性。将信任库文件指向ca.p12文件(truststoreFile="conf/ca.p12"),并指定密码为“123456”(truststorePass="123456"),同时标明信任库文件类型为PKCS#12(truststoreType="PKCS12")。

为方便访问HTTPS服务,这里将端口指向HTTPS服务默认端口443,即将端口参数port值置为“443”。

重新启动Tomcat,我们通过IP直接访问地址https://192.168.184.131/axis/services,查看服务列表,如图12-27所示。

figure_0443_0168

图 12-27 Web Service列表2

如果未能导入CA根证书,将提示“证书错误”,如图12-28所示。

figure_0443_0169

图 12-28 证书错误

此时,请导入CA个人信息交换文件ca.p12,并重新打开IE浏览器访问该地址。

接下来,我们直接通过IE浏览器访问地址https://192.168.184.131/axis/services/Version?wsdl,获得WSDL协议,如图12-29所示。

figure_0444_0170

图 12-29 WSDL协议2

此时,WSDL协议已经被加密。仔细对比图12-19和图12-29,我们会发现,原有指向Version服务的协议已经发生变化—由HTTP协议变为HTTPS协议。稍后我们将使用Wireshark监测网络数据的加密情况。

3.验证服务

针对Axis架构,我们需要在进行SOAP交互之前初始化证书配置。在原有测试用例代码的基础上通过JUnit前置动作(注解@Before标注的方法,此处为init()方法)初始化信任库配置,即调用System类的setProperty()方法配置信任库的相关内容。

信任库的相关属性详细描述如下所示:

❑javax.net.ssl.trustStore:指向信任库文件路径。

❑javax.net.ssl.trustStoreType:信任库文件类型。

❑javax.net.ssl.trustStorePassword:信任库密码。

对于密钥库相关配置也可按照上述方式如法炮制,我们将在后面介绍双向认证服务时详述。

此时,我们需要将服务器个人信息交换文件server.p12放置在D盘根目录下。初始化证书配置方法实现如代码清单12-41所示。

代码清单12-41 初始化证书配置—单向认证


//初始化证书配置

@Before

public final void init(){

//配置信任库

System.setProperty("javax.net.ssl.trustStore","D:\server.p12");

System.setProperty("javax.net.ssl.trustStoreType","PKCS12");

System.setProperty("javax.net.ssl.trustStorePassword","123456");

}


此处我们仅需要配置信任库,即将“javax.net.ssl.trustStore”属性指向文件client.p12,并指定信任库文件类型,即将“javax.net.ssl.trustStoreType”属性值设置为“PKCS12”。同时,指定信任库密码,即将“javax.net.ssl.trustStorePassword”属性值设置为“123456”。

这里仅仅针对Axis框架做上述配置,对于其他Web Service框架(如Axis2和CXF框架),请读者根据相关文档进行Web Service客户端配置。

接下来,我们需要修改原有请求地址,由HTTP协议改为HTTPS协议,如代码清单12-42所示。

代码清单12-42 SOAP响应测试用例—HTTPS协议访问路径配置


//Namespace URL

private String namespaceUri="https://192.168.184.131/axis/services/Version";

//WSDL URL

private String wsdlUrl="https://192.168.184.131/axis/services/Version?wsdl";


完成上述调整后,我们就可以验证单向认证服务了。完整测试用例如代码清单12-43所示。

代码清单12-43 SOAP响应测试用例—单向认证


import static org.junit.Assert.*;

import java.net.URL;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.junit.Before;

import org.junit.Test;

/**

*WebService测试

*@author梁栋

*@version 1.0

*@since 1.0

*/

public class WebServiceTest{

//Namespace URL

private String namespaceUri="https://192.168.184.131/axis/services/Version";

//WSDL URL

private String wsdlUrl="https://192.168.184.131/axis/services/Version?wsdl";

//初始化证书配置

@Before

public final void init(){

//配置信任库

System.setProperty("javax.net.ssl.trustStore",

"D:\server.p12");

System.setProperty("javax.net.ssl.trustStoreType","PKCS12");

System.setProperty("javax.net.ssl.trustStorePassword","123456");

}

/**

*测试

*@throws Exception

*/

@Test

public final void test()throws Exception{

//创建调用对象

Service service=new Service();

Call call=(Call)service.createCall();

//调用远程方法

call.setOperationName(new QName(namespaceUri,"getVersion"));

//设置URL

call.setTargetEndpointAddress(new URL(wsdlUrl));

//执行远程调用,同时获得返回值

String version=(String)call.invoke(new Object[]{});

//打印信息

System.err.println(version);

//验证

assertNotNull(version);

}

}


执行上述测试用例时,init()方法将在执行test()方法之前被调用,完成初始化设置。

此时,我们可以通过加密方式进行SOAP请求和回复操作。稍后我们将通过Wireshark监测并解析加密SOAP数据。

4.网络监测

打开Wireshark并绑定网卡(作者在这里绑定虚拟机网卡,IP为192.168.184.1)。在Wireshark过滤器地址栏中输入过滤信息,如代码清单12-44所示。

代码清单12-44 过滤拦截2


(ip.src==192.168.184.131&&ip.dst==192.168.184.1)||(ip.dst==192.168.184.131

&&ip.src==192.168.184.1)


其中

(ip. src==192.168.184.131&&ip.dst==192.168.184.1)指限定由本机请求虚拟机

(ip. dst==192.168.184.131&&ip.src==192.168.184.1)指限定由虚拟机回复本机

重新执行SOAP响应测试用例(单向认证),Wireshark监测结果如图12-30所示。

figure_0447_0171

图 12-30 Wireshark监测结果1

此时,我们无法在Wireshark中监测到真正的SSL/TLS交互内容。右键单击上图中任意一条数据包,在弹出的菜单中选择“Follow TCP Stream”菜单项。我们获得的将是完全无法识别的内容,如图12-31所示。

figure_0447_0172

图 12-31 SOAP加密交互内容

如果要在Wireshark中解析SSL/TLS交互内容,需要在Wireshark首选项(Preferences)中配置SSL协议。

单击Wireshark菜单“Edit”菜单项,在弹出的菜单中单击“Preferences”菜单项,如图12-32所示。

figure_0448_0173

图 12-32 Wireshark首选项菜单

打开Wireshark首选项对话框后,展开“Protocols”项,如图12-33所示。

figure_0448_0174

图 12-33 Wireshark首选项对话框

在Protocols列表中选择“SSL”项,在右侧“RSA keys list”输入框中输入相关信息,输入格式如代码清单12-45所示。

代码清单12-45 RSA keys list输入格式


<ip>,<port>,<protocol>,<keyfile>


其中


<ip>服务器IP地址,此处为192.168.184.131

<port>监听端口,此处为443

<protocol>监听协议,此处为https

<keyfile>服务器证书私钥文件,此处为d:\serkey.pem


在“SSL debug file”输入框中输入debug日志文件。完整操作如图12-34所示。

figure_0449_0175

图 12-34 配置SSL协议

完成上述配置后,观察Wireshark监测结果,可以监测到SSLV2、TLSV1等协议数据包,如图12-35所示。

在Wireshark过滤器地址栏中输入过滤信息筛选SSL/TLS协议数据包,如代码清单12-46所示。

代码清单12-46 过滤拦截3


(ip.src==192.168.184.131&&ip.dst==192.168.184.1)||(ip.dst==192.168.184.131&&ip.src==192.168.184.1)&&ssl


其中


(ip. src==192.168.184.131&&ip.dst==192.168.184.1)指限定由本机请求虚拟机

(ip. dst==192.168.184.131&&ip.src==192.168.184.1)指限定由虚拟机回复本机

ssl 指定SSL/TLS协议


执行上述修改后,Wireshark监测结果如图12-36所示。

figure_0450_0176

图 12-35 Wireshark监测结果2

figure_0450_0177

图 12-36 Wireshark监测结果3

在图12-36中右键单击任意一条记录,在弹出的菜单中选择“Follow SSL Stream”菜单项。

在弹出的窗口(Follow TCP Stream)中单击下拉列表框选择请求和回复信息,分别得到SOAP请求和SOAP回复内容,如图12-37和图12-38所示。

figure_0451_0178

图 12-37 SOAP请求解密内容

figure_0451_0179

图 12-38 SOAP回复解密内容

此时,我们通过Web Service系统与合作伙伴交互商业数据,而无须考虑数据泄露问题。数据交互双方并不需要对原有系统进行多处改动,并且无须对证书使用付费,自签名证书完全可以满足数据交互双方安全交互的需要。