如何正确使用Nodejs 的 c++ module 链接到 OpenSSL_node.js

事情的起因是这样的, 因为某些原因, 最近在写 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的活跃程度. 赞.

时间: 2024-09-28 00:02:23

如何正确使用Nodejs 的 c++ module 链接到 OpenSSL_node.js的相关文章

JS编程建议——78:正确理解执行上下文和作用域链

建议78:正确理解执行上下文和作用域链执行上下文(execution context)是ECMAScript规范中用来描述 JavaScript 代码执行的抽象概念.所有的 JavaScript 代码都是在某个执行上下文中运行的.在当前执行上下文中调用 function会进入一个新的执行上下文.该function调用结束后会返回到原来的执行上下文中.如果function在调用过程中抛出异常,并且没有将其捕获,有可能从多个执行上下文中退出.在function调用过程中,也可能调用其他的functi

SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑

    本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? 每个公司都会有一两个几乎快被人遗忘的系统,接手维护这些系统的人可能都不知换了多少批了.它们的命运注定慢慢消亡.然而偏偏却又生命力顽强,总还有一些 人在使用着这些系统.所以就处在一种尴尬的境地: 升级吧,价值不大,可能再过一两年,这系统就要被其它系统替代了.而且项目经理也没有精力.人手耗费在

网站链接到“人体艺术”网站,站长被指控涉黄

"我链接的是人体艺术,是艺术!不但因为是自己爱好,也是仅供自己浏览的,我怎么就'涉黄'了呢!"坐在法庭上的小王怎么也想不明白.因为在该网站上链接了一个名叫"天羽人体摄影"的网址,小王被刑事拘留,并站在了官渡法院的被告席上,其被指控的罪名是"传播淫秽物品罪",而"昆明信息港"上这部分曾经点击率颇高的内容,不用说,也被关停了 网站链接到"人体艺术"网站,站长被指控涉黄 案由 自建网站 链接"人体摄影网

gcc-.h文件里定义了一个类,怎么链接到so文件里?

问题描述 .h文件里定义了一个类,怎么链接到so文件里? A.h里定义了class B C.cpp里include A.h并且引用了B类,声明B类B b: G++ C.cpp -o X.so 为什么用JNI调用X.so运行时,错误提示找不到B类? 解决方案 先用nm等查看一下是否有导出类B来,通过JNI,一般最好是调用导出的函数,直接调用导出类,跨语言不容易处理 解决方案二: gcc hello.c-I../include -fPIC -shared -o libhello.so 很明显,"G+

android分享文字,图片,链接到twitter,如下图所示的形式

问题描述 android分享文字,图片,链接到twitter,如下图所示的形式 类似于facebook的story 解决方案 twitter有share API.你填好内容就可以发送http请求.不过它需要你登录了账号.授权 解决方案二: 参考:http://download.csdn.net/download/jacky19830110/7285009

分享功能-怎实现点击按钮链接到qq登陆页面

问题描述 怎实现点击按钮链接到qq登陆页面 我想实现点击按钮,实现类似分享到朋友圈这样的功能,应该怎么做? 解决方案 http://blog.csdn.net/cwcwj3069/article/details/41698417 解决方案二: 这个是一个插件的功能.叫做share. 解决方案三: 这个是需要三方的,Mob上有三方分享,http://www.mob.com/#/ 它有写好的API 还有可以下载的SDK 你按照mob上的API 一步步做就行,我昨天刚做完.

eclipse html链接到servlet时url不一致

问题描述 eclipse html链接到servlet时url不一致 用的IDE是ECLIPSE for java ee threeparams.html文件中的form表单提交时url为 http://localhost:8080/Test/servlet/ThreeParams?param1=1?m2=2?m3=3 eclipse for java ee里面写的servlet运行时的默认url为 http://localhost:8080/Test/ThreeParams 两个不一致,所以h

使用DNode实现php和nodejs之间通信的简单实例_node.js

一.安装DNode 1, for nodejs, 执行 复制代码 代码如下: $ sudo npm install dnode 2, for php, 利用composer来安装DNode php 执行下列语句下载composer 复制代码 代码如下: $ wget http://getcomposer.org/composer.phar 创建一个文件composer.json,然后填入如下语句, 复制代码 代码如下: {     "require": {         "

链接不再同一个界面;比如链接在a.html,滑动门切换页面在b.html;点击a中的某一个链接到b中的一个标题

问题描述 1.链接不再同一个界面;比如链接在a.aspx,滑动门切换页面在b.aspx:点击a中的某一个链接到b中的一个标题怎么做呢,急!!多谢!2.如何在一个页面调用另一个页面的js3.使鼠标点击连接变换图片,再点击另一连接,该连接变换图片,之前点击的连接恢复图片