OpenDiameter安装指南
关于Diameter,请参照 rfc3588 和 rfc4006。OpenDiameter是实现Diameter协议的开源软件,通常需要我们自己编译运行,
从README下看可能觉得较为简易,但实际操作时远非易事。下面是我编译的过程及遇到的一些问题以及对应的解决办法。
1,软件包下载及安装过程
OpenDiameter的编译依赖下面几个软件包:
GUN g++
OpenSSL
ACE
BOOST
autoconf/automake/libtool
OpenDiameter
a, OpenSSL
下载网址: http://www.openssl.org/source/
版本号:openssl-0.9.8g
安装方法:cd $OpenSSL_DIR; sudo make; sudo make install
结果:自动安装到 /usr/local/ssl 目录下
描述: OpenSSL的编译方法和其它稍不一样,不用执行./Configure, 直接Make就行。
b, ACE
下载网址:http://www.cs.wustl.edu/%7Eschmidt/ACE.html
版本号:ACE-5.7.5
安装方法:cd $ACE_Wappe; mkdir build; cd build; sudo ../configure; sudo make; sudo make install
描述:ACE库编译时出现一些问题,后面有详述。另外,安装到系统目录比较凌乱,建议如下下次编译时,指定安装目
录。sudo ../configure --prefix=ACE。
c, BOOST
下载网址:http://www.boost.org/
版本号:boost_1_41_0
安装方法:sudo apt-get install libboost-dev
描述:并不需要自己主动安装,采用apt-get方法就行。
d, autoconf/automake/libtool
安装方法:sudo apt-get install autoconf automake libtool
描述:目前仍不知道该工具做什么用的,有TX知道的可以补充
e, OpenDiameter
预置条件:设置 BOOST_ROOT与ACE_ROOT环境变量。export ACE_ROOT=/usr/local,export BOOST_ROOT=/usr/include
下载网站:www.OpenDiameter.org 或者 http://sourceforge.net/projects/diameter/files/
版本号:opendiameter-1.0.7-i
安装方法:cd $OpenDiameter_Dir; mkdir build; cd build; sudo ../configure; sudo make; sudo make install
描述:下载过程中出现许多问题,后面有详述。
2,编译安装过程中出现的问题及解决办法。
a, opendiameter下载问题
当时opendiameter的官方网站不能访问,曾试过以下几个办法,花费了几天的时间,
(1) google中搜索:但发现pudn等网站是要收费的 [未解决]
(2) 在bbs中询问。得到http://sourceforge.net/projects/diameter/files/下载网站。[解决]
(3) 找曾开发过的diameter的经验工程师。无果。[未解决]
从上面来看,从BBS上报告问题应该是一个好的办法,尽管会有一些延迟,但通常能得到一些好的建议。
b, openssl版本较老
80%错误都是与openssl有关,一方面旧的openssl是安装在/opt目录下,另一方面openssl太老了。导致了一系列的问题
,之后更新了openssl后,问题减少了许多。
当时colinux下安装的openssl较老,在编译生成.so时,拷贝了较新的header文件,但后来libssl.a库文件中找不到
AES_encrypt/AES_set_encrypt_key函数,事后更新openssl库文件后,问题解决了。
错误提示:undefined reference to `AES_set_encrypt_key'
c, -lssl 找不到
这个主要是由于libssl.a的文件目录路径设置不当,将/usr/local/ssl/lib加入到-L中就好了。
d, libACE_SSL.so 找不到通常的SSL_CTX_free函数等
这个目前仍不明白为什么,实际上libssl.a已经加入到可搜索到路径中,在LIBS中增加如下一行后,问题就解决了
LIBS = -lrt -ldl /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a
e, 在文件中aaa_transport_ace.h:field 'm_SigRegistrar' has incomplete type
解决办法:在aaa_transport_ace.h增加如下header文件 #include "ace/Sig_Handler.h"
f, 在文件中pana_serial_num.h:no matching function for get_local_system_time(ACE_UINT32&)
解决办法:主要是ACE_UINT32和time_t的转换有困难
g, ACE_ROOT与BOOST_ROOT 已经配置了,但还是提示找不到
解决办法:直接在./configure中hardcode了ACE_ROOT与BOOST_ROOT
3, 参考资料
http://www.freesoftwaremagazine.com/community_posts/my_opendiameter_experience_part_i_build_and_installation
http://www.opendiameter.org
http://www.boost.org/
http://www.openssl.org/source/
http://www.cs.wustl.edu/%7Eschmidt/ACE.html
http://sourceforge.net/projects/diameter/files/
http://www.shakthimaan.com/installs/opendiameter.html
4, 在编译安装调试过程中常用的命令
find . -name [filetype] | xargs grep [keyword] 查找文件中内容
nm libxxx.a/libxxx.so | grep [keyword] 查看库文件中的函数
apt-get install [package]
5, 关于OpenDiameter的运行
目前OpenDiameter比较好的提供了测试用例。在实际运行过程中可能会产生如下错误:
>>>> SAX Parsing exception: Failed to open XML file
尽管实际上服务端的xml路径及文件都没有问题,此时需要修改代码来解决该BUG,具体修改od_utl_xml_sax_parser.h和od_utl_xml_sax_parser.cxx中的characters函数接口,将其int修改成size_t的数据类型,重新编译,此问题就可以解决。
a, 在/etc/hosts中增加如下两行:
127.0.0.1 localaaa localaaa.localdomain1.net
127.0.0.1 localnas localnas.localdomain2.net
b, 拷贝修改过的配置目录到aaa_test_client1和aaa_test_server1所在的目录下。
c, 运行它们
./aaa_test_server1
./aaa_test_client1 config/nas1.local.xml 3
6,下面是实际在编译过程中出现的错误及解决办法
In file included from ../../../ace/SSL/SSL_Asynch_BIO.cpp:3:
../../../ace/SSL/SSL_Asynch_BIO.h:29:25: error: openssl/bio.h: No such file or directory
make[3]: *** [libACE_SSL_la-SSL_Asynch_BIO.lo] Error 1
make[3]: Leaving directory `/home/tomtan/share-dir/ACE_wrappers/build/ace/SSL'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/tomtan/share-dir/ACE_wrappers/build/ace'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/tomtan/share-dir/ACE_wrappers/build/ace'
make: *** [all-recursive] Error 1
====== 解决办法:将SSL_Asynch_BIO.h文件中的 #include <openssl/bio.h> 修改为 #include <ssl/include/bio.h>
g++ -W -Wall -Wpointer-arith -g -O2 -pipe -O3 -o .libs/client client-SSL-client.o -pthread
../../../ace/SSL/.libs/libACE_SSL.so /home/tomtan/share-dir/ACE_wrappers/build/ace/.libs/libACE.so
../../../ace/.libs/libACE.so -lrt -ldl -Wl,--rpath -Wl,/usr/local/lib
client-SSL-client.o: In function `ACE_SSL_SOCK_Stream::close()':
/home/tomtan/share-
dir/ACE_wrappers/build/examples/IPC_SAP/SSL_SAP/../../../../ace/SSL/SSL_SOCK_Stream.inl:285: undefined
reference to `SSL_shutdown'
/home/tomtan/share-
dir/ACE_wrappers/build/examples/IPC_SAP/SSL_SAP/../../../../ace/SSL/SSL_SOCK_Stream.inl:287: undefined
reference to `SSL_get_error'
client-SSL-client.o: In function `ACE_SSL_SOCK_Stream::recv_i(void*, unsigned int, int, ACE_Time_Value
const*) const':
====== 解决方法是,在openssl的编译环境下找到libssl.a、libcrypto.a,让编译程序连接进去。 具体操作是
编辑 /ace- 5.5/ACE_wrappers/build/examples/IPC_SAP/SSL_SAP/Makefile和
/ace- 5.5/ACE_wrappers/build/tests/SSL/Makefile这两个文件,在里面找到"LIBS = -lrt -ldl" 这一项,将其修改为:
LIBS = -lrt -ldl /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a
然后继续编译。问题即可解决。
configure: error: ACE_ROOT not defined, you MUST install ACE or set ACE_ROOT if already installed
tomtan@mycolinux:~/share-dir/opendiameter-1.0.7-i/build$ echo $ACE_ROOT /usr/local
====== 解决办法:在./configure中 hardcode $ACE_ROOT 和 $BOOST_ROOT
In file included from ../../libodutl/include/od_utl_xml_sax_parser.h:42,
from ../../libodutl/src/od_utl_xml_sax_parser.cxx:36:
/usr/local/include/ACEXML/parser/parser/Parser.h:28:25: error: ace/Obstack.h: No such file or directory
====== 解决办法:将源文件目录中的Obstack.h拷贝到系统目录中
g++ -g -O2 -o parser_test1 test/aaa_test1.o -L/usr/local/ace /opt/openssl-0.9.6g/lib/libssl.a /opt/openssl-
0.9.6g/lib/libcrypto.a -lACE_SSL -lACE -lACEXML -lACEXML_Parser ../libdiamparser/.libs/libdiamparser.a
/usr/local/lib/libACE_SSL.so: undefined reference to `SSL_CTX_free'
/usr/local/lib/libACE_SSL.so: undefined reference to `SSLv23_client_method'
/usr/local/lib/libACE_SSL.so: undefined reference to `BIO_ctrl'
====== 解决办法:参照前面
../../libdiameter/include/aaa_transport_ace.h:276: error: field 'm_SigRegistrar' has incomplete type
===== 解决办法:Modify opendiameter-1.0.7-i/libdiameter/include/aaa_transport_ace.h. Add the following:
#include "ace/Sig_Handler.h"
g++ -g -O2 -o aaa_test_client1 test/test_client1.o -L/usr/local/ace ../libdiameter/.libs/libdiameter.a
../libdiamparser/.libs/libdiamparser.a ../libodutl/.libs/libodutl.a -lssl -lcrypto -lACE_SSL -lACE -lACEXML
-lACEXML_Parser
/usr/bin/ld: cannot find -lssl
collect2: ld returned 1 exit status
make[1]: *** [aaa_test_client1] Error 1
make[1]: Leaving directory `/home/tomtan/share-dir/opendiameter-1.0.7-i/build/libdiameter'
make: *** [all-recursive] Error 1
===== 解决办法:增加-L部分如下: -L/usr/local/ace -L/usr/local/ssl/lib
../../libeap/include/eap_archie_crypto.hxx:112: error: 'AES_encrypt' was not declared in this scope
===== 解决办法:更新openssl库
/bin/sh ../libtool --tag=CXX --mode=link g++ -g -O2 -L/usr/local/ace -o archie_test tests/archie_test.o -
lACE_SSL -lACE -lACEXML -lACEXML_Parser ../libeap/libeap.la ../libeap/libeaparchie.la -lrt -ldl /opt/openssl
-0.9.6g/lib/libssl.a /opt/openssl-0.9.6g/lib/libcrypto.a
g++ -g -O2 -o archie_test tests/archie_test.o -L/usr/local/ace -lACE_SSL -lACE -lACEXML -lACEXML_Parser
../libeap/.libs/libeap.a ../libeap/.libs/libeaparchie.a -lrt -ldl /opt/openssl-0.9.6g/lib/libssl.a
/opt/openssl-0.9.6g/lib/libcrypto.a
../libeap/.libs/libeaparchie.a(eap_archie_fsm.o): In function `EapCryptoAES_CBC_MAC::operator()
(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, EapCryptoAES_CBC_MAC::MAC_LengthType)':
eap_archie_fsm.cxx:(.text._ZN20EapCryptoAES_CBC_MACclERSsS0_S0_NS_14MAC_LengthTypeE
[EapCryptoAES_CBC_MAC::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&,
std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&, EapCryptoAES_CBC_MAC::MAC_LengthType)]+0x42): undefined
reference to `AES_set_encrypt_key'
eap_archie_fsm.cxx:(.text._ZN20EapCryptoAES_CBC_MACclERSsS0_S0_NS_14MAC_LengthTypeE
[EapCryptoAES_CBC_MAC::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&,
std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&, EapCryptoAES_CBC_MAC::MAC_LengthType)]+0xec): undefined
reference to `AES_encrypt'
collect2: ld returned 1 exit st
===== 解决办法:同上面,更新openssl
../../libpana/include/pana_serial_num.h:208: error: no matching function for call to
'ACE_System_Time::get_local_system_time(ACE_UINT32&)'
===== 解决办法:在pana_serial_num.h文件的修改如下行
time_t tempT = 0;
ACE_System_Time::get_local_system_time(tempT);
seed = (ACE_UINT32)tempT;