如何正确使用Nodejs的c++module链接到OpenSSL
事情的起因是这样的,因为某些原因,最近在写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的活跃程度.赞.