Ao implantar o MongoDB em produção, é altamente recomendável que você use uma configuração de conjunto de réplicas distribuída geograficamente habilitada para SSL para segurança e disponibilidade máximas. O ScaleGrid oferece duas opções para configurar o SSL.
Uma opção é comprar seus próprios certificados SSL assinados por CA e configurá-los no servidor MongoDB. Se seu aplicativo se conectar ao banco de dados de produção em uma rede pública, entre em contato com [email protected] para saber mais sobre isso.
Mas, por padrão, configuramos certificados autoassinados para SSL ao criar nós para um novo cluster. Isso evita custos extras e pode ser igualmente seguro quando configurado corretamente. Mas isso significa que seu driver MongoDB precisa de ajuda para validar a cadeia de certificados.
Ao lidar com certificados autoassinados, alguns desenvolvedores contornam a validação completamente e comprometem seriamente a segurança! Nesta postagem do blog, mostramos dois métodos para se conectar com segurança a um servidor MongoDB configurado com certificados autoassinados para SSL, usando o driver C# MongoDB oficial. Com alguns passos simples, você pode fornecer ao seu driver as informações necessárias para validar o certificado do servidor e manter a conexão segura.
Como conectar o SSL do MongoDB ao seu aplicativo C#Click To Tweet
Pré-requisitos
Antes de continuar,
- Certifique-se de que seu aplicativo possa se conectar à implantação do ScaleGrid. Consulte nosso documento de ajuda do MongoDB Connections para revisar as etapas gerais para conectar seu aplicativo a uma implantação do ScaleGrid.
- Você precisa ter o driver MongoDB instalado. Consulte os documentos do Driver MongoDB para revisar as etapas para instalar e usar o C# MongoDB.Driver.
Observação:todos os exemplos de código foram testados usando o MongoDB Driver v2.8.1 junto com o .NET Framework v4.6.1. No entanto, eles devem funcionar em qualquer versão razoavelmente recente do .NET Framework e do Driver MongoDB.
Lembre-se de…Modifique os caminhos de arquivo e URLs de conexão nas amostras de código para seus próprios caminhos de arquivo e URLs. Caso contrário, os exemplos de código não funcionarão. Consulte as partes em negrito dos exemplos de código para saber onde você precisa fazer alterações. Por exemplo:
|
Método 1:Adicionando o certificado ScaleGrid ao Windows Trust Store
Uma das maneiras mais simples de usar certificados autoassinados com C# e .NET Framework é adicionar o certificado como “Raiz Confiável” no Windows Trust Store. Veja como você pode fazer isso:
- Faça o download do seu certificado de CA na interface do usuário do ScaleGrid.
- Abra um prompt do PowerShell – se desejar adicionar o certificado como raiz confiável para todos os usuários, será necessário abri-lo no modo administrativo.
- Execute o comando a seguir ou faça isso usando o Microsoft Management Console.:
- Para adicionar apenas para o usuário atual:
Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
- Para adicionar para todos:
Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'
É isso aí! Agora o certificado autoassinado passará por todas as validações padrão e você estará pronto para criar um cliente MongoDB.
var connURL = "mongodb://admin:<password>@<host1>,<host2>:27017/admin?replicaSet=<ReplicaSetName>&ssl=true"; var client = new MongoClient(connURL);
Método 2:usando o retorno de chamada de validação personalizado
Há dois problemas ao adicionar o certificado ScaleGrid ao Windows Trust Store:
- As configurações se aplicam a todos os programas em execução na máquina:isso pode ser uma vulnerabilidade de segurança.
- Isso deve ser feito uma vez por máquina. Se você mover seu código para um novo servidor, ele pode parar de funcionar de repente. Isso deixa o método propenso a erros humanos.
Portanto, a maneira recomendada de se conectar usando certificados autoassinados é usar um retorno de chamada de validação personalizado que verifica o certificado. Veja como você pode fazer isso:
- Faça o download do seu certificado de CA e salve-o em um local que seu aplicativo possa acessar (geralmente será o diretório de dados).
- No seu aplicativo, você pode ler este certificado e corresponder ao que você recebe do servidor MongoDB.
- Como alternativa, você pode armazenar um hash criptográfico do certificado. Em vez de ler o certificado e fazer a correspondência, você pode calcular o hash criptográfico sobre o certificado recebido e combinar os resultados.
Aqui está um programa de exemplo que tem o Certificado CA armazenado em seu diretório bin com o nome caCert.cer. Ele simplesmente imprime uma lista de todos os bancos de dados que existem no servidor MongoDB:
using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; using System.Linq; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace TestMongoDB { class Program { static void Main(string[] args) { var connURL = "mongodb:<password>//admin:@<host1>,<host2>:27017/admin?replicaSet=<Replica-Set-Name>&ssl=true"; var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connURL)); clientSettings.UseSsl = true; clientSettings.VerifySslCertificate = true; clientSettings.SslSettings = new SslSettings(); clientSettings.SslSettings.ServerCertificateValidationCallback = ValidateServerCertficate; var client = new MongoClient(clientSettings); using (IAsyncCursor cursor = client.ListDatabases()) { while (cursor.MoveNext()) { foreach (var doc in cursor.Current) { Console.WriteLine(doc["name"]); // database name } } } } private static bool ValidateServerCertficate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { bool certMatch = false; // Assume failure switch(sslPolicyErrors) { case SslPolicyErrors.None: Console.WriteLine("No validation errors - accepting certificate"); certMatch = true; break; case SslPolicyErrors.RemoteCertificateChainErrors: Console.WriteLine("Failed to validate certificate chain. Most likely a self-signed certificate"); if (chain.ChainElements.Count == 1 && chain.ChainStatus[0].Status == X509ChainStatusFlags.UntrustedRoot) //It is a self-signed certificate, so chain length will be 1. { X509Certificate savedCert = X509Certificate.CreateFromCertFile("caCert.cer"); if (savedCert.Equals(cert)) //This verifies that the issuer and serial number matches. You can also use a cryptographic hash, or match the two certificates byte by byte. { Console.WriteLine("The certificates match"); certMatch = true; } } break; default: Console.WriteLine("Name mismatch or remote-cert not available. Rejecting connection"); break; } return certMatch; } } }
Solução de problemas
Se você estiver tendo problemas para se conectar à sua implantação do MongoDB habilitada para SSL, aqui estão algumas dicas para depuração:
- Primeiro, verifique se você pode realmente se conectar ao servidor MongoDB a partir do servidor em que seu aplicativo está sendo executado. A maneira mais simples de fazer isso é instalar o shell mongo na máquina cliente. No Linux, você não precisaria instalar todo o servidor MongoDB – você pode optar por instalar apenas o shell. Quando o shell estiver disponível, tente usar a "Sintaxe da linha de comando" que fornecemos para tentar se conectar ao servidor.
- Se você não conseguir se conectar por meio do shell do mongo, isso significa que a máquina cliente não consegue acessar a porta 27017 dos servidores MongoDB. Observe as configurações de firewall do Security Group, VPC e/ou ScaleGrid para garantir que haja conectividade entre as máquinas cliente e servidor.
- Se a conectividade de rede estiver correta, a próxima coisa a verificar é se você está usando versões do Driver MongoDB e do .NET Framework que são compatíveis com a versão do seu servidor MongoDB.
- Se você confirmou que as versões do driver estão corretas, tente executar um programa C# de exemplo no modo de depuração, semelhante ao exemplo fornecido acima. Uma execução passo a passo ajudaria a causar a raiz do problema.
- Se você ainda estiver com problemas para se conectar à sua instância, entre em contato conosco em [email protected] com resultados detalhados das etapas de solução de problemas acima e com as versões exatas do C# e do driver Mongo que você está usando. l>
Se você é novo no ScaleGrid e deseja experimentar este tutorial, inscreva-se para uma avaliação gratuita de 30 dias para explorar a plataforma e testar a conexão do MongoDB ao seu aplicativo C# .