如何正确使用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 相关文章推荐
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
nodeJs内存泄漏问题详解
Sep 05 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php遍历数组的方法分享
2012/03/22 PHP
php中explode与split的区别介绍
2012/10/03 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
跟老齐学Python之有点简约的元组
2014/09/24 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Python之pymysql的使用小结
2019/07/01 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
自荐书4要点
2014/01/25 职场文书
群众路线对照检查材料
2014/09/22 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
2014年评职称工作总结
2014/11/20 职场文书
庆祝教师节主持词
2015/07/06 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书