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 ...
随机推荐
- arm-elf-gcc交叉编译器的使用教程
arm-elf-gcc交叉编译器的使用教程 一开始需要安装arm-elf-gcc,但是这是一个32位的程序,我是安装了64位的系统,据说安装ia32.libs依赖库能运行这个,但是看到博客上面前人安装 ...
- 第三次作业,github的基本操作
chengjiangtao@pc MINGW32 ~$ git config --global user.name "chengjiangtao" chengjiangtao@pc ...
- nodejs笔记一--模块,全局process对象;
一.os模块可提供操作系统的一些基本信息,它的一些常用方法如下: var os = require("os"); var result = os.platform(); //查看操 ...
- VC6.0装了visual assist x回车键不能补全代码的解决方法
问题:VC6.0装了visual assist x补全代码具体怎么用? 输入字母后会像输入法那样出现一个菜单 但是怎么选择菜单里面的内容呢? 什么 回车 ...
- Codeforces Round #353 (Div. 2) E. Trains and Statistic 线段树+dp
题目链接: http://www.codeforces.com/contest/675/problem/E 题意: 对于第i个站,它与i+1到a[i]的站有路相连,先在求所有站点i到站点j的最短距离之 ...
- hibernate---ID生成策略
5.1.4.1. Generator 可选的<generator>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识.如果这个生成器实例需要某些配置值或者初始化参数, 用 ...
- hdu 3007 Buried memory 最远点对
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3007 Each person had do something foolish along with ...
- winform 如何控制输入法
在工作中遇到这样一个问题,在系统使用过程中,输入法会变灰导致无法使用输入法输入文字,就好像输入法被禁用了没有启用似的.对此,在这里做个备录 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享 ...
- Discuz! X3.1去除内置门户导航/portal.php尾巴的方法
方法: 打开文件 /source/admincp/admincp_domain.php 查找 [php] if(!empty($domain) && in_array($domain, ...
- sql server 2008 执行计划
SSMS允许我们查看一个图形化的执行计划(快捷键Ctrl+L)