sql >> データベース >  >> NoSQL >> MongoDB

Spring data mongodb、SSLの設定方法は?

    Spring Bootアプリをmongodbに接続するだけの場合は、keyStoreとtrustStoreをJavaコードで使用できます。したがって、コマンドラインから証明書を追加する必要はありません。 Cloud Foundryを使用している場合は、アプリをmongodbServicesに接続すると、System.getEnv( "VCAP_SERVICES")に必要なすべての資格情報を取得できます。

    @Configuration
    public class MongoConfiguration extends AbstractMongoConfiguration {
        private static Log logger = LogFactory.getLog(MongoConfiguration.class);
        @Value("${spring.data.mongodb.database}")
        private String defaultDatabase; //database you want to connect
        private String host;
        private int port;
        private String authenticationDb; //usually admin
        private String username;
        private char[] password;
        private String certificateDecoded; //your CA Certifcate decoded (starts with BEGIN CERTIFICATE)
    
        public MongoConfiguration() {
            //method for credentials initialization
        }
    
        //you can't set replicaset=replset in mongooptions so if you want set replicaset, you have to use 
        // customEditorConfigurer in combintaion with class that implementsPropertyEditorRegistrar
        @Bean
        public static CustomEditorConfigurer customEditorConfigurer(){
            CustomEditorConfigurer configurer = new CustomEditorConfigurer();
            configurer.setPropertyEditorRegistrars(
                    new PropertyEditorRegistrar[]{new ServerAddressPropertyEditorRegistrar()});
            return configurer;
        }
    
        @Override
        protected String getDatabaseName() {
            return authenticationDb;
        }
    
        @Override
        @Bean
        public MongoClient mongoClient() {
            MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress(host, port)), mongoCredentials(), mongoClientOptions());
            return mongoClient;
        }
    
        @Bean
        public MongoClientOptions mongoClientOptions() {
            MongoClientOptions.Builder mongoClientOptions = MongoClientOptions.builder().sslInvalidHostNameAllowed(true).sslEnabled(true);
            try {
                InputStream inputStream = new ByteArrayInputStream(certificateDecoded.getBytes(StandardCharsets.UTF_8));
                CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
                X509Certificate caCert = (X509Certificate) certificateFactory.generateCertificate(inputStream);
    
                TrustManagerFactory trustManagerFactory = TrustManagerFactory
                        .getInstance(TrustManagerFactory.getDefaultAlgorithm());
                KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                keyStore.load(null); // You don't need the KeyStore instance to come from a file.
                keyStore.setCertificateEntry("caCert", caCert);
    
                trustManagerFactory.init(keyStore);
    
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
                mongoClientOptions.sslContext(sslContext);
                mongoClientOptions.sslInvalidHostNameAllowed(true);
            } catch (Exception e) {
                throw new IllegalStateException(e);
            }
    
            return mongoClientOptions.build();
        }
    
        private MongoCredential mongoCredentials() {
            return MongoCredential.createCredential(username, authenticationDb, password);
        }
    
    //With MongoTemplate you have access to db.
        @Bean
        public MongoTemplate mongoTemplate() {
            SimpleMongoDbFactory factory = new SimpleMongoDbFactory(mongoClient(), defaultDatabase);
            return new MongoClient(factory);
    
        }
    }
    
    
    public final class ServerAddressPropertyEditorRegistrar implements PropertyEditorRegistrar {
        @Override
        public void registerCustomEditors(PropertyEditorRegistry registry) {
            registry.registerCustomEditor(ServerAddress[].class, new ServerAddressPropertyEditor());
        }
    }
    


    1. MongoDBクエリでドキュメントの配列をフィルタリングしてマップする方法は?

    2. Spring Data RedisTemplate:値とHashValueのシリアル化

    3. mongo export SyntaxError:欠落;ステートメントの前@(shell):1:14

    4. MongoDBUncleanShutdown-修復に失敗します