如何正確使用Nodejs 的 c++ module 鏈接到 OpenSSL
事情的起因是這樣的, 因?yàn)槟承┰颍?最近在寫(xiě) Nodejs 的 c++ module, 然后在js這邊調(diào)用。 網(wǎng)絡(luò)通信自然離不開(kāi)ssl, 于是需要鏈接到Openssl的庫(kù)。
我們本來(lái)的期望是,需要用戶安裝有Openssl的運(yùn)行庫(kù), 然后我們的c++ module 動(dòng)態(tài)鏈接到Openssl的so庫(kù)上來(lái)運(yùn)行。
起初一切看起來(lái)還不錯(cuò),直到我們發(fā)現(xiàn)這個(gè)openssl的函數(shù)不能工作:
PKCS7_sign()
PKCS7_sign ( )
我們發(fā)現(xiàn):
如果我們的 c++ 模塊與Openssl庫(kù)動(dòng)態(tài)鏈接的話, 編譯都沒(méi)問(wèn)題. 但是運(yùn)行會(huì)出現(xiàn): PKCS7_sign 符號(hào)無(wú)法找到的錯(cuò)誤.
如果我們的 c++ 模塊與Openssl庫(kù)靜態(tài)鏈接的話, 編譯也沒(méi)問(wèn)題, 但是運(yùn)行時(shí),調(diào)用這個(gè)函數(shù)的地方?jīng)]有效果, 這個(gè)函數(shù)返回值是 0. 按照文檔表示出現(xiàn)錯(cuò)誤, 但是用 Openssl的函數(shù) ERR_get_error 獲取錯(cuò)誤碼也是0. 表示沒(méi)有錯(cuò)誤碼.
在linux上是這樣, 那在Mac上呢? 用Mac試了一下, 發(fā)現(xiàn)Mac沒(méi)有問(wèn)題. 于是,想到這可能是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
通過(guò)搜索, 我們發(fā)現(xiàn), 原來(lái)Nodejs自己也使用了Openssl 庫(kù), 推測(cè)nodejs自己的crypto模塊也是使用Openssl lib實(shí)現(xiàn)的. 這點(diǎn)從Nodejs的源碼中就能發(fā)現(xiàn), 它包含了最新的Openssl的全部源碼.
其中寫(xiě)上面第一篇文章: https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL 的那個(gè)帥哥是Nodejs的開(kāi)發(fā)人員.
基本結(jié)論:
Nodejs 自己使用了Openssl
在Nodejs 0.6之前, Nodejs是動(dòng)態(tài)鏈接到 Openssl 庫(kù)的. 而之后的版本都是靜態(tài)鏈接的.
這時(shí)發(fā)現(xiàn) Node 那邊已經(jīng)回復(fù)我的bug了: https://github.com/joyent/node/issues/8026
Node 解釋的原因:
Node 自己編譯之后, 把自己沒(méi)用到的符號(hào)清除, 所以我們?cè)谶\(yùn)行時(shí)就找不到符號(hào)了. 于是他們把這bug 修掉了. 保留了全部符號(hào). 這導(dǎo)致 Node 的體積大了 400k.
感謝Node的快速回復(fù), 不得不佩服Node的活躍程度. 贊.
相關(guān)文章
node中Express 動(dòng)態(tài)設(shè)置端口的方法
本篇文章主要介紹了node中Express 動(dòng)態(tài)設(shè)置端口的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08用NODE.JS中的流編寫(xiě)工具是要注意的事項(xiàng)
Nodejs讀寫(xiě)流流的傳輸過(guò)程默認(rèn)是以buffer的形式傳輸?shù)?除非你給他設(shè)置其他編碼形式, 小伙伴可以參考下。2016-03-03node.js突破nginx防盜鏈機(jī)制,下載圖片案例分析
這篇文章主要介紹了node.js突破nginx防盜鏈機(jī)制,下載圖片的方法,結(jié)合具體案例形式分析了防盜鏈的相關(guān)原理與node.js使用axios庫(kù)下載防盜鏈圖片的相關(guān)操作技巧,需要的朋友可以參考下2023-04-04node.js中的fs.readFileSync方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.readFileSync方法使用說(shuō)明,本文介紹了fs.readFileSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12npm一鍵安裝Python以及node-sass依賴環(huán)境的方法
Node-sass是一個(gè)庫(kù),它將Node.js綁定到LibSass,下面這篇文章主要給大家介紹了關(guān)于npm一鍵安裝Python以及node-sass依賴環(huán)境的相關(guān)資料,文中還介紹了安裝node-sass報(bào)錯(cuò)Python環(huán)境問(wèn)題避坑指南,需要的朋友可以參考下2022-09-09