如何正确使用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实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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 全局变量范围分析
2009/08/07 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
php中opendir函数用法实例
2014/11/15 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
iOS10推送通知开发教程
2016/09/19 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
Node.js学习入门
2017/01/03 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python splitlines使用技巧
2008/09/06 Python
python cookielib 登录人人网的实现代码
2012/12/19 Python
在Python中进行自动化单元测试的教程
2015/04/15 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Python制作动态字符图的实例
2019/01/27 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
公司运动会策划方案
2014/05/25 职场文书
公司离职证明标准样本
2014/10/05 职场文书
信用卡工资证明范本
2014/10/17 职场文书
夫妻吵架保证书
2015/05/08 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python