如何正确使用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
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的活跃程度. 赞.
相关推荐
-
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
-
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/opensslv.h找不到问题的解决方法
前言 众所周知scrapy是Python中鼎鼎大名的爬虫框架,在安装scrapy过程中碰到了openssl某个文件找不到的问题,并进行了分析,记录之. 一. scrapy以及安装过程 Scrapy是python中鼎鼎大名的爬虫框架,笔者在Centos 7系统之上进行安装,发现了如下问题: >> pip install scrapy 由于安装过程中的过程信息比较多,这里只列出了其中的关键片段信息: running egg_info writing requirements to src/cryp
-
浅析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、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
-
如何正确使用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 网络比如"全网广播"这个过程等内容将在后续文章中补上.
随机推荐
- php格式化时间戳显示友好的时间实现思路及代码
- asp.net uploadify实现多附件上传功能
- ASP.NET页面缓存常见的4种方式
- bootstrap 模态框(modal)实现水平垂直居中显示
- Android 开启闪光灯做手电筒的详解
- 发布一个迷你php+AJAX聊天程序[聊天室]提供下载
- 使用CodeIgniter的类库做图片上传
- Android编程实现自定义手势的方法详解
- Ruby的安装与运行
- Ruby升级后no such file to load -- readline解决办法
- javascript实现日期格式转换
- JS中的异常处理方法分享
- div+css页面布局的五个小技巧
- 详解Vuex管理登录状态
- 详解angularjs实现echart图表效果最简洁教程
- Oracle复合索引与空值的索引使用问题小结
- 浅谈python numpy中nonzero()的用法
- 怎样正确创建MySQL索引的方法详解
- 在Ubuntu 18.04上添加交换空间的方法
- Android Studio3安装图文教程