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 ...
随机推荐
- Qt隐藏标题栏
setWindowFlags (Qt::CustomizeWindowHint)setWindowFlags (Qt::FramelessWindowHint)两个函数都可以去掉标题栏,区别是第一个可 ...
- pb datawindow 判断是否是最后一列最后一行
li_column1 = GetColumn() ls_columnname = GetColumnName() Send(Handle(This),,,Long(,)) ll_row2 = GetR ...
- loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
使用loadrunner进行压力测试主要分两步,第一步是编写脚本(比较重点),第二步执行测试(配置都是在界面上点点就行了,当然我只的是比较简单的,能满足日常需要的),第三步分析结果(这一步比较高深,但 ...
- “我爱淘”冲刺阶段Scrum站立会议4
完成任务: 完成了搜索界面的Activity的编写. 计划任务: 实现数据库的链接,用户可以查到自己需要的书籍的信息. 遇到问题: 数据库的操作,实现查询功能:
- 【Populating Next Right Pointers in Each Node II】cpp
题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
- 【Binary Tree Post order Traversal】cpp
题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given bina ...
- 【Integer To Roman】cpp
题目: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from ...
- 【笔记】ASP.NET MVC Model元数据
问题1:什么叫Model元数据? Model元数据,是针对数据类型的一种描述信息.由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此M ...
- rtsp实时流通过rtmp推送到服务端
很多朋友都会问到rtsp如何通过rtmp协议推送到服务端,正好前段时间开发了这个功能写在这里,和大家分享下. 首先我想说的是:ffmpeg可以实现这个功能.ffmpeg支持rtsp协议,也支持rtmp ...
- mysql的简单主从复制(ubuntu)
环境:两台ubuntu 12.04.5 虚拟机 mysql-server-5.5 master (192.168.240.130) slave (192.168.240.129) (1)查看二进 ...