MongoDB的SSL实现分析
1. OPENSSL接口封装
MongoDB封装了OPENSSL的SSL通信接口,代码在mongo/util/net目录。
主要包括以下几个方面:
1) SSL配置参数,在ssl_options(.cpp/.h)
定义了数据结构SSLGlobalParams,SSLGlobalParams中保存了与SSL相关的所有的配置参数。
在ssl_options中定义了一个SSLGlobalParams类型的全局变量sslGlobalParams,在客户端或者服务器进程启动时会通过相关接口从全局的配置参数中将SSL相关的配置参数保存到sslGlobalParams之中。
主要接口:
addSSLServerOptions()
addSSLClientOptions()
2) SSL证书过期检测,在ssl_expiration(.cpp/.h)
定义了类CertificateExpirationMonitor,该类继承了PeriodicTask,会定期将证书的过期时间与当前时间做比较。如果证书过期,会报警告。
3)SSL连接管理,在ssl_manager(.cpp/.h)
定义了类SSLConnection,该类封装了SSL通信时使用的SSL句柄,BIO以及Socket。
定义了接口类SSLManagerInterface,该类定义了建立SSL连接、验证SSL证书、SSL读写数据等接口。
定义了类SSLThreadInfo,该类用于处理SSL多线程环境下使用的问题。
定义了结构Params,该类保存了所有的SSL配置参数。
定义了类SSLManager,该类继承了接口类SSLManagerInterface,内部保存了SSL通信的Context,通过调用OPENSSL接口实现了SSLManagerInterface定义的接口。
定义了SSLManagerInterface指针类型的全局变量theSSLManager,提供接口getSSLManager(),实现了单例模式。
2. SSL通信与Socket通信的整合
除了封装SSL的代码之外,在MongoDB源代码中使用了SSL接口的地方都使用了宏定义MONGO_SSL。在编译时只有预定义了MONGO_SSL才会编译支持SSL的MongoDB。
MongoDB与通信相关的接口主要是Socket类和MessagingPort类定义的接口。
Socket类封装了socket通信相关的接口。SSL版本在Socket中增加了SSLMangerInterface指针和SSLConnection指针,增加了secure()和doSSLHandshake()接口用于创建SSL连接。
在Socket上创建了SSL连接之后,数据通信会调用SSLManagerInterface的SSL读写接口。这样Socket数据收发接口保持不变,但增加了SSL数据收发的功能。
MessagingPort类中保存了Socket类的变量,增加了一个secure()接口用于创建SSL连接,该接口直接调用Socket的secure()接口。另外修改了recv()接口,增加了接收到SSL握手请求的处理。
在客户端定义了类DBClientConnection用于建立连接,该类包含一个MessagingPort变量,通过调用MessagingPort接口实现通信。
类接口调用关系如下:
DBClientConnection::connect()
|
|---> DBClientConnection::_connect() // 建立socket连接
| |
| |---> MessagingPort::connect()
| |
| |---> Socket::connect()
|
|---> MessagingPort::secure() // 建立SSL连接
|
|---> Socket::secure()
| |
| |---> SSLManager::connect()
| |
| |---> SSL_connect()
|
|---> SSLManager::parseAndValidatePeerCertificate()
MessagingPort::recv()
|
|---> Socket::doSSLHandshake()
|
|---> SSLManager::accept() // 建立SSL连接
| |
| |---> SSL_accpet()
|
|---> SSLManager::parseAndValidatePeerCertificate()
Socket::send()
|
|---> SSLManager::SSL_write()
|
|---> SSL_write()
Socket::recv()
|
|---> Socket::_recv()
|
|---> SSLManager::SSL_read()
|
|---> SSL_read()
MongoDB的SSL实现分析的更多相关文章
- MongoDB使用SSL
1. MongoDB对SSL的支持情况 MongoDB社区版本不支持SSL,企业版提供对SSL的支持.MongoDB源代码中包含SSL的实现,可以自己编译带SSL的MongoDB. MongoDB支持 ...
- mongodb基本命令,mongodb集群原理分析
mongodb基本命令,mongodb集群原理分析 集合: 1.集合没有固定数据格式. 2. 数据: 时间类型: Date() 当前时间(js时间) new Date() 格林尼治时间(object) ...
- MongoDB 2.4企业版分析
作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs MongoDB v2.4版于3月19日发布,它引入了内置的文本搜索功能,以及基于哈希的分片和众所期盼的安全 ...
- j.APR连接器整体框图(含SSL实现分析)
APR连接器的思路和bio,nio的整体架构也是类似的,可以看到下面的整体框图: 第一个区别是,对于从Acceptor线程中的socket解析这块,无论是nio还是bio都是在Acceptor线程内直 ...
- MongoDB实战指南(五):MongoDB中的聚集分析
聚集操作是对数据进行分析的有效手段.MongoDB主要提供了三种对数据进行分析计算的方式:管道模式聚集分析,MapReduce聚集分析,简单函数和命令的聚集分析. 1. 管道模式进行聚集 这里所说的管 ...
- MongoDB慢查询性能分析
最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢.最后定位到MongoDB查询也很慢. 刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...
- MongoDB索引,性能分析
索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...
- Redis和Memcache和MongoDB简介及区别分析(整理)
Redis和Memcache 一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...
- MongoDB 的 GridFS 详细分析
GridFS简介 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件. http://www.mongodb.org/display/DOCS/GridFS http://www.m ...
随机推荐
- 查看图片真正的格式,在不知道扩展名的情况下区分是jpeg还是bmp
用系统自带的画图软件打开图片,然后按文件-->另存为就会弹出保存窗口.保存窗口的保存类形就是"照片真正的格式".
- Windows python 安装 nNumpy、Scipy、matplotlib模块
折腾了 很久,总结一些. 首先如果python 是64位,安装32位的numpy ,Scipy,或者matplotlib 模块. 会出现很多问题. 比如当你 在python 导入 Numpy 时,导入 ...
- xml之XSLT
1.XSLT是什么 XSLT是XSL的子集,XSL是样式表.XSLT的作用:将XML文档转化成HTML,做的是中间转换者. 而主要需要学习的是XSLT(XSLTransformation). 2 ...
- 20145129 《Java程序设计》第4周学习总结
20145129 <Java程序设计>第4周学习总结 教材学习内容总结 继承与多肽 继承共同行为 继承是避免多个类间重复定义共同行为.(将相同的代码提升为父类) 关键字extends:表示 ...
- ubuntu 下root用户无法访问声音设备的解决方案
原因:root用户没有对pulsaudio的访问权限,而且pulsaudio默认是不能在root下自动启动解决办法: 一.修改自动启动:编辑 gedit /etc/default/pulseaudio ...
- c语言学习strcopy
自己写了一个字符串复制函数: #include<stdio.h> #include<assert.h> char *mystrcpy(char *des,char *ser) ...
- windows下配置nodejs+npm
windows下安装nodejs是比较方便的 (v0.6.0之后,支持windows native),进入官网http://nodejs.org/ 点击install即可安装.下载完成后一路next ...
- 【BZOJ】【1055】【HAOI2008】玩具取名
区间DP/记忆化搜索 sigh……看了提示才想到是区间DP >_>我果然还是太弱 f[l][r][k]表示L到R这段区间能否合并成K,那么就是枚举拆分方案(从哪里断开)和组合方式(左半合成 ...
- DevExpress12.2.4 GridControl相关技巧
1.DevExpress12.2.4中,设置GridControl的GridView为可编辑方法如下: gvMainControl.OptionsBehavior.Editable = true; 2 ...
- 2014ACM-ICPC 西安赛区总结
万万没想到,打铁了.以前一直觉得拿铁咖啡的梗是很好笑的,然后有一天这杯咖啡自己喝下去了,就会发现心里真的被梗住了. 复旦的题其实我是有预料到的,前年的复旦题三题从金区到铜区都有,但是从去年的南京赛区开 ...