ActiveMQ-Cpp on Mac

筆記:build ActiveMQ-Cpp with ssl 跟 implementation的注意事項
版本:ActiveMQ-Cpp v3.4.4 (ipv6 not supported


根據文件會需要 CppUnit, APR, APR Util
CppUtil是跑UT所需的,懶得跑就不下載

APR跟APR Util可以在這download:http://apr.apache.org/download.cgi
(要下載Unix Source,裡面才有要build所需的檔案)
我們的案子需要ssl protocol, 所以需要再多下載Openssl:http://www.openssl.org/source
(文件上建議要openssl 1.0以上)

下載完後開始一個個build
基本上都需要先執行configure,產生相關的設定跟makefile才開始build
ref: activemq-cpp-library-x.x.x\README.txt

*openssl: 
./Configure dist
make
make install
檔案:libssl.a、libcrypto.a(i386架構)
make install後會把binary跟library放到/usr/local/ssl/bin跟/usr/local/ssl/lib下面,後面在build apr-util跟activemq-cpp會需要

*apr:
./configure --enable-shared=no
make
檔案:libapr-1.a
檔案會在執行目錄下的一個.libs的隱藏資料夾(檔案的架構跟電腦環境相關,我的開發環境為10.7,build出來的檔案就是x86_64(註1))
--enable-shared=no:我讓build出來的檔案是static lib而不是dynamic lib

*apr-util:
./configure  --with-openssl=/usr/local/ssl/ --with-apr=../apr-1.4.6
make
檔案:libaprutil-1.a
檔案會在執行目錄下的一個.libs的隱藏資料夾(檔案的架構跟電腦環境相關,我的開發環境為10.7,build出來的檔案就是x86_64(註1))
--with-openssl=/usr/local/ssl/ :指定ssl安裝路徑
--with-apr=../apr-1.4.6 :指定build好的apr的路徑

*activemq
./configure --with-openssl=/usr/local/ssl --with-apr=../apr-1.4.6  --with-apr-util=../apr-util-1.4.1 --enable-static=yes --enable-shared=no
make
檔案:libactivemq-cpp.a
檔案會在./src/main/.libs下,也是個隱藏目錄(搞不懂為什麼要這樣....),在此也是build出static lib(檔案的架構跟電腦環境相關,我的開發環境為10.7,build出來的檔案就是x86_64)
activemq的compile 跟 link flag都直接在makefile裡,所以要改成i386的就直接改在makefile裡,不需要去改activemqcpp-config檔。要改./makefile跟./src/main/makefile(註2)兩個,只需改CFLAGS, CPPFLAGS, CXXFLAGS  LDFLAGS

註1:若要改為i386或其他架構,在build下面有個xxx-rule.mk的檔案(apr: apr_rules.mk, apr-util: rules.mk),在裡面找EXTRA_CPPFLAGS, EXTRA_CXXFLAGS, EXTRA_CFLAGSEXTRA_LDFLAGS,加上'-arch i386',本人比較笨,不確定要加在那個上,所以就都加

註2:./src/main/makefile是activmq-cpp 3.5才需要改,3.5預設會build成universal binary,所以如果只改./makefile,build到最後會有cpu type不合的 error

IMPLEMENTATION

基本上follow這篇大概都沒問題(如果是tcp) http://activemq.apache.org/cms/cms-api-overview.html
ssl 基本上差不多,只多需要certificate,所以要在client上面設定certificate的資訊


Gen certificate:
1. gen key store
keytool.exe -genkey -alias broker -keyalg RSA -keystore <keystorepath\broker.ks> -keypass <password> -storepass <password> -dname \"cn=<hostname>, ou=<product name>, o=<company name>, c=US\"
2. gen certificate
keytool.exe -export -alias broker -keystore  <keystorepath\broker.ks> -keypass <password> -storepass <password>  -file <certificatepath\broker.cert>
ps. keytool.exe在jre的目錄下


client用的certificate的格式要是pem
openssl x509 -in broker.cert -inform der -outform pem -out broker.pem
細節可以看下面這篇文章
https://support.ssl.com/index.php?/Knowledgebase/Article/View/19
如果certicate不對,server上的log會顯示 unknown_ca(or unknown_certificate)

重點!!!
broker的URI要跟certificate裡的CN一樣
ex:
    URI:  ssl://my-server:6167
    CN name: cn=my-server
經實驗證實,填ip也是OK,不過論壇上都不建議
如果cn 跟URI不一樣,在建connection時會停住,直到timeout(如果你有設,預設timeout值是無限),timeout後會丟出exception, "OpenWireFormatNegotiator::onewayWire format negotiation timeout: peer did not send his wire format."

note:
設定trust store跟password
System::setProperty("decaf.net.ssl.trustStore", "./broker.pem" );
System::setProperty( "decaf.net.ssl.trustStorePassword", "password")

decaf.net.ssl.disablePeerVerification 設成 true,可以不需要驗證certificate,上面寫的也就都是廢話





留言

這個網誌中的熱門文章

What's New in Ethereum Serenity (2.0)

瑞士滑雪分享2 - 策馬特

動手實做零知識 - circom