MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB SSL com certificados autoassinados em C#

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:
  • =C:\Users\User\Folder\caCert.cer
  • =mongodb://admin:@SG-example.servers.example.com:27017

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:

  1. Faça o download do seu certificado de CA na interface do usuário do ScaleGrid.
  2. 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.
  3. 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:

  1. 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).
  2. No seu aplicativo, você pode ler este certificado e corresponder ao que você recebe do servidor MongoDB.
  3. 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# .