如何正确使用Nodejs 的 c++ module 链接到 OpenSSL


Posted in NodeJs onAugust 03, 2014

事情的起因是这样的, 因为某些原因, 最近在写 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的活跃程度. 赞.

NodeJs 相关文章推荐
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
NodeJS学习笔记之网络编程
Aug 03 #NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 #NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 #NodeJs
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 #NodeJs
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 #NodeJs
nodejs的10个性能优化技巧
Jul 15 #NodeJs
提高NodeJS中SSL服务的性能
Jul 15 #NodeJs
You might like
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
js中eval详解
2012/03/30 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
Python中统计函数运行耗时的方法
2015/05/05 Python
python追加元素到列表的方法
2015/07/28 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
python 公共方法汇总解析
2019/09/16 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
四好少年事迹材料
2014/01/12 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
思想品德评语大全
2014/12/31 职场文书
遗愿清单观后感
2015/06/09 职场文书
Python List remove()实例用法详解
2021/08/02 Python
Win2008系统搭建DHCP服务器
2022/06/25 Servers