MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

SSL MongoDB avec certificats auto-signés en C#

Lors du déploiement de MongoDB en production, il est fortement recommandé d'utiliser une configuration d'ensemble de répliques géodistribuées compatible SSL pour une sécurité et une disponibilité maximales. ScaleGrid vous offre deux options pour configurer SSL.

Une option consiste à acheter vos propres certificats SSL signés par une autorité de certification et à les configurer sur le serveur MongoDB. Si votre application se connecte à la base de données de production via un réseau public, contactez [email protected] pour en savoir plus à ce sujet.

Mais par défaut, nous configurons des certificats auto-signés pour SSL lors de la création de nœuds pour un nouveau cluster. Cela évite des coûts supplémentaires et peut être tout aussi sécurisé lorsqu'il est correctement configuré. Mais cela signifie que votre pilote MongoDB a besoin d'aide pour valider la chaîne de certificats.

Lors de la gestion des certificats auto-signés, certains développeurs contournent complètement la validation et compromettent sérieusement la sécurité ! Dans cet article de blog, nous vous montrons deux méthodes pour vous connecter en toute sécurité à un serveur MongoDB configuré avec des certificats auto-signés pour SSL, en utilisant le pilote C# MongoDB officiel. En quelques étapes simples, vous pouvez fournir à votre chauffeur les informations dont il a besoin pour valider le certificat du serveur et sécuriser la connexion.

Comment connecter SSL MongoDB à votre application C#Cliquez pour tweeter

Prérequis

Avant de continuer,

  • Assurez-vous que votre application peut se connecter à votre déploiement ScaleGrid. Veuillez consulter notre documentation d'aide sur les connexions MongoDB pour passer en revue les étapes générales de connexion de votre application à un déploiement ScaleGrid.
  • Vous devez avoir installé le pilote MongoDB. Veuillez consulter la documentation du pilote MongoDB pour passer en revue les étapes d'installation et d'utilisation de C# MongoDB.Driver.

Remarque :tous les exemples de code ont été testés à l'aide du pilote MongoDB v2.8.1 avec .NET Framework v4.6.1. Cependant, ils devraient fonctionner sur n'importe quelle version raisonnablement récente de .NET Framework et du pilote MongoDB.

N'oubliez pas de…

Modifiez les chemins de fichiers et les URL de connexion dans les exemples de code avec vos propres chemins de fichiers et URL. Sinon, les exemples de code ne fonctionneront pas. Veuillez consulter les parties en gras des exemples de code pour savoir où vous devez apporter des modifications. Par exemple :

  • =C:\Utilisateurs\Utilisateur\Dossier\caCert.cer
  • =mongodb://admin :@SG-example.servers.example.com:27017

Méthode 1 :ajouter le certificat ScaleGrid au Windows Trust Store

L'un des moyens les plus simples d'utiliser des certificats auto-signés avec C# et le .NET Framework consiste à ajouter le certificat en tant que « racine approuvée » sur le Windows Trust Store. Voici comment procéder :

  1. Téléchargez votre certificat CA à partir de l'interface utilisateur de ScaleGrid.
  2. Ouvrez une invite PowerShell :si vous souhaitez ajouter le certificat en tant que racine de confiance pour tous les utilisateurs, vous devrez l'ouvrir en mode administratif.
  3. Exécutez la commande suivante ou faites-le à l'aide de la console de gestion Microsoft. :
    • A ajouter uniquement pour l'utilisateur actuel :
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • À ajouter pour tout le monde :
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

C'est tout ! Maintenant, le certificat auto-signé passera toutes les validations par défaut et vous êtes prêt à créer un client MongoDB.

var connURL = "mongodb://admin:<password>@<host1>,<host2>:27017/admin?replicaSet=<ReplicaSetName>&ssl=true";
var client = new MongoClient(connURL);

Méthode 2 :Utilisation du rappel de validation personnalisé

L'ajout du certificat ScaleGrid au Windows Trust Store pose deux problèmes :

  • Les paramètres s'appliquent à tous les programmes exécutés sur la machine :il peut s'agir d'une faille de sécurité.
  • Cela doit être fait une fois par machine. Si vous déplacez votre code vers un nouveau serveur, il peut soudainement cesser de fonctionner. Cela laisse la méthode sujette à l'erreur humaine.

Par conséquent, la méthode recommandée pour se connecter à l'aide de certificats auto-signés consiste à utiliser un rappel de validation personnalisé qui vérifie le certificat. Voici comment procéder :

  1. Téléchargez votre certificat CA et enregistrez-le dans un emplacement auquel votre application peut accéder (il s'agit généralement de son répertoire de données).
  2. Depuis votre application, vous pouvez lire ce certificat et faire correspondre celui que vous recevez du serveur MongoDB.
  3. Vous pouvez également stocker un hachage cryptographique du certificat. Au lieu de lire le certificat et de le faire correspondre, vous pouvez calculer le hachage cryptographique sur le certificat reçu et faire correspondre les résultats.

Voici un exemple de programme dans lequel le certificat CA est stocké dans son répertoire bin avec le nom caCert.cer. Il imprime simplement une liste de toutes les bases de données qui existent sur le serveur 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;
    }
  }
}

Dépannage

Si vous rencontrez des difficultés pour vous connecter à votre déploiement MongoDB compatible SSL, voici quelques conseils de débogage :

  • Tout d'abord, vérifiez que vous pouvez réellement vous connecter au serveur MongoDB à partir du serveur sur lequel votre application s'exécute. Pour ce faire, le moyen le plus simple consiste à installer mongo shell sur la machine cliente. Sous Linux, vous n'auriez pas besoin d'installer l'intégralité du serveur MongoDB - vous pouvez choisir d'installer uniquement le shell. Une fois le shell disponible, essayez d'utiliser la "syntaxe de ligne de commande" que nous fournissons pour tenter de vous connecter au serveur.
  • Si vous ne parvenez pas à vous connecter via le shell mongo, cela signifie que la machine cliente est incapable d'atteindre le port 27017 des serveurs MongoDB. Examinez les paramètres de votre groupe de sécurité, de votre VPC et/ou de votre pare-feu ScaleGrid pour vous assurer qu'il existe une connectivité entre les ordinateurs client et serveur.
  • Si la connectivité réseau est correcte, la prochaine chose à vérifier est que vous utilisez des versions de MongoDB Driver et .NET Framework compatibles avec la version de votre serveur MongoDB.
  • Si vous avez confirmé que les versions des pilotes sont correctes, essayez d'exécuter un exemple de programme C# en mode débogage, similaire à l'exemple fourni ci-dessus. Une exécution étape par étape aiderait à résoudre le problème.
  • Si vous rencontrez toujours des difficultés pour vous connecter à votre instance, veuillez nous contacter à [email protected] avec les résultats détaillés des étapes de dépannage ci-dessus et avec les versions exactes de C# et du pilote Mongo que vous utilisez.

Si vous débutez avec ScaleGrid et que vous souhaitez essayer ce didacticiel, inscrivez-vous pour un essai gratuit de 30 jours afin d'explorer la plate-forme et de tester la connexion de MongoDB à votre application C# .