记一次公司等保三级测评不通过,需要整改的项目:mongodb需配置SSL连接
我们生产环境mongodb是自己搭建的4.4.10
通过各种资料终于搞定了,写个文章记录下整改的情况,现在直接开始整改
一、生成根证书
openssl req -out ca.pem -new -x509 -days 3650 -subj "/C=CN/ST=BeiJing/O=bigdata/CN=root/emailAddress=yanruqian@dfl.com.cn"
参数说明
-new:表示生成一个新证书签署请求
-x509:专用于CA生成自签证书,如果不是自签证书则不需要此项
-out:证书的保存路径
-days:证书的有效期限,单位是day(天),默认是365天
执行生成证书之后,提示需要输入密码:这个密码自己定义下,定义完要记得保管好,别搞忘记了
我这里输入密码:qwe!@#123
输入完成后会让你再次输入密码进行确认
执行完成后查看生成文件
到此我们的根证书已经生成完成。
二、生成服务器端PEM文件
2.1 使用RSA加密算法生成一个服务端私钥文件(OpenSSL通常使用PEM(Privacy Enbanced Mail)格式来保存私钥)构建私钥的命令如下:
openssl genrsa -out server.key 2048
执行完成后查看生成文件
参数说明
genrsa —— 使用RSA算法产生私钥
out——输出文件的路径
2048——指定私钥长度
2.2 根据密钥文件生成一个证书申请文件(csr文件),构建命令如下:
openssl req -key server.key -new -out server.req -subj "/C=CN/ST=BeiJing/O=bigdata/CN=server1/CN=localhost/emailAddress=yanruqian@dfl.com.cn"
执行完成后查看生成文件
参数说明
req——执行证书签发命令
-new——新证书签发请求
-key——指定私钥路径
-out——输出的csr文件的路径
-subj——证书相关的用户信息(subject的缩写)
2.3 根据证书申请文件生成CA的服务端证书文件,构建命令如下:
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAcreateserial -out server.crt -days 3650
执行后需要输入密码:qwe!@#123
执行完成后查看生成文件
参数说明
-CA——指定CA证书的路径
-CAkey——指定CA证书的私钥路径
-CAcreateserial——表示创建证书序列号文件,创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀
2.4 合并证书和私钥成PEM文件 ,构建命令如下:
cat server.key server.crt > server.pem
执行完成后查看生成文件
2.5 验证服务端证书
openssl verify -CAfile ca.pem server.pem
显示如下信息,服务器端证书验证成功:
三、生成客户端PEM文件
3.1 使用RSA加密算法生成一个客户端私钥文件
openssl genrsa -out client.key 2048
执行完成后查看生成文件
参数说明
genrsa —— 使用RSA算法产生私钥
out——输出文件的路径
2048——指定私钥长度
3.2 根据密钥文件生成一个证书申请文件,构建命令如下:
openssl req -key client.key -new -out client.req -subj "/C=CN/ST=BeiJing/O=bigdata/CN=client1/emailAddress=yanruqian@dfl.com.cn"
参数说明
req——执行证书签发命令
-new——新证书签发请求
-key——指定私钥路径
-out——输出的csr文件的路径
-subj——证书相关的用户信息(subject的缩写)
3.3 根据证书申请文件生成CA的客户端证书文件:
openssl x509 -req -in client.req -CA ca.pem -CAkey privkey.pem -CAserial ca.srl -out client.crt -days 3650
执行完成后需要输入密码: qwe!@#123
参数说明
-CA——指定CA证书的路径
-CAkey——指定CA证书的私钥路径
-CAserial——指定证书序列号文件的路径(这里使用在创建服务器端证书文件时创建的序列号文件即可)
3.4 合并证书及私钥文件成PEM文件
cat client.key client.crt > client.pem
3.5 验证客户端证书
显示如下信息,客户端证书验证成功:
至此我们完成了证书的创建过程,接下来我们开始进行mongodb的ssl配置吧。
四、配置mongodb的ssl支持
4.1 首先需要对mongodb服务器进行设置,这些设置可以在调用mongod启动mongodb服务器时,通过命令行参数进行指定,也可以通过配置文件进行指定,配置文件的默认位置是/usr/local/etc/目录下的mongod.conf。配置内容如下
我的mongodb是通过yum方式安装,打开mongo的配置文件:
vi /etc/mongod.conf
找到net配置:添加如下代码:
net:
port: 27117
bindIp: 10.100.199.20
ssl:
mode: requireSSL
PEMKeyFile: /usr/local/mongodb/mongodb-ssl/server.pem
CAFile: /usr/local/mongodb/mongodb-ssl/ca.pem
allowInvalidHostnames: true
注意
这里PEMKeyFile和CAFile中的文件路径,一定指向我们在上面步骤中生成的文件。
4.2 配置完成后需要重启mongodb
sudo systemctl restart mongod
4.3 重启后检查下mongodb状态
sudo systemctl status mongod
至此我们的mongodb已经是配置SSL证书的了,客户端连接需要证书才可以。
五、连接mongodb
5.1 使用mongo shell连接mongodb数据库:
mongo --sslAllowInvalidCertificates --sslAllowInvalidHostnames --ssl --sslPEMKeyFile /usr/local/mongodb/mongodb-ssl/client.pem --sslCAFile /usr/local/mongodb/mongodb-ssl/ca.pem --host 10.100.199.20 --port 27117
这样我们就可以通过mongo shell连接到本地的mongodb服务器上了,如下图所示:
5.2 使用navicat客户端连接mongodb
5.3 java代码配置mongodb连接SSL,添加maven pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
在application.yml中配置mongodb信息
spring:
data:
mongodb:
host: 127.0.0.1
username: root
password: password
port: 27117
database: db
新增java代码
@Configurationpublic class MongoSSLConfig { @Bean
public MongoClient createMongoSSLClient(MongoProperties properties) {
MongoCredential credential = MongoCredential.createCredential(properties.getUsername(), properties.getMongoClientDatabase(), properties.getPassword());
MongoClientOptions sslOptions = MongoClientOptions.builder()
.sslEnabled(true) //开启SSL连接
.sslInvalidHostNameAllowed(true) //不检查证书域名
.minConnectionsPerHost(1) //连接池最小连接数,最大连接数默认为100
.build();
return new MongoClient(new ServerAddress(properties.getHost(), properties.getPort()), credential, sslOptions);
}
}
在springboot项目启动类里面追加代码。在程序中设置JVM 系统属性以指向正确的信任库和密钥库。
System.setProperty("javax.net.ssl.trustStore", caKeyStorePath); System.setProperty("javax.net.ssl.keyStore", keyStorePath); System.setProperty("javax.net.ssl.trustStorePassword", "qwe!@#123"); System.setProperty("javax.net.ssl.keyStorePassword", "qwe!@#123");
javax.net.ssl.trustStore:生成命令如下:
openssl pkcs12 -export -in /usr/local/mongodb/mongodb-ssl/server.crt -inkey /usr/local/mongodb/mongodb-ssl/server.key -out server.p12 -name server.12
javax.net.ssl.keyStore:生成命令如下:
openssl pkcs12 -export -in /usr/local/mongodb/mongodb-ssl/client.pem -out keystore
把生成的server.12、keystore文件配置到代码里面
@EnableCaching@SpringBootApplication@EnableCircuitBreaker
@Slf4j
public class DemoApplication {
public static void main(String[] args) {
//openssl pkcs12 -export -in client.pem -out keystore
String keyStorePath = "/usr/local/lycx-bms/mongossl/keystore";
//String keyStorePath = "C:\\mongodb-ssl\\keystore";
//openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name server.12
String caKeyStorePath = "/usr/local/lycx-bms/mongossl/server.p12";
//String caKeyStorePath = "C:\\mongodb-ssl\\server.p12";
System.setProperty("javax.net.ssl.trustStore", caKeyStorePath);
System.setProperty("javax.net.ssl.keyStore", keyStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "qwe!@#123");
System.setProperty("javax.net.ssl.keyStorePassword", "qwe!@#123");
SpringApplication app = new SpringApplication(DemoApplication.class);
}
}
以上是mongodb整个配置SSL过程,以此记录下来。希望对大家有帮助!
参考文档:
https://mongodb.github.io/mongo-java-driver/4.1/driver/tutorials/ssl/