1、通过双向证书认证访问由tomcat7和Axis2搭建的web服务上通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)TAG标签: Web服务 双向证书 认证访问 tomcat7 Axis2 摘要:本文通过一系列的实验步骤描述,向您展示如何使用 gSOAP 编写的客户端,通过双向证书认证,访问由 tomcat7 和 Axis2 搭建的 web 服务。全文循序渐进,分为几个阶段逐步展开,每个阶段相关的注意事项和遇到过的一些问题也一并记录下来供读者参考。 先简单介绍一下需要准备的工具。服务端:由 tomcat7+axis2 搭建而成客户端:由 gSOAP 工具生成证书 :用 op
2、enssl 和 jdk 自带的 keytool 制作其它 :如果在 Windows 操作系统下实验,C/C+ 代码可能还会需要一些集成开发环境,如 Visual C+2010 或 CodeBlocks+MinGW 等。Java 代码的编译可能会用到 eclipse。此外,为叙述方便,后文的用词上也作一些约定:将 tomcat7 的安装路径记为:将 gSOAP 压缩包的解压路径记为:将 openssl 的安装路径记为:将基于 http 的 web 服务网址记为:将基于 https 的 web 服务网址记为:搭建基于 http 的 web 服务准备好 java 代码这里编写一个非常简单的 sayH
3、ello 功能的 java 代码,传入参数是一个字符串,返回值则是“Hello”加上传入的字符串。稍后用其发布 web 服务已经足够了,如 清单 1 所示:清单 1. sayHello 源码 public class SimpleService public String sayHello(String name) return Hello, +name; 使用 eclipse 或者 jdk 自带的 javac 命令行工具进行编译,生成 SimpleService.class 文件。部署服务利用 SimpleService.class 文件,快速的发布一个基于 http 的 web 服务,步骤
4、如下:从 axis2 官方网站下载 WAR (Web Archive) Distribution,例如:axis2-1.6.2-war.zip将 axis2-1.6.2-war.zip 文件解压缩,获得 axis2.war 文件;将 axis2.war 文件放置于 webapps 下;启动 tomcat7,axis2.war 会自动解压缩生成 axis2 目录;将 SimpleService.class 放置于 webappsaxis2WEB-INFpojo 下。这样,一个简单的 web 服务发布就完成了。验证的方式也很简单,打开发布服务电脑上的浏览器,查看网址 http:/127.0.0.1
5、:8080/axis2/services/SimpleService?wsdl,如果能够显示 XML 结构的内容,就说明发布成功。当然,也可以通过局域网内其它电脑访问该服务,如果访问不了,需要查看,IP 地址和端口是否正确,防火墙是否配置得当或关闭等。后文我们将这个基于 http 的 web 服务网址记为 。值得一提的是,这里我们发布的 web 服务是通过 axis2 提供的热部署 (hotdeployment)功能进行的。打开 webappsaxis2WEB-INFconf 下的 axis2.xml 文件,我们可以看到 axis2 默认是打开了热部署开关 hotdeployment 的,如
6、图 1 所示。图 1. axis2 热部署开关此外,pojo 部署目录也可以进行修改,如 图 2 所示: 通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)(2)摘要:编写支持 http 方式的客户端 编写客户端,首先要使用 gSOAP 提供的工具生成一些代码。 gSOAP 的压缩包可以从其网站下载,例如 gsoap_2.8.9.zip,然后解压即可编写支持 http 方式的客户端编写客户端,首先要使用 gSOAP 提供的工具生成一些代码。gSOAP 的压缩包可以从其网站下载,例如 gsoap_2.8.9.zip,然后解压即可。后文我们将 gSOAP 压缩包的解压路径记为:
7、。在 gsoapbin 下,已经为我们准备好了三种不同平台的代码生成工具,使用时根据自己的操作系统进行选择。如果没有合适的版本,可以根据工具源码,以及 INSTALL.txt 文件的描述,自行编译。下面描述工具的使用步骤。生成头文件在命令行中输入生成 C+ 头文件的命令:wsdl2h -o gSOAP_http.h 如果要生成 C 头文件,则需要加上 -c 选项:wsdl2h -c -o gSOAP_http.h 此外,我们也可以将 从浏览器中另存为本地的 XML 文件,用于上述的命令中来生成头文件。wsdl2h 命令选项比较多,除了常用的 -c o 等选项之外,可以敲入 -h 进行详细查看。
8、注意! 在生成代码的过程中,可能会遇到“Cannot open file typemap.dat ”的提示,这里 typemap.dat 文件主要的作用是从 xml 格式数据转换为 C/C+ 代码时,可以自定义或优化绑定的类型。该文件可以从 gsoap 下找到。本文的实验中,不使用该文件也可以,wsdl2h 会使用内置类型进行转换。生成源文件接下来,我们利用 gSOAP_http.h 生成相关的源码。在命令行中输入生成 C+ 客户端源码的命令:soapcpp2 -C gSOAP_http.h -I gsoapimport如果要生成 C 源码,则需要加上 -c 选项:soapcpp2 -c -C
9、 gSOAP_http.h -I gsoapimport这里 -C 表示只生成客户端源码,-c 表示只生成 C 语言源码,-I 指明了生成源码时需要提供的头文件路径。soapcpp2 命令还有更多的选项,可以通过敲入 -h 进行详细查看。挑选有用的文件如果生成的是 C+ 源码,则需要的文件包括以下 8 个:gSOAP_http.hsoapH.hsoapStub.hSimpleServiceSoap11Binding.nsmapsoapC.cppsoapClient.cppgsoapstdsoap2.hgsoapstdsoap2.cpp如果生成的是 C 源码,则需要的文件包括以下 8 个:gSO
10、AP_http.hsoapH.hsoapStub.hSimpleServiceSoap11Binding.nsmapsoapC.csoapClient.cgsoapstdsoap2.hgsoapstdsoap2.c注意! 并非针对所有的 web 服务生成的文件名和数量都是固定的,例如这里会生成 SimpleServiceSoap11Binding.nsmap 和 SimpleServiceSoap12Binding.nsmap 两个文件,但有些 web 服务可能只生成一个 .nsmap 文件。编写客户端代码时要根据具体情况,进行头文件包含。通过双向证书认证访问由tomcat7和Axis2搭建的
11、web服务(上)(3)TAG标签: Web服务 双向证书 认证访问 tomcat7 Axis2 摘要:编写客户端代码 根据挑选好的 8 个文件,建立一个 C+ 或者 C 的工程,然后再自行建立一个包含 main() 函数的源文件: 清单 2. 支持 http 方式的 C+ 客户端源编写客户端代码根据挑选好的 8 个文件,建立一个 C+ 或者 C 的工程,然后再自行建立一个包含 main() 函数的源文件:清单 2. 支持 http 方式的 C+ 客户端源码 #include soapH.h #include SimpleServiceSoap11Binding.nsmap using name
12、space std; int main() struct soap tClientSoap; _ns1_sayHello tSayHelloSender; _ns1_sayHelloResponse tSayHelloResponse; int iResult; soap_init(&tClientSoap); tSayHelloSender.args0 = new string(the beautiful world!n); iResult=soap_call_ns2_sayHello(&tClientSoap, NULL, NULL, &tSayHelloSender, &tSayHell
13、oResponse); if(iResult=SOAP_OK) cout*(tSayHelloResponse.return_)endl; else coutError code iResultendl; delete tSayHelloSender.args0; soap_destroy(&tClientSoap); soap_end(&tClientSoap); soap_done(&tClientSoap); return 0; 清单 3. 支持 http 方式的 C 客户端源码 #include soapH.h #include SimpleServiceSoap11Binding.n
14、smap int main() struct soap tClientSoap; struct _ns1_sayHello tSayHelloSender; struct _ns1_sayHelloResponse tSayHelloResponse; char achName256=the beautiful world!n; int iResult; soap_init(&tClientSoap); tSayHelloSender.args0=achName; iResult=soap_call_ns2_sayHello(&tClientSoap, NULL, NULL, &tSayHel
15、loSender, &tSayHelloResponse); if(iResult=SOAP_OK) printf(%sn,tSayHelloResponse.return_); else printf(Error code %dn,iResult); soap_destroy(&tClientSoap); soap_end(&tClientSoap); soap_done(&tClientSoap); return 0; 通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)(4)摘要:编译和运行可能出现的问题 除了前文所述的,需要根据具体情况调整包含的 .nsmap 文件名
16、之外。 使用 gSOAP 工具生成的头文件和源码中包含的结构体、类和译和运行可能出现的问题除了前文所述的,需要根据具体情况调整包含的 .nsmap 文件名之外。使用 gSOAP 工具生成的头文件和源码中包含的结构体、类和函数名也是根据情况的变化而不同的(本例中是 _ns1_sayHello、_ns1_sayHelloResponse 以及 soap_call_ns2_sayHello() 函数)。通常情况下,查阅 wsdl2h 工具生成的头文件(本例中是 gSOAP_http.h 文件),就可以找到对应的声明。如果出现调用 soap 函数返回结果不是 SOAP_OK 的情况,可以根据错误码打印
17、,在 stdsoap2.h 文件中找到对应的宏定义名。Windows 平台下:以 C+ 代码为例,可以使用 Visual Studio2010 或者 CodeBlocks+MinGW 进行编译和运行。其中,使用 CodeBlocks+MinGW 可能会遇到一些问题,例如编译的时候可能会报错“undefined reference to sendto24”或者“undefined reference to _imp_send”。此时需要链接库文件 libws2_32.a。Linux 平台下:以 C 代码为例,可以在源码目录下简单键入命令 gcc o Hello *.c 生成可执行文件。如果上述步
18、骤均无错,编译成功后运行,可以看到输出结果“Hello, the beautiful world!”制作证书前面描述了一个基于 http 方式 web 服务的搭建和访问。接下来,为了将其改造为基于 https 的通信方式,我们需要先准备好相关的证书。由于只是用于实验目的,就不向专门的 CA 认证机构申请证书了,使用 openssl 工具进行证书的制作。编译和安装 opensslWindows 平台在 Windows 平台下编译 openssl 需要确保安装有 Visual C+2005 以上版本,如果没有 perl 工具还需要安装 activeperl。编译步骤如下:打开命令行,运行 Visu
19、al C+ 安装路径下的 VCvcvarsall.bat 文件以注册环境变量确保已将 perl.exe 所在路径添加到环境变量 PATH 中从 openssl 网站下载压缩包,例如:openssl-1.0.1c.tar.gz,然后解压从命令行进 openssl 的解压目录指定安装目录,例如 D:ssl,输入命令 perl Configure VC-WIN32 -prefix=D:ssl输入命令 msdo_ms输入命令 nmake -f msntdll.mak输入命令 nmake -f msntdll.mak test输入命令 nmake -f msntdll.mak install上述步骤完毕
20、后,生成的内容都输出到 D:ssl 了(实际上先是生成到解压目录下的 out32dll 子目录中的)。后文我们就将 openssl 的安装目录记为 。其中,lib 下的 libeay32.lib 和 ssleay32.lib 就是后文进行程序的编译链接时需要的库文件。注意! 如果不严格按照上述步骤来做,容易出现一些问题。例如:使用 Visual C+6.0 版本的话,很可能会在执行 nmake -f msntdll.mak 时遇到错误 NMAKE : fatal error U1077: ml : return code 0x1,微软提供了一个 MASMsetup.EXE 文件 的下载用来修正
21、这个问题,但实际上问题还会存在。仔细阅读微软的下载页面就会发现,这个文件是为 Visual C+2005 准备的。所以还是建议使用 Visual C+2005 以上的版本。再如:如果不是在命令行中,运行上文所述的 vcvarsall.bat 文件,就会出现 namke.exe、link.exe 等工具找不到的错误提示。即使手动将相关路径加入 PATH 环境变量,还是会出现其它文件找不到引发的错误提示。此外,设定 的时候,如果指定到根目录下,可能会提示错误,无法创建相关文件夹。如果要清理掉重新编译,先执行 nmake -f msntdll.mak clean 命令。Linux 平台通常情况下 L
22、inux 系统已经自带 openssl。可以在命令行下键入 openssl 命令进行尝试,如果提示找不到相关命令,再使用压缩包解压后进行编译和安装,过程比较简单,这里不赘述。注意!Windows 下 libeay32.lib 和 ssleay32.lib 文件,在 Linux 下对应的文件名是 libcrypto.a 和 libssl.a制作 CA 根证书从命令行进入 bin 目录,输入命令openssl req -new -x509 -keyout ca.key -out ca.crt -config .sslf这里会要求输入 key 文件保护口令,以及证书的详细信息,生成的文件包括:ca.
23、key 该文件是 CA 私钥文件ca.crt 该文件是 CA 自签名证书,也即后面用做 CA 根证书的文件注意! 接下来制作服务端和客户端证书的时候,填写的证书详细信息,不要和 CA 证书的详细信息完全一样,否则,使用 CA 私钥进行签名时会报错:“openssl TXT_DB error number 2 failed to update database”。通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)(5)摘要:制作服务端证书 先使用 jdk 自带的 keytool 工具,为服务端生成一个 keystore 文件。打开命令行,进入某个存放服务端证书的目录,然后输入
24、命令: keytool -先使用 jdk 自带的 keytool 工具,为服务端生成一个 keystore 文件。打开命令行,进入某个存放服务端证书的目录,然后输入命令:keytool -genkey -alias server -keyalg RSA -keystore server.keystore这里 keytool 也会交互的要求用户输入 keystore 文件保护口令,以及相应的证书详细信息。生成的 server.keystore 文件中,包含了服务端的一对密钥以及一个自签名证书。注意! 服务端证书详细信息中的 CommonName(名字与姓氏)要和客户端访问的 URL 域名或 IP
25、 地址一致,否则 gSOAP 程序内部会检验不通过导致访问失败。具体情况下文会提及。由于我们要让服务端和客户端信任同一个 CA,因此这里生成的自签名证书需要替换成由 CA 私钥 签名的证书。具体操作如下:首先,生成服务端的证书签名请求文件,输入命令keytool -certreq -alias server -sigalg MD5withRSA -file server.csr -keystore server.keystore按照提示,输入 server.keystore 的保护口令后,生成了 server.csr然后将 server.csr 拷贝到 CA 所在电脑的 bin 目录下,输入命
26、令:openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -notext -config .sslf注意! 这里可能会提示缺少 ./demoCA 等目录和文件。要解决这个问题,可以修改 sslf 中的配置,也可以在当前的 bin 下手动建立如下内容:demoCA 目录demoCAindex.txt 文件demoCAserial 文件,并手动在里面随便填写一个合法的十六进制数值,如 0000demoCAnewcerts 目录注意 ! 这里还可能会遇到诸如“The stateOrProvinceName fie
27、ld needed to be the same in the CA certificate (xx) and the request (xx)”的错误。有可能 CA 证书的这个字段和服务端证书请求的这个字段确实不同,那么重新生成字段相同的文件即可。也有可能明明已经相同了,还报这个错误,这是 openssl 某些版本的 bug,可以查阅 openssl 的 bug report 页面以及 相关参考 页面。为解决这个问题,需要将 sslf 中 policy_match 下相关字段值由 match 修改为 optional。重新执行一下上述命令 , 如果顺利,就会生成服务端证书文件 server.
28、crt。接下来,我们要将 CA 签名后的证书导入 server.keystore。方法是将 ca.crt 和 server.crt 拷贝回 server.keystore 所在电脑的目录下,输入命令:keytool -import -v -trustcacerts -alias ca -file ca.crt -keystore server.keystorekeytool -import -v -alias server -file server.crt -keystore server.keystore上述第一步,是导入 CA 根证书作为服务端的受信任 CA。第二部是导入由 CA 签名的服
29、务端证书。注意! 这里必须先将 CA 根证书导入服务端证书所在的同一个 keystore 文件中,然后才能导入新生成的服务端证书,否则 keytool 会报错“keytool 错误: java.lang.Exception: 无法从回复中建立链接”。制作客户端证书先生成客户端私钥,在命令行中输入:openssl genrsa -des3 -out client.key 1024接着生成客户端证书签名请求文件,输入命令:openssl req -new -key client.key -out client.csr -config .sslf最后进行 CA 签名:openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -notext -config .sslf顺利的话,客户端证书文件 client.crt 就生成完毕了。注意! 我们还需
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1