如何正确使用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异步回调的优雅处理方法
Sep 25 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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 错误之引号中使用变量
2009/05/04 PHP
PHP similar_text 字符串的相似性比较函数
2010/05/26 PHP
PHP学习 变量使用总结
2011/03/24 PHP
基于initPHP的框架介绍
2013/04/18 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
vue组件生命周期详解
2017/11/07 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
python算的上脚本语言吗
2020/06/22 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
.NET常见笔试题集
2012/12/01 面试题
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python