Odoo Mindscape. Understand Odoo faster. Explore modules, fields, dependencies and version differences in one place instead of digging through the source code.

Module: Certificate

Entity: certificate.certificate

Compute Method: _compute_private_key

Inputs Method Outputs
attachments = self.env['ir.attachment'].search([
            ('res_model', '=', 'certificate.key'),
            ('res_field', '=', 'content'),
            ('res_id', 'in', self.private_key_id.ids),
        ])
content_to_key_id = {(att.raw.content, att.company_id.id): att.res_id for att in attachments}
for certificate in self:
            if not certificate.pem_certificate:
                certificate.private_key_id = None
                continue

            content = certificate.content.content
            key_password = certificate.pkcs12_password.encode('utf-8') if certificate.pkcs12_password else None
            key = None

            # Create the private key if using PKCS12 or PEM files and no private key is set
            if certificate.content_format == 'pkcs12':
                with suppress(ValueError, TypeError, UnsupportedAlgorithm):
                    key, _cert, _additional_certs = pkcs12.load_key_and_certificates(content, key_password)
            elif certificate.content_format == 'pem':
                with suppress(ValueError, TypeError, UnsupportedAlgorithm):
                    key = serialization.load_pem_private_key(content, password=key_password)

            if key:
                pem_key = key.private_bytes(
                    encoding=Encoding.PEM,
                    format=serialization.PrivateFormat.PKCS8,
                    encryption_algorithm=serialization.NoEncryption()
                )
                key_id = content_to_key_id.get((pem_key, certificate.company_id.id))
                if not key_id:
                    key_id = self.env['certificate.key'].create({
                        'name': (certificate.subject_common_name or certificate.name or "") + ".key",
                        'content': BinaryBytes(pem_key),
                        'company_id': certificate.company_id.id,
                    })
                certificate.private_key_id = key_id

Back to entity