---
title: Charmhub | Deploy Certificate Transfer Interface using Charmhub - The Open
  Operator Collection
description: Deploy the latest version of Certificate Transfer Interface on any cloud.
url: https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer
---

# Certificate Transfer Interface

[Canonical Telco](https://charmhub.io/publisher/telco-charmers "View all packages from Canonical Telco")

* [Canonical Telco](https://charmhub.io/publisher/telco-charmers "View all packages from Canonical Telco")

Platform:

22.04

edge 230

```
juju deploy certificate-transfer-interface --channel edge
```

[Learn to deploy on juju >](https://juju.is/docs/juju/manage-applications)

[Toggle side navigation](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#drawer)

## charms.certificate\_transfer\_interface.v1.certificate\_transfer

* [*Docstrings*Docstrings](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer)
  [*Code*Source code](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer/source-code)
* + Download

    Fetch library

    ```
    charmcraft fetch-lib charms.certificate_transfer_interface.v1.certificate_transfer
    ```

    [Download certificate\_transfer.py](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer/download)
  + *Last updated* 10 Dec 2025
  + *Revision* Library version 1.15

Library for the certificate\_transfer relation.

This library contains the Requires and Provides classes for handling the
certificate-transfer interface. It supports both v0 and v1 of the interface.

For requirers, they will set version 1 in their application databag as a hint to
the provider. They will read the databag from the provider first as v1, and fallback
to v0 if the format does not match.

For providers, they will check the version in the requirer's application databag,
and send v1 if that version is set to 1, otherwise it will default to 0 for backwards
compatibility.

##### Getting Started

From a charm directory, fetch the library using `charmcraft`:

```
charmcraft fetch-lib charms.certificate_transfer_interface.v1.certificate_transfer
```

###### Provider charm

The provider charm is the charm providing public certificates to another charm that requires them.

Example:

```
from ops.charm import CharmBase, RelationJoinedEvent
from ops.main import main

from lib.charms.certificate_transfer_interface.v1.certificate_transfer import (
    CertificateTransferProvides,
)

class DummyCertificateTransferProviderCharm(CharmBase):
    def __init__(self, *args):
        super().__init__(*args)
        self.certificate_transfer = CertificateTransferProvides(self, "certificates")
        self.framework.observe(
            self.on.certificates_relation_joined, self._on_certificates_relation_joined
        )

    def _on_certificates_relation_joined(self, event: RelationJoinedEvent):
        certificate = "my certificate"
        self.certificate_transfer.add_certificates(certificate)

if __name__ == "__main__":
    main(DummyCertificateTransferProviderCharm)
```

###### Requirer charm

The requirer charm is the charm requiring certificates from another charm that provides them.

Example:

```
import logging

from ops.charm import CharmBase
from ops.main import main

from lib.charms.certificate_transfer_interface.v1.certificate_transfer import (
    CertificatesAvailableEvent,
    CertificatesRemovedEvent,
    CertificateTransferRequires,
)

class DummyCertificateTransferRequirerCharm(CharmBase):
    def __init__(self, *args):
        super().__init__(*args)
        self.certificate_transfer = CertificateTransferRequires(self, "certificates")
        self.framework.observe(
            self.certificate_transfer.on.certificate_set_updated, self._on_certificates_available
        )
        self.framework.observe(
            self.certificate_transfer.on.certificates_removed, self._on_certificates_removed
        )

    def _on_certificates_available(self, event: CertificatesAvailableEvent):
        logging.info(event.certificates)
        logging.info(event.relation_id)

    def _on_certificates_removed(self, event: CertificatesRemovedEvent):
        logging.info(event.relation_id)

if __name__ == "__main__":
    main(DummyCertificateTransferRequirerCharm)
```

You can integrate both charms by running:

```
juju integrate <certificate_transfer provider charm> <certificate_transfer requirer charm>
```

---

Index

* [class TLSCertificatesError](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#tlscertificateserror)
* [class DataValidationError](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#datavalidationerror)
* [class DatabagModel](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#databagmodel)
* + [def load(
    cls,
    databag)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#databagmodel-load)
* + [def dump(
    self,
    databag,
    clear)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#databagmodel-dump)
* [class ProviderApplicationData](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#providerapplicationdata)
* [class ProviderUnitDataV0](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#providerunitdatav0)
* [class RequirerApplicationData](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#requirerapplicationdata)
* [class CertificateTransferProvides](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferprovides)
* + [def \_\_init\_\_(
    self,
    charm,
    relationship\_name)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferprovides-__init__)
* + [def add\_certificates(
    self,
    certificates,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferprovides-add_certificates)
* + [def remove\_all\_certificates(
    self,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferprovides-remove_all_certificates)
* + [def remove\_certificate(
    self,
    certificate,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferprovides-remove_certificate)
* [class CertificatesAvailableEvent](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesavailableevent)
* + [def \_\_init\_\_(
    self,
    handle,
    certificates,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesavailableevent-__init__)
* + [def snapshot(
    self)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesavailableevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesavailableevent-restore)
* [class CertificatesRemovedEvent](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesremovedevent)
* + [def \_\_init\_\_(
    self,
    handle,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesremovedevent-__init__)
* + [def snapshot(
    self)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesremovedevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatesremovedevent-restore)
* [class CertificateTransferRequirerCharmEvents](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferrequirercharmevents)
* [class CertificateTransferRequires](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferrequires)
* + [def \_\_init\_\_(
    self,
    charm,
    relationship\_name)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferrequires-__init__)
* + [def get\_all\_certificates(
    self,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferrequires-get_all_certificates)
* + [def get\_all\_certificates\_by\_relation(
    self,
    relation\_id)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferrequires-get_all_certificates_by_relation)
* + [def is\_ready(
    self,
    relation)](https://charmhub.io/certificate-transfer-interface/libraries/certificate_transfer#certificatetransferrequires-is_ready)

#### class TLSCertificatesError

Description

Base class for custom errors raised by this library. None

#### class DataValidationError

Description

Raised when data validation fails. None

#### class DatabagModel

Base databag model.

Description

Supports both pydantic v1 and v2.

Methods

DatabagModel.
load(

cls

,
databag: MutableMapping
)

Description

Load this model from a Juju databag. None

DatabagModel.
dump(

*self*

,
databag

,
clear: bool
)

Write the contents of this model to Juju databag.

Arguments

databag

The databag to write to.

clear

Whether to clear the databag before writing.

Returns

MutableMapping

The databag.

#### class ProviderApplicationData

Description

Provider App databag model. None

#### class ProviderUnitDataV0

Description

Provider Unit databag v0 model. None

#### class RequirerApplicationData

Description

Requirer App databag model. None

#### class CertificateTransferProvides

Description

Certificate Transfer provider class to be instantiated by charms sending certificates. None

Methods

CertificateTransferProvides.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relationship\_name: str
)

CertificateTransferProvides.
add\_certificates(

*self*

,
certificates

,
relation\_id
)

Add certificates from a set to relation data.

Arguments

certificates
(Set[str])

A set of certificate strings in PEM format

relation\_id
(int)

Juju relation ID

Returns

None

Description

Adds certificate to all relations if relation\_id is not provided.

CertificateTransferProvides.
remove\_all\_certificates(

*self*

,
relation\_id
)

Remove all certificates from relation data.

Arguments

relation\_id
(int)

Relation ID

Returns

None

Description

Removes all certificates from all relations if relation\_id not given

CertificateTransferProvides.
remove\_certificate(

*self*

,
certificate: str

,
relation\_id
)

Remove a given certificate from relation data.

Arguments

certificate
(str)

Certificate in PEM format that's in the list

relation\_id
(int)

Relation ID

Returns

None

Description

Removes certificate from all relations if relation\_id not given

#### class CertificatesAvailableEvent

Description

Charm Event triggered when the set of provided certificates is updated. None

Methods

CertificatesAvailableEvent.
\_\_init\_\_(

*self*

,
handle: Handle

,
certificates

,
relation\_id: int
)

CertificatesAvailableEvent.
snapshot(

*self*
)

Description

Return snapshot. None

CertificatesAvailableEvent.
restore(

*self*

,
snapshot: dict
)

Description

Restores snapshot. None

#### class CertificatesRemovedEvent

Description

Charm Event triggered when the set of provided certificates is removed. None

Methods

CertificatesRemovedEvent.
\_\_init\_\_(

*self*

,
handle: Handle

,
relation\_id: int
)

CertificatesRemovedEvent.
snapshot(

*self*
)

Description

Return snapshot. None

CertificatesRemovedEvent.
restore(

*self*

,
snapshot: dict
)

Description

Restores snapshot. None

#### class CertificateTransferRequirerCharmEvents

Description

List of events that the Certificate Transfer requirer charm can leverage. None

#### class CertificateTransferRequires

Description

Certificate transfer requirer class to be instantiated by charms expecting certificates. None

Methods

CertificateTransferRequires.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relationship\_name: str
)

Observe events related to the relation.

Arguments

charm

Charm object

relationship\_name

Juju relation name

CertificateTransferRequires.
get\_all\_certificates(

*self*

,
relation\_id
)

Get transferred certificates.

Arguments

relation\_id

The id of the relation to get the certificates from.

Description

If no relation id is given, certificates from all relations will be
provided in a concatenated list.

CertificateTransferRequires.
get\_all\_certificates\_by\_relation(

*self*

,
relation\_id
)

Get a deterministic list of certificates grouped by relation.

Arguments

relation\_id

If provided, only certificates for this relation are returned.

Returns

Dict where keys are relation IDs and values are ordered lists of PEMs.

Description

* Grouped by relation\_id.
* The list order is sorted lexicographically by PEM content.

CertificateTransferRequires.
is\_ready(

*self*

,
relation: Relation
)

Description

Check if the relation is ready by checking that it has valid relation data. None
