如何正確使用Nodejs 的 c++ module 鏈接到 OpenSSL
事情的起因是這樣的, 因?yàn)槟承┰颍?最近在寫 Nodejs 的 c++ module, 然后在js這邊調(diào)用。 網(wǎng)絡(luò)通信自然離不開ssl, 于是需要鏈接到Openssl的庫。
我們本來的期望是,需要用戶安裝有Openssl的運(yùn)行庫, 然后我們的c++ module 動態(tài)鏈接到Openssl的so庫上來運(yùn)行。
起初一切看起來還不錯,直到我們發(fā)現(xiàn)這個(gè)openssl的函數(shù)不能工作:
PKCS7_sign()
PKCS7_sign ( )
我們發(fā)現(xiàn):
如果我們的 c++ 模塊與Openssl庫動態(tài)鏈接的話, 編譯都沒問題. 但是運(yùn)行會出現(xiàn): PKCS7_sign 符號無法找到的錯誤.
如果我們的 c++ 模塊與Openssl庫靜態(tài)鏈接的話, 編譯也沒問題, 但是運(yùn)行時(shí),調(diào)用這個(gè)函數(shù)的地方?jīng)]有效果, 這個(gè)函數(shù)返回值是 0. 按照文檔表示出現(xiàn)錯誤, 但是用 Openssl的函數(shù) ERR_get_error 獲取錯誤碼也是0. 表示沒有錯誤碼.
在linux上是這樣, 那在Mac上呢? 用Mac試了一下, 發(fā)現(xiàn)Mac沒有問題. 于是,想到這可能是Nodejs的一個(gè)bug. 然后就去 Nodejs 給它報(bào)了一個(gè)bug: [https://github.com/joyent/node/issues/8026][1]
同時(shí), google上搜索了 nodejs linking to openssl 類似的關(guān)鍵字.
找到這樣幾篇文章:
https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL
https://github.com/joyent/node/issues/3915
https://github.com/robhawkes/node-extension/issues/1
通過搜索, 我們發(fā)現(xiàn), 原來Nodejs自己也使用了Openssl 庫, 推測nodejs自己的crypto模塊也是使用Openssl lib實(shí)現(xiàn)的. 這點(diǎn)從Nodejs的源碼中就能發(fā)現(xiàn), 它包含了最新的Openssl的全部源碼.
其中寫上面第一篇文章: https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL 的那個(gè)帥哥是Nodejs的開發(fā)人員.
基本結(jié)論:
Nodejs 自己使用了Openssl
在Nodejs 0.6之前, Nodejs是動態(tài)鏈接到 Openssl 庫的. 而之后的版本都是靜態(tài)鏈接的.
這時(shí)發(fā)現(xiàn) Node 那邊已經(jīng)回復(fù)我的bug了: https://github.com/joyent/node/issues/8026
Node 解釋的原因:
Node 自己編譯之后, 把自己沒用到的符號清除, 所以我們在運(yùn)行時(shí)就找不到符號了. 于是他們把這bug 修掉了. 保留了全部符號. 這導(dǎo)致 Node 的體積大了 400k.
感謝Node的快速回復(fù), 不得不佩服Node的活躍程度. 贊.
相關(guān)文章
nodejs構(gòu)建本地web測試服務(wù)器 如何解決訪問靜態(tài)資源問題
這篇文章主要為大家詳細(xì)介紹了nodejs構(gòu)建本地web測試服務(wù)器,教大家如何解決訪問靜態(tài)資源問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
使用 NodeJS+Express 開發(fā)服務(wù)端的簡單介紹
這篇文章主要介紹了使用 NodeJS+Express 開發(fā)服務(wù)端的簡單介紹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
基于nodejs的微信JS-SDK簡單應(yīng)用實(shí)現(xiàn)
這篇文章主要介紹了基于nodejs的微信JS-SDK簡單應(yīng)用實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
詳解NodeJs項(xiàng)目 CentOs linux服務(wù)器線上部署
這篇文章主要介紹了NodeJs項(xiàng)目 CentOs linux服務(wù)器線上部署,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
nodejs對express中next函數(shù)的一些理解
這篇文章主要介紹了nodejs對express中next函數(shù)的一些理解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式
這篇文章主要介紹了Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10

