首頁 > web前端 > js教程 > 如何正確使用Nodejs 的 c module 連結到 OpenSSL_node.js

如何正確使用Nodejs 的 c module 連結到 OpenSSL_node.js

WBOY
發布: 2016-05-16 16:40:27
原創
1285 人瀏覽過

事情的起因是這樣的, 因為某些原因, 最近在寫 Nodejs 的 c module, 然後在js這邊呼叫。  網路通訊自然離不開ssl, 於是需要連結到Openssl的函式庫。

我們本來的期望是,需要使用者安裝有Openssl的運行庫, 然後我們的c module 動態連結到Openssl的so庫上來運行。

一開始一切看起來還不錯,直到我們發現這個openssl的函數不能運作:

PKCS7_sign()
PKCS7_sign ( )
我們發現:

如果我們的 c 模組與Openssl庫動態連結的話, 編譯都沒問題. 但是運行會出現: PKCS7_sign 符號無法找到的錯誤.
如果我們的c 模組與Openssl庫靜態連結的話, 編譯也沒問題, 但是運行時,調用這個函數的地方沒有效果, 這個函數返回值是0. 按照文檔表示出現錯誤, 但是用Openssl的函數ERR_get_error 獲取錯誤碼也是0. 表示沒有錯誤碼.
在linux上是這樣, 那在Mac上呢? 用Mac試了一下, 發現Mac沒有問題. 於是,想到這可能是Nodejs的一個bug. 然後就去Nodejs 給它報了一個bug: [https:// github.com/joyent/node/issues/8026][1]

同時, google上搜尋了 nodejs linking to openssl 類似的關鍵字.

找到這樣幾篇文章:

https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL

https://github.com/joyent/node/issues/3915

http://serverfault.com/questions/338092/how-can-i-build-node-js-using-static-libssl-and-crypto-libraries

https://github.com/robhawkes/node-extension/issues/1

透過搜尋, 我們發現, 原來Nodejs自己也使用了Openssl 函式庫, 推測nodejs自己的crypto模組也是使用Openssl lib實現的. 這點從Nodejs的源碼中就能發現, 它包含了最新的Openssl的全部源碼.

其中寫上面第一篇文章: https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL 的那個帥哥是Nodejs的開發人員.

基本結論:

Nodejs 自己使用了Openssl
在Nodejs 0.6之前, Nodejs是動態連結到 Openssl 函式庫的. 而之後的版本都是靜態連結的.
這時發現 Node 那邊已經回我的bug了: https://github.com/joyent/node/issues/8026

Node 解釋的原因:

Node 自己編譯之後, 把自己沒用到的符號清除, 所以我們在運行時就找不到符號了. 於是他們把這bug 修掉了. 保留了全部符號. 這導致Node 的體積大了400k.

感謝Node的快速回覆, 不得不佩服Node的活躍程度. 讚.

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板