记一次公司等保三级测评不通过,需要整改的项目: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代码

@Configuration
public 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/

MongoDB配置SSL安全连接 - 灰信网(软件开发博客聚合)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐