如何正确使用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读取memcache示例分享
Jan 02 NodeJs
我的NodeJs学习小结(一)
Jul 06 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
Nodejs让异步变成同步的方法
Mar 02 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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实现框架(一)
2006/10/09 PHP
php生成随机数的三种方法
2014/09/10 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
php服务器的系统详解
2019/10/12 PHP
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
理解AngularJs指令
2015/12/10 Javascript
基于node实现websocket协议
2016/04/25 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
Python生成不重复随机值的方法
2015/05/11 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
企事业单位求职者的自我评价
2013/12/28 职场文书
中职招生先进个人材料
2014/08/31 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
工作岗位职责范本
2015/02/15 职场文书