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 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
        self._charger_certificat_docker('pki.millegrille.cert')
예제 #2
0
class EnvCert:
    def __init__(self):
        self._logger = logging.getLogger('%s.%s' %
                                         (__name__, self.__class__.__name__))

        self.dict_ca = dict()
        self.cle_millegrille = EnveloppeCleCert()  # EnveloppeCleCert
        self.ca_autorite = EnveloppeCleCert()  # EnveloppeCleCert
        self.renouvelleur = None

    def charger(self):
        with open('/home/mathieu/mgdev/certs/pki.ca.root.cert', 'rb') as f:
            ca_cert = f.read()
            self.ca_autorite.cert_from_pem_bytes(ca_cert)

        with open('/home/mathieu/mgdev/certs/pki.ca.passwords', 'r') as f:
            passwords = json.load(f)

        with open('/home/mathieu/mgdev/certs/pki.ca.millegrille.cert',
                  'rb') as f:
            mg_cert = f.read()
        with open('/home/mathieu/mgdev/certs/pki.ca.millegrille.key',
                  'rb') as f:
            mg_key = f.read()

        self.cle_millegrille.from_pem_bytes(
            mg_key, mg_cert, passwords['pki.ca.millegrille'].encode('utf-8'))

        self.charger_ca_chaine()
        self.renouvelleur = RenouvelleurCertificat('testMG', self.dict_ca,
                                                   self.cle_millegrille,
                                                   self.ca_autorite)

    def charger_ca_chaine(self):
        self.dict_ca = dict()

        ca_chain_file = '/home/mathieu/mgdev/certs/pki.ca.millegrille.fullchain'
        with open(ca_chain_file, 'r') as fichier:
            chaine = fichier.read()
            certs = chaine.split('-----END CERTIFICATE-----')
            for cert in certs[0:-1]:
                cert = '%s-----END CERTIFICATE-----\n' % cert
                self._logger.warning("Loading CA cert :\n%s" % cert)
                cert = cert.encode('utf-8')
                x509_cert = x509.load_pem_x509_certificate(
                    cert, backend=default_backend())
                skid = EnveloppeCleCert.get_subject_identifier(x509_cert)
                self.dict_ca[skid] = x509_cert
    def charger_certificats(self):
        secret_path = path.abspath(self.secret_path)

        # Charger mots de passes middleware
        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 information certificat monitor
        clecert_monitor = EnveloppeCleCert()
        with open(path.join(secret_path, 'pki.monitor_dependant.key.pem'),
                  'rb') as fichiers:
            key_pem = fichiers.read()
        try:
            cert_pem = self._charger_certificat_docker(
                'pki.monitor_dependant.cert')
            clecert_monitor.from_pem_bytes(key_pem, cert_pem)

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

        except AttributeError:
            self.__logger.info(
                "Certificat monitor_dependant non trouve, on va l'attendre")
            clecert_monitor.key_from_pem_bytes(key_pem)

        self.clecert_monitor = clecert_monitor

        # Charger le certificat de millegrille, chaine pour intermediaire
        self._charger_certificat_docker('pki.millegrille.cert')
    def __init__(self):
        self.idmg = 'JPtGcNcFSkfSdw49YsDpQHKxqTHMitpbPZW17a2JC54T'

        self.chaine_pem = [
            """
-----BEGIN CERTIFICATE-----
MIIDfTCCAmWgAwIBAgIJYGYjdUZ4mWUAMA0GCSqGSIb3DQEBDQUAMCcxDzANBgNV
BAMTBlJhY2luZTEUMBIGA1UEChMLTWlsbGVHcmlsbGUwHhcNMjAwODE0MTMzNTAw
WhcNMjMwODE3MTMzNTAwWjB9MS0wKwYDVQQDEyRmMDNhYTQyNi04Mjc5LTQyMDYt
YWYyYy0wNjA5N2IyMmY2MTYxFTATBgNVBAsTDE5vZXVkUHJvdGVnZTE1MDMGA1UE
ChMsSlB0R2NOY0ZTa2ZTZHc0OVlzRHBRSEt4cVRITWl0cGJQWlcxN2EySkM1NFQw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbi6hszfap+SF2vPoJx/1t
1k4AZNUWpxpD7zTVw9gjl8re2hHjDne99w4r3bPOyDUjh6A4hWC77bQ/yTa/UQPO
LVHdU3DcbjshxCYv/TebwikEct4EoYjxQZgt6ov4rhhyyEqPK1UFvHsNkjZWH1qM
ocoHA2IeeDZqhi9mRGeKsZ7vPOYI/9RN3lQMEYUqIQI0Tx+rVEXIGT7g6WSuKwN2
O9Q1Ktqb7z6w491UkPTxukM2DkZCglSRXEnfw8Psc2c6yN1TKHgsGzf299d3zkF2
c0ZtI8rqQ9tebX1zZCyYOLZrZXWP73kr89Qnp0b3d78vB2uEHW1ioPhNstRcIQPf
AgMBAAGjVjBUMBIGA1UdEwEB/wQIMAYBAf8CAQQwHQYDVR0OBBYEFAAvK7SYudlb
e3wdxyjBcEQz/6uFMB8GA1UdIwQYMBaAFLBXLIVvPd0v2/PRpsXEhxv3SitkMA0G
CSqGSIb3DQEBDQUAA4IBAQBNR6bWpOLfEL/ERZsuCzX04YchFy7gNuCSphzhFpGx
V3gApShKPKja94V2FmcvbHqmiCnU2SK5/q7YB9X7RElYJRktl50DIUw3puKfaYS0
965K4ZIyuhA452G+OdgrvJzE29E6op19z1SAKvzqhk3e/SFrEmrsKisGAA2HGL8Q
E+cGvtDYc/b4YE0YmK4b6+PyGSF+2HDr9D9lEsavn5tJaWLjBiGp2BTKagShOpNX
VPk6OgYoAWz9RULV/jMSVrC/fm8cogmWT0TJ2NFR305iI9bv7zHKtQ7p/MjxNQN2
wh0FLaiqSb+Dd+LZiMlWm7tF2Z5vuqC1EMdbjTYVBU23
-----END CERTIFICATE-----
            """, """
-----BEGIN CERTIFICATE-----
MIIDKDCCAhCgAwIBAgIKAol2BgZkgwIwADANBgkqhkiG9w0BAQ0FADAnMQ8wDQYD
VQQDEwZSYWNpbmUxFDASBgNVBAoTC01pbGxlR3JpbGxlMB4XDTIwMDgwNTE3MTky
NVoXDTIxMDgwNTE3MTkyNVowJzEPMA0GA1UEAxMGUmFjaW5lMRQwEgYDVQQKEwtN
aWxsZUdyaWxsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKHD5H6t
svTC1rkQ0jDq51/5ht72LroSubFIM6SGd4PeofKGk2LCLce8IGC9zz08lXa8WMkr
I9yAxf3P0WK2UEZFXsvGJ0EvBXyewZDEX+Lfp12zyBuKGRK5rjUYFCdbEiO+qVCq
Pvqb4VU4ffbAFvuWRulSfvD5udC2PY1xRxNQytAnbs3jRJSzcFiGDk50bwG5JD/i
TZwtnm6OQYcxnckNZgzz8G34wZEAwz1f5a941nV+Tnnod+7t6kdkLFenMUtVPrd8
hVwHzitBUkBP8OsTvS/AGvyMrz/1XT1+MxwShq8o8S2fp7YGdR8eeb1uUfJLzLu8
rGB5vMOoiiGOkNkCAwEAAaNWMFQwEgYDVR0TAQH/BAgwBgEB/wIBBTAdBgNVHQ4E
FgQUsFcshW893S/b89GmxcSHG/dKK2QwHwYDVR0jBBgwFoAUsFcshW893S/b89Gm
xcSHG/dKK2QwDQYJKoZIhvcNAQENBQADggEBAKD7W6UKrnPpIXzrFVXs0EOYZi1u
IUEOBA0yoJyUQuLcyb+nNCUf9FPjyh1xGrtHLgMwNuIj3EqB3AvzZs+t9kyJ+aun
RaGxOSd6ytQzRW4LcpUNeBs0oCkTftlXGZRBU/ZgaMNQvk7b1R5MaBOtBnUkDsRA
/+bdPl2gpOCUFdNK53805Z8cgV0QXQKNPgM06EVT1URWsy9Z3O6BA57Xq3kEZOtJ
oJMuyy7g7/iRiAfXsys7ZoDgPET8SL3R0UbvUTXXI5jM2+jchBqucI6YSEjJmgBQ
TNQc8kgLqRI+hI8Ri62/ZsEeUmyn5VOrq+oPOsFc1wBS8ErdxXLln77cEEk=
-----END CERTIFICATE-----
            """
        ]
        self.cle_pem = """
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA24uobM32qfkhdrz6Ccf9bdZOAGTVFqcaQ+801cPYI5fK3toR
4w53vfcOK92zzsg1I4egOIVgu+20P8k2v1EDzi1R3VNw3G47IcQmL/03m8IpBHLe
BKGI8UGYLeqL+K4YcshKjytVBbx7DZI2Vh9ajKHKBwNiHng2aoYvZkRnirGe7zzm
CP/UTd5UDBGFKiECNE8fq1RFyBk+4OlkrisDdjvUNSram+8+sOPdVJD08bpDNg5G
QoJUkVxJ38PD7HNnOsjdUyh4LBs39vfXd85BdnNGbSPK6kPbXm19c2QsmDi2a2V1
j+95K/PUJ6dG93e/LwdrhB1tYqD4TbLUXCED3wIDAQABAoIBAQCPCvN10MxB+rw+
7OnMra0Ff3fa8deUptOKJ7S5Ap00s5XOlS7KTYbfErT9B7o7pF5bA+b0bJKWX03t
sWAmTta34vdPySnjtT55xZ9L7SPqLBslduIJCmZ7Kk3IvOTt5iCvyKgrmAQRdLiI
IxecDVml/1PuNdocGB78UOlZLIB58AM9m3zHE0I4UDBL1Uo7q+GagklisDKkYjzU
Blxr8lkvisJniPHkOJj4DRGpXG9bJAoTTwya6tISpMNQRtOPu4lN7CzkK9CXvM/a
l8Eu9rYVzg7m3Q0jdvwiNZWEIFMLuDEi0ijWcEPurH/wV0LMIVQFe1LA7swg8BjC
PjiRExDhAoGBAPrXchrGJUAt1mx2nb9a4OJ2YRlpBkN0pPB0rsBg1AUf4raTTcwb
5S2sDqkn0zwVA3aWhWFkzTJgBlC6Ykn1xsa2VSGP1JchxAl6EgKiWxSHNkaiiBM2
Fo8jjRscMb8T0sjgDEjlmvrERDGSrJtmEPQjGTcDlsOZDlFphls3eQZ1AoGBAOAP
dE2hxX3G8zSD+/90a7bbhfhqfOJta7a6Sv6NwshR9bnI1kLqjJbg32jY15HSvdGL
Em1U5duI/oy+lZCQBBSaGSnPmhFRPqa1o8nPYh5Zz2aLroTWIjiIweGx4hJQ8F3a
wSjG3HQNLZ3y0ppH+FvH2gLuZh1CPsd95lXMjR6DAoGAKh8VhRNy2+UWlZ4RfTmI
e96/DWJKb/ddXxdo5Nsdn0KsclYoATdJ87Jpv9P1L6ijrT03ZpRjtKrVRKcXrC2+
VE3326voWfyMi77Y2WJkAv11isTuLrOtdBnXLw8790cf5SViSrdrn+JnRR/JJkss
W6KtMETFA1FnSxp6OkUFaKUCf37oQfe2qSWUiiw0lYcbaecob7lEl3eogln9Kn0D
zk+oHIYeOz2rm/XZaLD6IR93PgxxuP40F/1Amu0dBZnb+HOy1I3aCGnGmrXSK/Mi
g3CtbcunUjHrF3bt/uLW3jWBoqOGQ+HUwQj6bdwIrUC1gvZ5PAJtBWmNHAHiTZRL
R6MCgYEA6Tr6PMVlKw60m05y1S5zv6FGuUjZrepdKc1gw1U+LG3YztoykF6g+cK4
a3CFRrd9Rbz08P9l2kXM8YWaZVxH38MbOcoVhP7Al3N4ntV+y+dKW3y8IdGYcFRv
PZgCLivK4AyUNpjfeOyrmio+GqiRKt6aVCA4Ht5Az8c5j1atiZM=
-----END RSA PRIVATE KEY-----
        """

        clecert_millegrille = EnveloppeCleCert()
        clecert_millegrille.cert_from_pem_bytes(
            self.chaine_pem[1].encode('utf-8'))

        clecert_inter = EnveloppeCleCert()
        clecert_inter.from_pem_bytes(self.cle_pem.encode('utf-8'),
                                     self.chaine_pem[0].encode('utf-8'))

        dict_ca = {
            clecert_millegrille.fingerprint: clecert_millegrille,
            clecert_inter.fingerprint: clecert_inter
        }

        self.renouvelleur = RenouvelleurCertificat(self.idmg, dict_ca,
                                                   clecert_inter,
                                                   clecert_millegrille)
    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)