如何正确使用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学习笔记之NET模块
Jan 13 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
在nodejs中创建child process的方法
Jan 26 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
layui 表单标签的校验方法
2019/09/04 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
python标准算法实现数组全排列的方法
2015/03/17 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python守护进程用法实例分析
2015/06/04 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
医学院护理专业应届生求职信
2013/11/12 职场文书
财务与信息服务专业推荐信
2013/11/28 职场文书
2014年财政局工作总结
2014/12/09 职场文书
小学教师节活动总结
2015/03/20 职场文书
2015年老干部工作总结
2015/04/23 职场文书
运动会宣传稿50字
2015/07/23 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis