如何正确使用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上搜索了 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的活跃程度. 赞.

(0)

相关推荐

  • linux系统中使用openssl实现mysql主从复制

            证书准备: CA证书: 第一步:创建CA私钥 [root@localhost CA]# (umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 第二步:生成自签证书 [root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -days 7300 -out /etc/pki/CA/cacert.pem -

  • linux下安装openssl、swoole等扩展的详细步骤

    OpenSSL是一个开源的ssl技术,由于我需要使用php相关功能,需要获取https的文件所以必须安装这个东西了.下面给大家介绍下linux下安装openssl.swoole等扩展的详细步骤,一起看看吧! 编译安装 先来看编译安装的php,如果需要安装新的扩展,这里以安装openssl扩展为例进行说明 1.找到php源码目录,我们这里的源码位于 /opt/download/php-5.5.30 ,如果找不到了,查看当前php版本,通过 wget http://cn2.php.net/distr

  • 浅析PKI加密解密 OpenSSL

    点击下载OpenSSL window与linux要区分的 解压文件 双击: Win32OpenSSL-0_9_8l_95895.exe 安装完毕后 \OpenSSL\bin\openssl.exe 输入命令,生成私钥 genrsa -out private-rsa.pem 输入命令,生成公钥 rsa -in private-rsa.pem -pubout -out public-rsa.cer

  • Linux中openssl/opensslv.h找不到问题的解决方法

    前言 众所周知scrapy是Python中鼎鼎大名的爬虫框架,在安装scrapy过程中碰到了openssl某个文件找不到的问题,并进行了分析,记录之. 一. scrapy以及安装过程 Scrapy是python中鼎鼎大名的爬虫框架,笔者在Centos 7系统之上进行安装,发现了如下问题: >> pip install scrapy 由于安装过程中的过程信息比较多,这里只列出了其中的关键片段信息: running egg_info writing requirements to src/cryp

  • Windows安装配置C/C++(VS2017)OpenSSL开发环境配置教程

    OpenSSL开发环境配置教程分享给大家,具体内容如下 [环境信息] Windows 10 Enterprise Version 10.0.15063 下载地址:http://www.itellyou.cn/) Visual Studio Enterprise 2017 Version 15.2(26430.12) 下载地址:https://www.visualstudio.com/downloads) OpenSSL v1.1.0f 下载地址:https://slproweb.com/prod

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

    事情的起因是这样的, 因为某些原因, 最近在写 Nodejs 的 c++ module, 然后在js这边调用.  网络通信自然离不开ssl, 于是需要链接到Openssl的库. 我们本来的期望是,需要用户安装有Openssl的运行库, 然后我们的c++ module 动态链接到Openssl的so库上来运行. 起初一切看起来还不错,直到我们发现这个openssl的函数不能工作: PKCS7_sign() PKCS7_sign ( ) 我们发现: 如果我们的 c++ 模块与Openssl库动态链接

  • MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理

    开发与企业应用中,好几个版本SQL Server相互链接.分布式读取与存储,需要实现sp_addlinkedserver.SQL Server 2000, SQL Server 2008, SQL Server 2012和SQL Server 2014: 但今天在本机的MS SQL Server 2014中,想添加SQL Server 2000的链接,使用下面的方法: <SQL Server创建链接服务器的存储过程示例分享>http://www.jb51.net/article/52314.h

  • 深入理解Node module模块

    在开发复杂Web应用的时候,通常需要把各个功能进行拆分.封装到不同的文件并在需要的时候引用该文件,即进行代码的模块化管理.几乎所有的编程语言都有自己的模块组织方式,比如Java中的包.C#中的程序集,而Node采用CommonJS模块规范. 模块规范 CommonJS旨在将运行在浏览器之外的JS进行标准化,并已经解决了大量的JS问题(如全局命名冲突).Node对CommonJS的实现中,每个模块都会被封装在一个单独的JS文件中,即一个文件就是一个模块,而文件路径就是模块名.在编写每个模块时,都有

  • 使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解

    fs概述 文件 I/O 是由简单封装的标准 POSIX 函数提供的. nodeJS中通过 require('fs') 使用fs模块. 所有的方法都有异步和同步的形式. 异步形式始终以完成回调作为它最后一个参数. 传给完成回调的参数取决于具体方法,但第一个参数总是留给异常. 如果操作成功完成,则第一个参数会是 null 或 undefined //异步示例 var fs = require('fs'); fs.unlink('/tmp/hello', function(err){ if (err)

  • nodejs入门教程五:连接数据库的方法分析

    本文实例讲述了nodejs入门教程之连接数据库的方法.分享给大家供大家参考,具体如下: 参考文章链接:  nodejs连接mysql 1.准备工作 在nodejs中没有mysql模块,但npm中提供了mysql,所以可以使用npm安装mysql 命令:npm install mysql, 会生成 node_modules 文件夹 ,如图 执行后发现报了一个警告,说没有package.json 这个文件,只需要执行 npm init -f 的命令就会生成一个这个文件 2.直接连接数据库 mysql

  • nodejs入门教程一:概念与用法简介

    本文实例讲述了nodejs概念与用法.分享给大家供大家参考,具体如下: 一. nodejs 的特点 1.nodejs 是一个javaScript 的运行平台,采用了Google Chrome浏览器的V8引擎. 2.拥有事件驱动:当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求.当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户. 示例:点餐 在基于线程的方式中(thread-based way):收银员接待你点餐开始,收银员不能接待下一个人

  • linux 下部署nodejs项目(两种方式)

    之前在linux下部署过几次NodeJS,也有些经验,最近也在Q群里有朋友问Node在linux下部署问题,于是总结一下,主要介绍两种不同的部署方式,二进制文件直接解压部署和手动编译安装,一来巩固自己的知识,二来希望能对新手有所帮助. 关于在node在linux的部署我认为主要有三种方式, 第一种就是自己下载源码,手动编译二进制,即是部署过程. 第二种方法 直接下载二进制文件解压即可. 第三种方式,使用yum install node或者apt-get install node安装(在linux

  • nodejs后台集成ueditor富文本编辑器的实例

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.. 1 下载ueditor nodejs版本 2 复制public目录下面的文件 到项目静态资源public文件夹下 3 在项目根目录创建ueditor文件夹 要复制进来的内容为 4 在根目录的 ueditor文件夹下执行 npm install 安装此目录下面package.json依赖的模块 5 项目根目录下创建 ue.js 代码部分来自于

  • 在Centos部署nodejs的步骤

    今天突然发现自己买了一年快过期了的搬瓦工,除了少数时间拿来当梯子用用其它也没用上,所以流量还剩这么多... 所以就想试试把本地写的nodejs的demo部署上去看看. 顺便把原来买的域名解析上去QAQ 安装node和npm 在官网下载编译好的node包: wget https://nodejs.org/dist/v6.10.2/node-v6.10.2-linux-x86.tar.xz xz -d node-v6.10.2-linux-x86.tar.xz tar -xf node-v6.10.

  • Go语言开发区块链只需180行代码(推荐)

    区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块.通过浏览器来查看整个链.了解所有其他关于区块链的基础知识. 但是,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法,同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如"全网广播"这个过程等内容将在后续文章中补上.

随机推荐