zl程序教程

您现在的位置是:首页 >  后端

当前栏目

如何正确使用Nodejs的c++module链接到OpenSSL

C++Nodejs链接 使用 如何 正确 module OpenSSL
2023-06-13 09:15:40 时间

事情的起因是这样的,因为某些原因,最近在写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上搜索了nodejslinkingtoopenssl类似的关键字.

找到这样几篇文章:

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模块也是使用Openssllib实现的.这点从Nodejs的源码中就能发现,它包含了最新的Openssl的全部源码.

其中写上面第一篇文章:https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL的那个帅哥是Nodejs的开发人员.

基本结论:

Nodejs自己使用了Openssl
在Nodejs0.6之前,Nodejs是动态链接到Openssl库的.而之后的版本都是静态链接的.
这时发现Node那边已经回复我的bug了:https://github.com/joyent/node/issues/8026

Node解释的原因:

Node自己编译之后,把自己没用到的符号清除,所以我们在运行时就找不到符号了.于是他们把这bug修掉了.保留了全部符号.这导致Node的体积大了400k.

感谢Node的快速回复,不得不佩服Node的活跃程度.赞.