如何正确使用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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
Node.js编码规范
2014/07/14 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
python中property和setter装饰器用法
2019/12/19 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
顶岗实习计划书
2014/01/10 职场文书
庆八一活动方案
2014/01/25 职场文书
运动会跳远加油稿
2014/02/20 职场文书
餐饮营销方案
2014/02/23 职场文书
《长征》教学反思
2014/04/27 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年化验室工作总结
2014/11/21 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
教师教育心得体会
2016/01/19 职场文书
Go语言基础map用法及示例详解
2021/11/17 Golang
如何利用python实现Simhash算法
2022/06/28 Python
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技