예제 #1
0
    def commande_restaurer_backup_cle(self):
        with open ('/home/mathieu/mgdev/certs/pki.connecteur.key', 'rb') as fichier:
            key_bytes = fichier.read()

        clecert = EnveloppeCleCert()
        clecert.key_from_pem_bytes(key_bytes, None)
        clecert.password = self.mot_de_passe.encode('utf-8')
        key_chiffree_bytes = clecert.private_key_bytes

        self.cert_maitredescles_recu.wait(5)
        mot_de_passe_chiffre, fingerprint = self.certificat_maitredescles.chiffrage_asymmetrique(self.mot_de_passe.encode('utf-8'))

        enveloppe = EnveloppeCleCert()
        enveloppe.key_from_pem_bytes(key_bytes, None)

        requete_cle_racine = {
            'cle_privee': key_chiffree_bytes.decode('utf-8'),
            'mot_de_passe_chiffre': str(b64encode(mot_de_passe_chiffre), 'utf-8'),
            # 'fingerprint_base64': 'Ut/UQ5aKomoGzXB7mpUduPk4Xzg=',
        }
        enveloppe_requete = self.generateur.transmettre_commande(
            requete_cle_racine,
            'commande.millegrilles.domaines.MaitreDesCles.%s' % ConstantesMaitreDesCles.COMMANDE_RESTAURER_BACKUP_CLES,
            correlation_id='abcd-1234',
            reply_to=self.queue_name
        )

        print("Envoi requete: %s" % enveloppe_requete)
        return enveloppe_requete
    def charger_certificats(self):
        secret_path = path.abspath(self.secret_path)
        os.makedirs(secret_path, exist_ok=True)  # Creer path secret, au besoin

        # Charger information certificat intermediaire
        cert_pem = self._charger_certificat_docker('pki.intermediaire.cert')
        with open(path.join(secret_path, 'pki.intermediaire.key.pem'),
                  'rb') as fichiers:
            key_pem = fichiers.read()
        with open(path.join(secret_path, 'pki.intermediaire.passwd.txt'),
                  'rb') as fichiers:
            passwd_bytes = fichiers.read()

        clecert_intermediaire = EnveloppeCleCert()
        clecert_intermediaire.from_pem_bytes(key_pem, cert_pem, passwd_bytes)
        clecert_intermediaire.password = None  # Effacer mot de passe
        self._clecert_intermediaire = clecert_intermediaire

        # Charger information certificat monitor
        cert_pem = self._charger_certificat_docker('pki.monitor.cert')
        with open(path.join(secret_path, 'pki.monitor.key.pem'),
                  'rb') as fichiers:
            key_pem = fichiers.read()
        clecert_monitor = EnveloppeCleCert()
        clecert_monitor.from_pem_bytes(key_pem, cert_pem)
        self.clecert_monitor = clecert_monitor

        # Conserver reference au cert monitor pour middleware
        self.certificats[
            GestionnaireCertificats.
            MONITOR_CERT_PATH] = self.certificats['pki.monitor.cert']
        self.certificats[
            GestionnaireCertificats.MONITOR_KEY_FILE] = 'pki.monitor.key.pem'

        # with open(path.join(secret_path, ConstantesServiceMonitor.FICHIER_MONGO_MOTDEPASSE), 'r') as fichiers:
        #     self._passwd_mongo = fichiers.read()
        # with open(path.join(secret_path, ConstantesServiceMonitor.FICHIER_MQ_MOTDEPASSE), 'r') as fichiers:
        #     self._passwd_mq = fichiers.read()

        # Charger le certificat de millegrille, chaine pour intermediaire
        self._charger_certificat_docker('pki.intermediaire.chain')
        self._charger_certificat_docker('pki.millegrille.cert')

        self.__charger_renouvelleur()
    def recevoir_trousseau(self, trousseaux: dict):
        for trousseau in trousseaux:
            idmg = trousseau[Constantes.CONFIG_IDMG]
            configuration = self._millegrilles[idmg]
            configuration[
                ConstantesHebergement.CORRELATION_TROUSSEAU_MODULE] = trousseau

            # Extraire cle-cert du trousseau
            certificat_pem = trousseau[Constantes.ConstantesSecurityPki.
                                       LIBELLE_CERTIFICAT_PEM].encode('utf-8')
            cle_pem = trousseau['cle'].encode('utf-8')
            motdepasse_chiffre = trousseau['motdepasse_chiffre']

            # Dechiffrer mot de passe, charger cle privee et certificat
            signateur = self.contexte.signateur_transactions
            motdepasse = signateur.dechiffrage_asymmetrique(
                motdepasse_chiffre.encode('utf-8'))

            clecert = EnveloppeCleCert()
            clecert.from_pem_bytes(cle_pem, certificat_pem, motdepasse)
            clecert.password = None

            configuration['clecert'] = clecert

            certificats = trousseau['certificats']

            # Au besoin, charger cle et passwd intermediaire (pour maitre des cles)
            intermediaire_passwd_chiffre = trousseau.get(
                'intermediaire_passwd')
            intermediaire_cle = trousseau.get('intermediaire_cle')
            intermediaire_cert = certificats['intermediaire']
            if intermediaire_passwd_chiffre and intermediaire_cle:
                intermediaire_passwd = signateur.dechiffrage_asymmetrique(
                    intermediaire_passwd_chiffre.encode('utf-8'))

                # Verifier que la cle fonctionne
                clecert_intermediaire = EnveloppeCleCert()
                clecert_intermediaire.from_pem_bytes(
                    intermediaire_cle.encode('utf-8'),
                    intermediaire_cert.encode('utf-8'), intermediaire_passwd)
                clecert_intermediaire.password = None

                configuration['intermediaire_clecert'] = clecert_intermediaire

            # Charger la chaine de certificats pour se connecter a l'hote
            certificat_pem_str = str(certificat_pem, 'utf-8')
            chaine_hote = [
                certificat_pem_str,
                certificats['hebergement'],
                certificats['hote_pem'],
            ]
            chaine_cert = [
                certificat_pem_str,
                intermediaire_cert,
            ]

            configuration['chaine_hote'] = chaine_hote
            configuration['chaine_cert'] = chaine_cert
            configuration['millegrille'] = certificats['millegrille']
            configuration['cle'] = str(clecert.private_key_bytes, 'utf-8')

            self.ajouter_compte(idmg, chaine_hote)