如何正确使用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极简入门教程(二):定时器
Oct 25 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 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
打造计数器DIY三步曲(上)
2006/10/09 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
初识ThinkPHP控制器
2016/04/07 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
python批量下载抖音视频
2019/06/17 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python面向对象实现方法总结
2020/08/12 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
文言文形式的学生求职信
2013/12/03 职场文书
安全教育实施方案
2014/03/02 职场文书
学习礼仪心得体会
2014/09/01 职场文书
新员工入职欢迎词
2015/01/23 职场文书
python如何进行基准测试
2021/04/26 Python
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis