如何正确使用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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
nodejs教程之异步I/O
Nov 21 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
详解NodeJS模块化
Jun 15 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连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
利用python计算时间差(返回天数)
2019/09/07 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
python文件和文件夹复制函数
2020/02/07 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
幼师自荐信范文
2013/10/06 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年团支书工作总结
2015/04/03 职场文书
红色影片观后感
2015/06/18 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs