通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx

上传人:b****6 文档编号:6036030 上传时间:2023-01-03 格式:DOCX 页数:11 大小:50.62KB
下载 相关 举报
通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx_第1页
第1页 / 共11页
通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx_第2页
第2页 / 共11页
通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx_第3页
第3页 / 共11页
通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx_第4页
第4页 / 共11页
通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx

《通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx》由会员分享,可在线阅读,更多相关《通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx(11页珍藏版)》请在冰豆网上搜索。

通过双向证书认证访问由tomcat7和Axis2搭建的web服务上.docx

通过双向证书认证访问由tomcat7和Axis2搭建的web服务上

通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)

TAG标签:

Web服务双向证书认证访问tomcat7Axis2

摘要:

本文通过一系列的实验步骤描述,向您展示如何使用gSOAP编写的客户端,通过双向证书认证,访问由tomcat7和Axis2搭建的web服务。

全文循序渐进,分为几个阶段逐步展开,每个阶段相关的注意事项和遇到过的一些问题也一并记录下来供读者参考。

先简单介绍一下需要准备的工具。

•服务端:

由tomcat7+axis2搭建而成

•客户端:

由gSOAP工具生成

•证书:

用openssl和jdk自带的keytool制作

•其它:

如果在Windows操作系统下实验,C/C++代码可能还会需要一些集成开发环境,如VisualC++2010或CodeBlocks+MinGW等。

Java代码的编译可能会用到eclipse。

此外,为叙述方便,后文的用词上也作一些约定:

•将tomcat7的安装路径记为:

•将gSOAP压缩包的解压路径记为:

•将openssl的安装路径记为:

•将基于http的web服务网址记为:

•将基于https的web服务网址记为:

搭建基于http的web服务

准备好java代码

这里编写一个非常简单的sayHello功能的java代码,传入参数是一个字符串,返回值则是“Hello”加上传入的字符串。

稍后用其发布web服务已经足够了,如清单1所示:

清单1.sayHello源码

publicclassSimpleService{

publicStringsayHello(Stringname){

return"Hello,"+name;

}

}

使用eclipse或者jdk自带的javac命令行工具进行编译,生成SimpleService.class文件。

部署服务

利用SimpleService.class文件,快速的发布一个基于http的web服务,步骤如下:

•从axis2官方网站下载WAR(WebArchive)Distribution,例如:

axis2-1.6.2-war.zip

•将axis2-1.6.2-war.zip文件解压缩,获得axis2.war文件;

•将axis2.war文件放置于\webapps下;

•启动tomcat7,axis2.war会自动解压缩生成axis2目录;

•将SimpleService.class放置于\webapps\axis2\WEB-INF\pojo下。

这样,一个简单的web服务发布就完成了。

验证的方式也很简单,打开发布服务电脑上的浏览器,查看网址http:

//127.0.0.1:

8080/axis2/services/SimpleService?

wsdl,如果能够显示XML结构的内容,就说明发布成功。

当然,也可以通过局域网内其它电脑访问该服务,如果访问不了,需要查看,IP地址和端口是否正确,防火墙是否配置得当或关闭等。

后文我们将这个基于http的web服务网址记为

值得一提的是,这里我们发布的web服务是通过axis2提供的热部署(hotdeployment)功能进行的。

打开\webapps\axis2\WEB-INF\conf下的axis2.xml文件,我们可以看到axis2默认是打开了热部署开关hotdeployment的,如图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压缩包的解压路径记为:

\gsoap\bin\下,已经为我们准备好了三种不同平台的代码生成工具,使用时根据自己的操作系统进行选择。

如果没有合适的版本,可以根据工具源码,以及INSTALL.txt文件的描述,自行编译。

下面描述工具的使用步骤。

生成头文件

在命令行中输入生成C++头文件的命令:

wsdl2h-ogSOAP_http.h

如果要生成C头文件,则需要加上-c选项:

wsdl2h-c-ogSOAP_http.h

此外,我们也可以将从浏览器中另存为本地的XML文件,用于上述的命令中来生成头文件。

wsdl2h命令选项比较多,除了常用的-c–o等选项之外,可以敲入-h进行详细查看。

注意!

在生成代码的过程中,可能会遇到“Cannotopenfile‘typemap.dat’”的提示,这里typemap.dat文件主要的作用是从xml格式数据转换为C/C++代码时,可以自定义或优化绑定的类型。

该文件可以从\gsoap\下找到。

本文的实验中,不使用该文件也可以,wsdl2h会使用内置类型进行转换。

生成源文件

接下来,我们利用gSOAP_http.h生成相关的源码。

在命令行中输入生成C++客户端源码的命令:

soapcpp2-CgSOAP_http.h-I\gsoap\import

如果要生成C源码,则需要加上-c选项:

soapcpp2-c-CgSOAP_http.h-I\gsoap\import

这里-C表示只生成客户端源码,-c表示只生成C语言源码,-I指明了生成源码时需要提供的头文件路径。

soapcpp2命令还有更多的选项,可以通过敲入-h进行详细查看。

挑选有用的文件

如果生成的是C++源码,则需要的文件包括以下8个:

•gSOAP_http.h

•soapH.h

•soapStub.h

•SimpleServiceSoap11Binding.nsmap

•soapC.cpp

•soapClient.cpp

\gsoap\stdsoap2.h

\gsoap\stdsoap2.cpp

如果生成的是C源码,则需要的文件包括以下8个:

•gSOAP_http.h

•soapH.h

•soapStub.h

•SimpleServiceSoap11Binding.nsmap

•soapC.c

•soapClient.c

\gsoap\stdsoap2.h

\gsoap\stdsoap2.c

注意!

并非针对所有的web服务生成的文件名和数量都是固定的,例如这里会生成SimpleServiceSoap11Binding.nsmap和SimpleServiceSoap12Binding.nsmap两个文件,但有些web服务可能只生成一个.nsmap文件。

编写客户端代码时要根据具体情况,进行头文件包含。

通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)(3)

TAG标签:

Web服务双向证书认证访问tomcat7Axis2

摘要:

编写客户端代码根据挑选好的8个文件,建立一个C++或者C的工程,然后再自行建立一个包含main()函数的源文件:

清单2.支持http方式的C++客户端源

编写客户端代码

根据挑选好的8个文件,建立一个C++或者C的工程,然后再自行建立一个包含main()函数的源文件:

清单2.支持http方式的C++客户端源码

#include"soapH.h"

#include"SimpleServiceSoap11Binding.nsmap"

usingnamespacestd;

intmain()

{

structsoaptClientSoap;

_ns1__sayHellotSayHelloSender;

_ns1__sayHelloResponsetSayHelloResponse;

intiResult;

soap_init(&tClientSoap);

tSayHelloSender.args0=newstring("thebeautifulworld!

\n");

iResult=soap_call___ns2__sayHello(&tClientSoap,NULL,NULL,

&tSayHelloSender,&tSayHelloResponse);

if(iResult==SOAP_OK)

{

cout<<*(tSayHelloResponse.return_)<

}

else

{

cout<<"Errorcode"<

}

deletetSayHelloSender.args0;

soap_destroy(&tClientSoap);

soap_end(&tClientSoap);

soap_done(&tClientSoap);

return0;

}

清单3.支持http方式的C客户端源码

#include"soapH.h"

#include"SimpleServiceSoap11Binding.nsmap"

intmain()

{

structsoaptClientSoap;

struct_ns1__sayHellotSayHelloSender;

struct_ns1__sayHelloResponsetSayHelloResponse;

charachName[256]="thebeautifulworld!

\n";

intiResult;

soap_init(&tClientSoap);

tSayHelloSender.args0=achName;

iResult=soap_call___ns2__sayHello(&tClientSoap,NULL,NULL,

&tSayHelloSender,&tSayHelloResponse);

if(iResult==SOAP_OK)

{

printf("%s\n",tSayHelloResponse.return_);

}

else

{

printf("Errorcode%d\n",iResult);

}

soap_destroy(&tClientSoap);

soap_end(&tClientSoap);

soap_done(&tClientSoap);

return0;

}

通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)(4)

摘要:

编译和运行可能出现的问题除了前文所述的,需要根据具体情况调整包含的.nsmap文件名之外。

使用gSOAP工具生成的头文件和源码中包含的结构体、类和

译和运行可能出现的问题

除了前文所述的,需要根据具体情况调整包含的.nsmap文件名之外。

使用gSOAP工具生成的头文件和源码中包含的结构体、类和函数名也是根据情况的变化而不同的(本例中是_ns1_sayHello、_ns1_sayHelloResponse以及soap_call___ns2__sayHello()函数)。

通常情况下,查阅wsdl2h工具生成的头文件(本例中是gSOAP_http.h文件),就可以找到对应的声明。

如果出现调用soap函数返回结果不是SOAP_OK的情况,可以根据错误码打印,在stdsoap2.h文件中找到对应的宏定义名。

Windows平台下:

以C++代码为例,可以使用VisualStudio2010或者CodeBlocks+MinGW进行编译和运行。

其中,使用CodeBlocks+MinGW可能会遇到一些问题,例如编译的时候可能会报错“undefinedreferencetosendto@24'”或者“undefinedreferenceto__imp_send”。

此时需要链接库文件libws2_32.a。

Linux平台下:

以C代码为例,可以在源码目录下简单键入命令gcc–oHello*.c生成可执行文件。

如果上述步骤均无错,编译成功后运行,可以看到输出结果“Hello,thebeautifulworld!

制作证书

前面描述了一个基于http方式web服务的搭建和访问。

接下来,为了将其改造为基于https的通信方式,我们需要先准备好相关的证书。

由于只是用于实验目的,就不向专门的CA认证机构申请证书了,使用openssl工具进行证书的制作。

编译和安装openssl

Windows平台

在Windows平台下编译openssl需要确保安装有VisualC++2005以上版本,如果没有perl工具还需要安装activeperl。

编译步骤如下:

•打开命令行,运行VisualC++安装路径下的VC\vcvarsall.bat文件以注册环境变量

•确保已将perl.exe所在路径添加到环境变量PATH中

•从openssl网站下载压缩包,例如:

openssl-1.0.1c.tar.gz,然后解压

•从命令行进openssl的解压目录

•指定安装目录,例如D:

\ssl,输入命令perlConfigureVC-WIN32--prefix=D:

\ssl

•输入命令ms\do_ms

•输入命令nmake-fms\ntdll.mak

•输入命令nmake-fms\ntdll.maktest

•输入命令nmake-fms\ntdll.makinstall

上述步骤完毕后,生成的内容都输出到D:

\ssl了(实际上先是生成到解压目录下的out32dll子目录中的)。

后文我们就将openssl的安装目录记为

其中,\lib\下的libeay32.lib和ssleay32.lib就是后文进行程序的编译链接时需要的库文件。

注意!

如果不严格按照上述步骤来做,容易出现一些问题。

例如:

使用VisualC++6.0版本的话,很可能会在执行nmake-fms\ntdll.mak时遇到错误NMAKE:

fatalerrorU1077:

'ml':

returncode'0x1',微软提供了一个MASMsetup.EXE文件的下载用来修正这个问题,但实际上问题还会存在。

仔细阅读微软的下载页面就会发现,这个文件是为VisualC++2005准备的。

所以还是建议使用VisualC++2005以上的版本。

再如:

如果不是在命令行中,运行上文所述的vcvarsall.bat文件,就会出现namke.exe、link.exe等工具找不到的错误提示。

即使手动将相关路径加入PATH环境变量,还是会出现其它文件找不到引发的错误提示。

此外,设定的时候,如果指定到根目录下,可能会提示错误,无法创建相关文件夹。

如果要清理掉重新编译,先执行nmake-fms\ntdll.makclean命令。

Linux平台

通常情况下Linux系统已经自带openssl。

可以在命令行下键入openssl命令进行尝试,如果提示找不到相关命令,再使用压缩包解压后进行编译和安装,过程比较简单,这里不赘述。

注意!

Windows下libeay32.lib和ssleay32.lib文件,在Linux下对应的文件名是libcrypto.a和libssl.a

制作CA根证书

从命令行进入\bin目录,输入命令

opensslreq-new-x509-keyoutca.key-outca.crt-config..\ssl\f

这里会要求输入key文件保护口令,以及证书的详细信息,生成的文件包括:

•ca.key该文件是CA私钥文件

•ca.crt该文件是CA自签名证书,也即后面用做CA根证书的文件

注意!

接下来制作服务端和客户端证书的时候,填写的证书详细信息,不要和CA证书的详细信息完全一样,否则,使用CA私钥进行签名时会报错:

“opensslTXT_DBerrornumber2failedtoupdatedatabase”。

通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)(5)

摘要:

制作服务端证书先使用jdk自带的keytool工具,为服务端生成一个keystore文件。

打开命令行,进入某个存放服务端证书的目录,然后输入命令:

keytool-

先使用jdk自带的keytool工具,为服务端生成一个keystore文件。

打开命令行,进入某个存放服务端证书的目录,然后输入命令:

keytool-genkey-aliasserver-keyalgRSA-keystoreserver.keystore

这里keytool也会交互的要求用户输入keystore文件保护口令,以及相应的证书详细信息。

生成的server.keystore文件中,包含了服务端的一对密钥以及一个自签名证书。

注意!

服务端证书详细信息中的CommonName(名字与姓氏)要和客户端访问的URL域名或IP地址一致,否则gSOAP程序内部会检验不通过导致访问失败。

具体情况下文会提及。

由于我们要让服务端和客户端信任同一个CA,因此这里生成的自签名证书需要替换成由CA私钥签名的证书。

具体操作如下:

首先,生成服务端的证书签名请求文件,输入命令

keytool-certreq-aliasserver-sigalgMD5withRSA-fileserver.csr-keystoreserver.keystore

按照提示,输入server.keystore的保护口令后,生成了server.csr

然后将server.csr拷贝到CA所在电脑的\bin目录下,输入命令:

opensslca-inserver.csr-outserver.crt-certca.crt-keyfileca.key-notext-config..\ssl\f

注意!

这里可能会提示缺少./demoCA等目录和文件。

要解决这个问题,可以修改\ssl\f中的配置,也可以在当前的\bin下手动建立如下内容:

•demoCA目录

•demoCA\index.txt文件

•demoCA\serial文件,并手动在里面随便填写一个合法的十六进制数值,如0000

•demoCA\newcerts目录

注意!

这里还可能会遇到诸如“ThestateOrProvinceNamefieldneededtobethesameintheCAcertificate(xx)andtherequest(xx)”的错误。

有可能CA证书的这个字段和服务端证书请求的这个字段确实不同,那么重新生成字段相同的文件即可。

也有可能明明已经相同了,还报这个错误,这是openssl某些版本的bug,可以查阅openssl的bugreport页面以及相关参考页面。

为解决这个问题,需要将\ssl\f中[policy_match]下相关字段值由match修改为optional。

重新执行一下上述命令,如果顺利,就会生成服务端证书文件server.crt。

接下来,我们要将CA签名后的证书导入server.keystore。

方法是将ca.crt和server.crt拷贝回server.keystore所在电脑的目录下,输入命令:

keytool-import-v-trustcacerts-aliasca-fileca.crt-keystoreserver.keystore

keytool-import-v-aliasserver-fileserver.crt-keystoreserver.keystore

上述第一步,是导入CA根证书作为服务端的受信任CA。

第二部是导入由CA签名的服务端证书。

注意!

这里必须先将CA根证书导入服务端证书所在的同一个keystore文件中,然后才能导入新生成的服务端证书,否则keytool会报错“keytool错误:

java.lang.Exception:

无法从回复中建立链接”。

制作客户端证书

先生成客户端私钥,在命令行中输入:

opensslgenrsa-des3-outclient.key1024

接着生成客户端证书签名请求文件,输入命令:

opensslreq-new-keyclient.key-outclient.csr-config..\ssl\f

最后进行CA签名:

opensslca-inclient.csr-outclient.crt-certca.crt-keyfileca.key-notext-config..\ssl\f

顺利的话,客户端证书文件client.crt就生成完毕了。

注意!

我们还需

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1