如何正确使用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 28 NodeJs
nodejs之请求路由概述
Jul 05 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
nodejs基础应用
Feb 03 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
php中动态变量用法实例
2015/06/10 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
使用Python进行目录的对比方法
2018/11/01 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Python必须了解的35个关键词
2020/07/16 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
信息学院毕业生自荐信范文
2014/03/04 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
室内趣味活动方案
2014/08/24 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
旅游项目合作意向书
2015/05/08 职场文书
七夕情人节问候语
2015/11/11 职场文书
如何写好活动总结
2019/06/21 职场文书
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python