MongoDB使用x.509证书认证

文章目录

  • 自定义证书
    • 生成CA证书
    • 生成服务器之间的证书
    • 生成集群证书
    • 生成用户证书
  • MongoDB配置
  • java使用x.509证书连接MongoDB
  • MongoShell使用证书连接

8.0版本的mongodb开启复制集,配置证书认证

自定义证书

生成CA证书

生成ca私钥: openssl genrsa -out ca.key 4096 # 生成RSA 4096位私钥
生成ca证书: openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MongoDB Root CA/O=MyOrg/OU=Security"
验证ca证书: openssl x509 -in ca.crt -text -noout
生成pkcs12格式的p12文件:后续用于java代码认证
cat ca.crt ca.key > ca.pem
openssl pkcs12 -export -in ca.pem -out ca.p12 -password pass:123456

生成服务器之间的证书

生成服务器私钥: openssl genrsa -out server.key 2048
生成证书签名请求: openssl req -new -key server.key -out server.csr -subj "/CN=1.1.1.1/O=MyOrg/OU=Servers"
生成扩展配置文件(server.ext):

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=DNS:mongodb-server.example.com,DNS:localhost,IP:192.168.1.100

用ca签发证书: openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext
合并证书与私钥: cat server.crt server.key > server.pem
验证服务器证书: openssl verify -CAfile ca.crt server.crt # 应显示 “OK”

生成集群证书

生成集群私钥: openssl genrsa -out cluster.key 2048
生成CSR : openssl req -new -key cluster.key -out cluster.csr -subj "/CN=node1/O=MyOrg/OU=MongoDB-Cluster" 必须包含一致的 O(组织)或 OU(部门),否则集群节点无法相互认证。
生成扩展配置文件(cluster.ext):

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, keyEncipherment
extendedKeyUsage=clientAuth

ca签发集群证书: openssl x509 -req -in cluster.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out cluster.crt -days 365 -sha256 -extfile cluster.ext
合并证书与私钥: cat cluster.crt cluster.key > cluster.pem
验证集群证书:
openssl x509 -in cluster.crt -text | grep "Subject:" # 确认O/OU一致性
openssl verify -CAfile ca.crt cluster.crt # 应显示 “OK”

生成用户证书

生成用户私钥: openssl genrsa -out zy1.key 2048
生成CSR : openssl req -new -key zy1.key -out zy1.csr -subj "/O=MyOrg/CN=zy1" 必须包含一致的 O(组织)或 OU(部门),否则集群节点无法相互认证。
生成扩展配置文件( zy1.ext):

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, keyEncipherment
extendedKeyUsage=clientAuth

ca签发集群证书: openssl x509 -req -in zy1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out zy1.crt -days 365 -sha256 -extfile zy1.ext
合并证书与私钥: cat zy1.crt zy1.key > zy1.pem
获取subject : openssl x509 -in /usr/local/database/mongodb8.0.5/crt/zy1.pem -inform PEM -subject -nameopt RFC2253

生成pkcs12 格式的信任库文件:
openssl pkcs12 -export -inkey zy1.pem -in zy1.pem -out zy1_pem.p12 -password pass:123456
测试PKCS12密码正确性
keytool -list -v -keystore C:\Users\Administrator\Desktop\crt\zy1_pem.p12 -storetype pkcs12

MongoDB配置

mongodb配置:

     # mongod.confnet:tls:mode: requireTLSCAFile: /path/to/ca.crtcertificateKeyFile: /path/to/server.pemclusterFile: /path/to/cluster.pemsecurity:clusterAuthMode: x509authorization: enabled	

所有pem文件的权限都设为600 : chmod 600 ca.crt server.pem cluster.pem
客户端的证书由同一CA签发,并且在Mongodb中创建对应用户,如下:用户名为O=MyOrg,CN=zy,需要与证书中的Subject保持一致。可以通过名命令获取:
openssl x509 -in /usr/local/database/mongodb8.0.5/crt/zy1.pem -inform PEM -subject -nameopt RFC2253

db.getSiblingDB("$external").runCommand({createUser: "O=MyOrg,CN=zy",roles: [{ role: "readWrite", db: "test" },{ role: "userAdminAnyDatabase", db: "admin" }],writeConcern: { w: "majority" , wtimeout: 5000 }}
)

java使用x.509证书连接MongoDB

package com.zy.sslcontext;import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;/*** Connect to a MongoDB cluster with TLS connection.* Validate MongoDB server's certificate with the CA certificate. Present a Client certificate to be validated by* the MongoDB server.** Use X509 certificate to authenticate with the MongoDB server** Create a custom {@link javax.net.ssl.SSLContext} with the TrustStore holding the CA certificate and* the KeyStore holding the Client certificate and provide it to the MongoDB Driver.*/
public class ValidateServerPresentClientCertificateX509Auth {public static void main(String[] args) {//     System.setProperty("javax.net.debug", "ssl:handshake:verbose");// Configure MongoDB Driver to use MONGODB-X509 as authentication mechanism// 此处url可以不用填写用户名密码,则后续配置时采用credential(MongoCredential.createMongoX509Credential())使用证书在的用户信息进行数据操作String connectionString = "mongodb://zy:123456@1.1.1.1:27017/?&ssl=true"; SSLContext sslContext;try {sslContext = getSSLContext();} catch (Exception e) {System.out.println("Failed to generate SSLContext. Error: " + e.getMessage());return;}MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(new ConnectionString(connectionString)) .applyToSslSettings(builder -> {builder.enabled(true); // 开启sslbuilder.context(sslContext);})
//                .credential(MongoCredential.createCredential("zy","admin","123456".toCharArray()))
//                .credential(MongoCredential.createMongoX509Credential("O=MyOrg,CN=zy"))
//                .credential(MongoCredential.createMongoX509Credential()).applyToConnectionPoolSettings(builder -> builder.maxSize(1)          // 总最大连接数(所有实例总和).minSize(1)           // 总最小空闲连接数.maxWaitTime(1500, TimeUnit.MILLISECONDS).maxConnectionIdleTime(10, TimeUnit.MINUTES)).applyToSocketSettings(b -> b.connectTimeout(3000, TimeUnit.MILLISECONDS).readTimeout(5000, TimeUnit.MILLISECONDS)).build();MongoClient client = MongoClients.create(settings);MongoDatabase test = client.getDatabase("test");MongoCollection<Document> coll  = test.getCollection("collection1");// Retrieve the first document and print itSystem.out.println(coll.getNamespace());System.out.println(coll.find().first());MongoCollection<Document> collection = client.getDatabase("zy").getCollection("test1");collection.find().forEach(System.out::println);}/*** Load CA certificate from the file into the Trust Store.* Use PKCS12 keystore storing the Client certificate and read it into the {@link KeyStore}* Generate {@link SSLContext} from the Trust Store and {@link KeyStore}** @return SSLContext** @throws IOException* @throws CertificateException* @throws NoSuchAlgorithmException* @throws KeyStoreException* @throws KeyManagementException*/private static SSLContext getSSLContext() throws IOException, CertificateException,NoSuchAlgorithmException, KeyStoreException, KeyManagementException, UnrecoverableKeyException {//        String certsPath = System.getProperty("cert_path");String certsPath = "C:\\Users\\Administrator\\Desktop\\crt\\";// Path to the CA certificate on diskString caCertPath = certsPath + "ca.crt";// 避坑:使用JKS认证失败// openssl pkcs12 -export -inkey zy.key -in zy.pem -out zy.p12// Path to the PKCS12 Key Store holding the Client certificateString clientCertPath = certsPath + "zy1_pem.p12";String clientCertPwd  = "123456";SSLContext sslContext;try (InputStream caInputStream = new FileInputStream(caCertPath);InputStream clientInputStream = new FileInputStream(clientCertPath)) {// Read Client certificate from PKCS12 Key StoreKeyStore clientKS = KeyStore.getInstance("PKCS12");clientKS.load(clientInputStream, clientCertPwd.toCharArray());// Retrieve Key Managers from the Client certificate Key StoreKeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(clientKS, clientCertPwd.toCharArray());KeyManager[] keyManagers = kmf.getKeyManagers();// Read CA certificate from file and convert it into X509CertificateCertificateFactory certFactory = CertificateFactory.getInstance("X509");X509Certificate caCert = (X509Certificate)certFactory.generateCertificate(caInputStream);KeyStore caKS = KeyStore.getInstance(KeyStore.getDefaultType());caKS.load(null);caKS.setCertificateEntry("caCert", caCert);// Initialize Trust ManagerTrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(caKS);// Create SSLContext. We need Trust Manager only in this use casesslContext = SSLContext.getInstance("TLS");sslContext.init(keyManagers, tmf.getTrustManagers(), null);}return sslContext;}
}

MongoShell使用证书连接

./mongosh --host 1.1.1.1 --tls --tlsCAFile /usr/local/database/mongodb8.0.5/crt/ca.crt --tlsCertificateKeyFile /usr/local/database/mongodb8.0.5/crt/zy.pem --authenticationDatabase '$external' --authenticationMechanism MONGODB-X509

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫实战:研究js混淆加密

一、引言 在当今数字化时代,数据已成为推动各行业发展的核心驱动力。网络爬虫作为一种高效的数据采集工具,能够从互联网上自动获取大量有价值的信息。然而,随着互联网技术的不断发展,许多网站为了保护自身数据安全和知识产权,采用了 JavaScript 混淆加密技术来防止数据被…

Java项目层级介绍 java 层级 层次

java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository &#xff1a;数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中&#xff0c;层级结构&#xff08;Layered Architecture&#xf…

网络安全顶会——SP 2025 论文清单与摘要

1、"Check-Before-you-Solve": Verifiable Time-lock Puzzles 时间锁谜题是一种密码学原语&#xff0c;它向生成者保证该谜题无法在少于T个顺序计算步骤内被破解。近年来&#xff0c;该技术已在公平合约签署和密封投标拍卖等场景中得到广泛应用。然而&#xff0c;求解…

《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》

目录 一、认识正则表达式二、正则表达式基本语法2.1 行界定符2.2 单词定界符2.3 字符类2.4 选择符2.5 范围符2.6 排除符2.7 限定符2.8 任意字符2.9 转义字符2.10 反斜杠2.11 小括号2.11.1 定义独立单元2.11.2 分组 2.12 反向引用2.13 特殊构造2.14 匹配模式 三、re模块3.1 comp…

思迈特软件携手天阳科技,打造ChatBI金融智能分析新标杆

5月10日&#xff0c;广州思迈特软件有限公司&#xff08;以下简称“思迈特软件”&#xff09;与天阳宏业科技股份有限公司&#xff08;以下简称“天阳科技”&#xff09;在北京正式签署战略合作协议。思迈特软件董事长吴华夫、CEO姚诗成&#xff0c;天阳科技董事长兼总裁欧阳建…

OPENSSL-1.1.1的使用及注意事项

下载链接&#xff1a; OpenSSL1.1.1一个广泛使用的开源加密库资源-CSDN文库 OpenSSL 1.1.1 是一个广泛使用的开源加密库&#xff0c;以下是其使用方法及注意事项&#xff1a; 使用方法 安装&#xff1a; Linux系统&#xff1a; 从源码编译安装&#xff1a;访问 OpenSSL 官网…

数据库优化

一、慢 SQL 排查全流程 1. 开启慢查询日志&#xff1a;精准定位问题 SQL 慢查询日志是定位性能问题的首要工具&#xff0c;通过记录执行超时或未使用索引的 SQL&#xff0c;为优化提供依据。 配置步骤&#xff1a; ① 临时启用&#xff08;生效至服务重启&#xff09; sql …

GO语言-导入自定义包

文章目录 1. 项目目录结构2. 创建自定义包3. 初始化模块4. 导入自定义包5. 相对路径导入 在Go语言中导入自定义包需要遵循一定的目录结构和导入规则。以下是详细指南&#xff08;包含两种方式&#xff09;&#xff1a; 1. 项目目录结构 方法1&#xff1a;适用于Go 1.11 &#…

记录算法笔记(2025.5.11) 二叉树的中序遍历

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] …

【iptables防火墙】 -- DDos防御

最近有客户要定制路由器的默认防火墙等级&#xff0c;然后涉及到了DDos规则&#xff0c;对比客户提供的规则发现我们现有的规则存在明显的错误&#xff0c;在此记录一下如何使用iptables防护DDoS攻击 直接贴一下规则 #开启TCP SYN Cookies 机制 sysctl -w net.ipv4.tcp_synco…

[Java][Leetcode simple]26. 删除有序数组中的重复项

思路 第一个元素不动从第二个元素开始&#xff1a;只要跟上一个元素不一样就放入数组中 public int removeDuplicates(int[] nums) {int cnt1;for(int i 1; i < nums.length; i) {if(nums[i] ! nums[i-1]) {nums[cnt] nums[i];}}return cnt;}

微服务!!

1.Nacos注册中心 2.服务注册 3.服务发现 4.负载均衡 5.OpenFeign 6.OpenFeign连接池 启动程序 7.路由 8.微服务保护 1.雪崩问题 2.解决方案 1.请求限流 2.线程隔离 3.服务熔断 3.Sentinel 1.链路 2.请求限流 3.线程隔离 4.Fallback 5.服务熔断 4.分布式事务 1.Seata 2.部…

代码随想录算法训练营 Day44 动态规划 ⅩⅠ 子序列问题

动态规划 题目 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 公共子序列&#xff0c;类似于最长重复子数组&#xff0c;但是不要求连续 (子序列) 1. 定义 dp&#xff0c;dp[i][j] 表示以 i-1 与 j-1 结尾的最长公共子序列的长度 2. 定义递推公式 如果字符相…

聊一聊接口测试依赖第三方服务变更时如何处理?

目录 一、依赖隔离与模拟 二、契约测试 三、版本控制与兼容性 四、变更监控与告警 五、容错设计 六、自动化测试维护 七、协作机制与文档自动化 第三方API突然改了参数或者返回结构&#xff0c;导致我们的测试用例失败&#xff0c;这时候该怎么办呢&#xff1f;首先想到…

Python程序,输入IP,扫描该IP哪些端口对外是开放的,输出端口列表

#!/usr/bin/env python # -*- coding: utf-8 -*-""" IP端口扫描程序 输入IP地址&#xff0c;扫描该IP哪些端口对外是开放的&#xff0c;输出端口列表 """import socket import sys import concurrent.futures import ipaddress from tabulate im…

Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)

一、论文 MobileNetV2 论文提出了一种新的移动架构&#xff0c;该架构提高了移动模型在多个任务和基准测试中的性能&#xff0c;以及在各种不同模型大小范围内的性能. 该架构基于倒残差结构&#xff0c;其中 shortcut 连接在 thin bottleneck 层之间. 中间的 expansion 层使用轻…

Maven私服搭建与登录全攻略

目录 1.背景2.简介3.安装4.启动总结参考文献 1.背景 回顾下maven的构建流程&#xff0c;如果没有私服&#xff0c;我们所需的所有jar包都需要通过maven的中央仓库或者第三方的maven仓库下载到本地&#xff0c;当一个公司或者一个团队所有人都重复的从maven仓库下载jar包&#…

EF Core 数据库迁移命令参考

在使用 Entity Framework Core 时&#xff0c;若你希望通过 Package Manager Console (PMC) 执行迁移相关命令&#xff0c;以下是常用的 EF Core 迁移命令&#xff1a; PMC 方式 ✅ 常用 EF Core PMC 命令&#xff08;适用于迁移&#xff09; 操作PMC 命令添加迁移Add-Migra…

商业 |阿里云又丢出了核弹

行业翘首以盼的DeepSeek-R2没等到&#xff0c;阿里云却先一步丢出了核弹。 4月29日凌晨&#xff0c;阿里云正式上线了Qwen3系列模型“全家桶”&#xff0c;包含2个MoE模型、6个稠密模型。 八个模型&#xff0c;小到0.6B大到235B&#xff0c;既能在手机使用&#xff0c;也有旗…

《Python星球日记》 第66天:序列建模与语言模型

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、传统语言模型1. n-gram 模型基础2. n-gram 模型的局限性二、RNN 在语言建模中的应用1. 语言模型的基本原理2. RNN 构建语言模型的优势3. 实…