}
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就生成完毕了。
注意!
我们还需