MongoDB的SSL实现分析

时间:2023-01-15 22:19:44

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实现分析的更多相关文章

  1. MongoDB使用SSL

    1. MongoDB对SSL的支持情况 MongoDB社区版本不支持SSL,企业版提供对SSL的支持.MongoDB源代码中包含SSL的实现,可以自己编译带SSL的MongoDB. MongoDB支持 ...

  2. mongodb基本命令,mongodb集群原理分析

    mongodb基本命令,mongodb集群原理分析 集合: 1.集合没有固定数据格式. 2. 数据: 时间类型: Date() 当前时间(js时间) new Date() 格林尼治时间(object) ...

  3. MongoDB 2.4企业版分析

    作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs MongoDB v2.4版于3月19日发布,它引入了内置的文本搜索功能,以及基于哈希的分片和众所期盼的安全 ...

  4. j.APR连接器整体框图(含SSL实现分析)

    APR连接器的思路和bio,nio的整体架构也是类似的,可以看到下面的整体框图: 第一个区别是,对于从Acceptor线程中的socket解析这块,无论是nio还是bio都是在Acceptor线程内直 ...

  5. MongoDB实战指南(五):MongoDB中的聚集分析

    聚集操作是对数据进行分析的有效手段.MongoDB主要提供了三种对数据进行分析计算的方式:管道模式聚集分析,MapReduce聚集分析,简单函数和命令的聚集分析. 1. 管道模式进行聚集 这里所说的管 ...

  6. MongoDB慢查询性能分析

    最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢.最后定位到MongoDB查询也很慢.   刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...

  7. MongoDB索引,性能分析

    索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...

  8. Redis和Memcache和MongoDB简介及区别分析(整理)

    Redis和Memcache 一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...

  9. MongoDB 的 GridFS 详细分析

    GridFS简介 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件. http://www.mongodb.org/display/DOCS/GridFS http://www.m ...

随机推荐

  1. 腾讯云上免费部署HTTPS

    接上篇<腾讯云下安装 nodejs + 实现 Nginx 反向代理>,想从头一步到位的同学建议从上篇文章开始阅读.本文将继续介绍如何通过 Nginx 免费部署HTTPS. 留意下,这里的“ ...

  2. Android JNI 本地开发接口

    前言 我们为什么要用JNI --> 高效.扩展 高效:Native code效率高,数学运算,实时渲染的游戏上,音视频处理 (*飞车,opengl,ffmpeg,文件压缩,图片处理-) 扩展: ...

  3. hadoop2&period;0初识1&period;1

    1.伪分布式hdfs文件系统的搭建(单节点文件系统) 1.1.根据上节的讲解,配置主机映射.jdk和解压hadoop压缩包 1.2.配置namenode 在/opt/modules/hadoop-2. ...

  4. poj 2391 Ombrophobic Bovines&lpar;最大流&plus;floyd&plus;二分&rpar;

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...

  5. Uva 315 Network 判断割点

    模板题,注意输出 #include <stdio.h> #include <string.h> #include <algorithm> #include < ...

  6. DTcms 模版用vs2015或2017 打开编辑时候 粘贴出问题 代码被调整

    因为模版语言不是标准的HTML格式 ,所以HTML粘帖的时候会格式化 导致原标签出问题,这里修改下就可以了

  7. pgsql SQL复杂查询示例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   WITH tmp AS(SELECT sum(sessioncount) as v ...

  8. 使用navicat 链接数据库时乱码

    在建立数据库链接时设置  高级->编码->uft-8 其他版本使用下面方法

  9. HDU 1455 Sticks&lpar;经典剪枝&rpar;

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. &lbrack;LeetCode&rsqb; 102&period; Binary Tree Level Order Traversal&lowbar;Medium tag&colon; BFS

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...