如何正确使用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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
关于NodeJS中的循环引用详解
Jul 23 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中获取时间的下一周下个月的方法
2014/03/18 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
javascript 表单规则集合对象
2009/07/21 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
详解微信UnionID作用
2019/05/15 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
JS document内容及样式操作完整示例
2020/01/14 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python做智能家居温湿度报警系统
2018/09/25 Python
Python for循环与getitem的关系详解
2020/01/02 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
销售业务员岗位职责
2014/01/29 职场文书
暑期培训随笔感言
2014/03/10 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android