如何正确使用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 相关文章推荐
用nodejs写的一个简单项目打包工具
May 11 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 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
PHP Curl多线程原理实例详解
2013/11/06 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python异常处理知识点总结
2019/02/18 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
迪拜航空官方网站:flydubai
2017/04/20 全球购物
美国眼镜网:GlassesUSA
2017/09/07 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
某同学的自我鉴定范文
2013/12/26 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
python turtle绘图命令及案例
2021/11/23 Python