框架编译说明:
(1) gsoap鉴权用到的文件: dom.c wsseapi.c smdevp.c mecevp.c threads.c wsaapi.c,还有对应的头文件。这些文件一般在\gsoap-2.8\gsoap\plugin\,把这些文件单独拷贝到编译目录中,无关的文件一概不拷贝。
(2) makefile中必须添加编译开关-DWITH_DOM -DWITH_OPENSSL
(3) wsse系列函数必须链接标准的openssl库:libssl.so、libcrypto.so。可以下载OPENSSL1.0.0的软件包编译。
二、OPENSSL1.0.0安装编译成动态链接库:
参考博文链接;http://blog.csdn.net/david_xtd/article/details/7057443
http://blog.sina.com.cn/s/blog_79ba23780101s3h5.html-----重点
安装包:http://pan.baidu.com/s/1c1NiwRA 密码:cmlz
1. ./config no-asm shared --prefix=/usr/local/Openssl_ARM_SO
此步骤中的 no-asm的使用是由于嵌入式arm设备有些不支持使用汇编进行加速。
2.修改makefile
62 #CC= gcc
63 CC = arm-unknown-linux-gnu-gcc
64 #CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall
65 CFLAG= -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_NO_KRB5 -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall
66 DEPFLAG= -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_STORE
67 PEX_LIBS=
68 EX_LIBS= -ldl
69 EXE_EXT=
70 ARFLAGS=
71 #AR= ar $(ARFLAGS) r
72 AR = arm-unknown-linux-gnu-ar $(ARFLAGS) r
73 RANLIB = arm-unknown-linux-gnu-ranlib
74 #RANLIB= /usr/bin/ranlib
75 #NM= nm
76 NM = arm-unknown-linux-gnu-nm
77 PERL= /usr/bin/perl
78 TAR= tar
79 TARFLAGS= --no-recursion
80 MAKEDEPPROG= gcc
81 LIBDIR=lib
prefix 是安装目录,openssldir 是配置文件目录,另外建议安装两次(这样就能既声称.a静态库,同时也生成.so静态库),shared 作用是生成动态连接库。
- tar -zxf openssl-1.0.0e.tar.gz
- cd openssl-1.0.0e/
- ./config --prefix=/usr/local --openssldir=/usr/local/ssl
- make && make install
- ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
- make clean
- make && make install
- 环境变量添加:
4 编译的说明
(1) gsoap鉴权用到的文件: dom.c wsseapi.c smdevp.c mecevp.c threads.c wsaapi.c,还有对应的头文件。这些文件一般在\gsoap-2.8\gsoap\plugin\,把这些文件单独拷贝到编译目录中,无关的文件一概不拷贝。
(2) makefile中必须添加编译开关-DWITH_DOM -DWITH_OPENSSL
(3) wsse系列函数必须链接标准的openssl库:libssl.so、libcrypto.so。可以下载OPENSSL1.0.0的软件包编译。
( 4 ) 在PC上使用gcc实现的时候仅仅是在 程序链接的时候将libssl.so、libcrypto.so库链接进去,并且还需将dom.c wsseapi.c smdevp.c mecevp.c threads.c wsaapi.c,还有对应的头文件包含在工程之中。不过此处需特别注意的是在编译 wsaapi.c的时候需要使用-DWITH_DOM
-DWITH_OPENSSL这个编译开关。建议在编译的时候直接将这两个编译选项直接加上即可。以免出错。期间出现的一些错误请自行处理。
(5) 在onvif设备鉴权的时候server端的函数调用:
soap_wsse_get_Username(struct soap *soap)-------------用于获取传输的用户名。此处需先进行获取用户名,然后与自身IPC所有的用户名进行比较,如果存在此用户名,则可进行下一步的鉴权,如果此用户名不存在的话即可直接返回错误,确定鉴权失败。
soap_wsse_verify_Password(struct soap *soap, const char *password)在上个函数获取到用户名后,就从IPC自己的用户管理部分获取用户的密码,填入此处的passwd进行校验。如果校验成功就返回SOAP_OK,表示鉴权成功,否则鉴权失败,
另外还有一个用于判断有效期的函数,soap_wsse_verify_Timestamp。 用于判断是否在有效期内,由于小编这边的IPC与NVR的时间同步并没有使用onvif进行时间同步,所以此有效期的判断我这里没有进行深入研究。
对于client方面的鉴权,参考网上大多数的例子即可。
我发现在服务器上存在libssl.so.0.9.8,路径如下:/work/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/target/usr/lib。
/montavista/pro/devkit/arm/v5t_le/target/usr/include/openssl,这里是对应的头文件。
经过尝试,该库是x86平台的,不能在分机上运行。最后找到交叉编译后的库文件: libssl.so.1.0.0, libcrypto.so.1.0.0, 分别替换到上述路径。另外必须使用openssl1.0.0软件包中的头文件替换到上述路径中,不然的话就会造成链接的库是1.0.0版本,而程序编译时的数据结构还是0.9.8版本的,引起程序运行时指错误死机,一般报告释放指针错误。
必须在交叉工具链目录下替换openssl1.0.0头文件的原因:因为openssl工具包中的文件头部都是# include <openssl/opensslconf.h>之类。<>包含的文件首先到系统搜索路径下寻找,然后才到当前目录寻找,因此即使把这些头文件拷贝到编译目录下也无用。
(4) 链接ssl、crypto库文件时,必须提供索引文件libssl.so--> libssl.so.1.0.0 libcrypto.so--> libcrypto.so.1.0.0否则就会自动链接到服务器上的x86版本库文件,在分机上不能运行。
5 运行makefile, 生成searchOnvif。
对于生成的两个动态链接库的引用顺序:-lssl -lcrypto,如果为-lcrypto –lssl,编译时会出现错误