# Gufo ACME
*Gufo ACME is a Python asyncio client for the ACME protocol.*
[![PyPi version](https://img.shields.io/pypi/v/gufo_acme.svg)](https://pypi.python.org/pypi/gufo_acme/)
![Python Versions](https://img.shields.io/pypi/pyversions/gufo_acme)
[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
![Build](https://img.shields.io/github/actions/workflow/status/gufolabs/gufo_acme/py-tests.yml?branch=master)
![Sponsors](https://img.shields.io/github/sponsors/gufolabs)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v0.json)](https://github.com/charliermarsh/ruff)
---
**Documentation**: [https://docs.gufolabs.com/gufo_acme/](https://docs.gufolabs.com/gufo_acme/)
**Source Code**: [https://github.com/gufolabs/gufo_acme/](https://github.com/gufolabs/gufo_acme/)
---
The Automatic Certificate Management Environment (ACME) protocol defines a method
for automated certificate signing, now widely used by services
such as Let's Encrypt. Gufo ACME is a Python asyncio ACME client library that
simplifies the protocol complexity with a straightforward and robust API.
Gufo ACME contains various clients which can be applied to your tasks:
* AcmeClient - base client to implement any fulfillment functionality
by creating subclasses.
* DavAcmeClient - http-01 fulfillment using WebDAV methods.
* PowerDnsAcmeClient - dns-01 PowerDNS fulfillment.
* WebAcmeClient - http-01 static file fulfillment.
## Supported Certificate Authorities
* [Letsencrypt](https://letsencrypt.org/)
* [ZeroSSL](https://zerossl.com/)
* Google Public CA
* Any [RFC-8555](https://tools.ietf.org/html/rfc8555) compatible CA.
## Examples
### Account Creation
Create an account and store state to the file.
``` python
client_key = AcmeClient.get_key()
async with AcmeClient(DIRECTORY, key=client_key) as client:
await client.new_account(email)
state = client.get_state()
with open(client_state_path, "wb") as fp:
fp.write(state)
```
### Private Key Generation
To generate a private key in PEM format.
``` python
private_key = AcmeClient.get_domain_private_key()
```
### Generate CSR
To generate a certificate signing request.
``` python
csr = AcmeClient.get_domain_csr(domain, private_key)
```
### Sign Certificate
Sign the certificate using `http-01` challenge:
``` python
CHALLENGE_DIR = "/www/acme/"
class SignAcmeClient(AcmeClient):
async def fulfill_http_01(
self, domain: str, challenge: AcmeChallenge
) -> bool:
v = self.get_key_authorization(challenge)
with open(os.path.join(CHALLENGE_DIR, challenge.token), "wb") as fp:
fp.write(v)
return True
async def clear_http_01(
self: AcmeClient, domain: str, challenge: AcmeChallenge
) -> None:
os.unlink(os.path.join(CHALLENGE_DIR, challenge.token))
...
async with SignAcmeClient.from_state(state) as client:
cert = await client.sign(domain, csr)
```
## Virtues
* Pure-Python implementation.
* Asynchronous.
* Fully typed.
* Clean API.
* Robust well-tested code.
* Batteries included.
* 99%+ test coverage.
## On Gufo Stack
This product is a part of [Gufo Stack][Gufo Stack] - the collaborative effort
led by [Gufo Labs][Gufo Labs]. Our goal is to create a robust and flexible
set of tools to create network management software and automate
routine administration tasks.
To do this, we extract the key technologies that have proven themselves
in the [NOC][NOC] and bring them as separate packages. Then we work on API,
performance tuning, documentation, and testing. The [NOC][NOC] uses the final result
as the external dependencies.
[Gufo Stack][Gufo Stack] makes the [NOC][NOC] better, and this is our primary task. But other products
can benefit from [Gufo Stack][Gufo Stack] too. So we believe that our effort will make
the other network management products better.
[Gufo Labs]: https://gufolabs.com/
[Gufo Stack]: https://gufolabs.com/products/gufo-stack/
[NOC]: https://getnoc.com/
Raw data
{
"_id": null,
"home_page": "",
"name": "gufo-acme",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "ACME,Automatic Certificate Management Environment,RFC8555",
"author": "Gufo Labs",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/f8/eb/c6b0fe850e31a86a09888557e06115028bcc69a92ef63f50fdd65cb32e57/gufo_acme-0.4.0.tar.gz",
"platform": null,
"description": "# Gufo ACME\n\n*Gufo ACME is a Python asyncio client for the ACME protocol.*\n\n[![PyPi version](https://img.shields.io/pypi/v/gufo_acme.svg)](https://pypi.python.org/pypi/gufo_acme/)\n![Python Versions](https://img.shields.io/pypi/pyversions/gufo_acme)\n[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)\n![Build](https://img.shields.io/github/actions/workflow/status/gufolabs/gufo_acme/py-tests.yml?branch=master)\n![Sponsors](https://img.shields.io/github/sponsors/gufolabs)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v0.json)](https://github.com/charliermarsh/ruff)\n---\n\n**Documentation**: [https://docs.gufolabs.com/gufo_acme/](https://docs.gufolabs.com/gufo_acme/)\n\n**Source Code**: [https://github.com/gufolabs/gufo_acme/](https://github.com/gufolabs/gufo_acme/)\n\n---\n\nThe Automatic Certificate Management Environment (ACME) protocol defines a method\nfor automated certificate signing, now widely used by services\nsuch as Let's Encrypt. Gufo ACME is a Python asyncio ACME client library that\nsimplifies the protocol complexity with a straightforward and robust API.\n\nGufo ACME contains various clients which can be applied to your tasks:\n\n* AcmeClient - base client to implement any fulfillment functionality\n by creating subclasses.\n* DavAcmeClient - http-01 fulfillment using WebDAV methods.\n* PowerDnsAcmeClient - dns-01 PowerDNS fulfillment.\n* WebAcmeClient - http-01 static file fulfillment.\n\n## Supported Certificate Authorities\n\n* [Letsencrypt](https://letsencrypt.org/)\n* [ZeroSSL](https://zerossl.com/)\n* Google Public CA\n* Any [RFC-8555](https://tools.ietf.org/html/rfc8555) compatible CA.\n\n## Examples\n\n### Account Creation\n\nCreate an account and store state to the file.\n``` python\nclient_key = AcmeClient.get_key()\nasync with AcmeClient(DIRECTORY, key=client_key) as client:\n await client.new_account(email)\n state = client.get_state()\nwith open(client_state_path, \"wb\") as fp:\n fp.write(state)\n```\n\n### Private Key Generation\n\nTo generate a private key in PEM format.\n``` python\nprivate_key = AcmeClient.get_domain_private_key()\n```\n\n### Generate CSR\n\nTo generate a certificate signing request.\n``` python\ncsr = AcmeClient.get_domain_csr(domain, private_key)\n```\n\n### Sign Certificate\n\nSign the certificate using `http-01` challenge:\n\n``` python\nCHALLENGE_DIR = \"/www/acme/\"\n\n\nclass SignAcmeClient(AcmeClient):\n async def fulfill_http_01(\n self, domain: str, challenge: AcmeChallenge\n ) -> bool:\n v = self.get_key_authorization(challenge)\n with open(os.path.join(CHALLENGE_DIR, challenge.token), \"wb\") as fp:\n fp.write(v)\n return True\n\n async def clear_http_01(\n self: AcmeClient, domain: str, challenge: AcmeChallenge\n ) -> None:\n os.unlink(os.path.join(CHALLENGE_DIR, challenge.token))\n\n ...\nasync with SignAcmeClient.from_state(state) as client:\n cert = await client.sign(domain, csr)\n```\n\n## Virtues\n\n* Pure-Python implementation.\n* Asynchronous.\n* Fully typed.\n* Clean API.\n* Robust well-tested code.\n* Batteries included.\n* 99%+ test coverage.\n\n## On Gufo Stack\n\nThis product is a part of [Gufo Stack][Gufo Stack] - the collaborative effort \nled by [Gufo Labs][Gufo Labs]. Our goal is to create a robust and flexible \nset of tools to create network management software and automate \nroutine administration tasks.\n\nTo do this, we extract the key technologies that have proven themselves \nin the [NOC][NOC] and bring them as separate packages. Then we work on API,\nperformance tuning, documentation, and testing. The [NOC][NOC] uses the final result\nas the external dependencies.\n\n[Gufo Stack][Gufo Stack] makes the [NOC][NOC] better, and this is our primary task. But other products\ncan benefit from [Gufo Stack][Gufo Stack] too. So we believe that our effort will make \nthe other network management products better.\n\n[Gufo Labs]: https://gufolabs.com/\n[Gufo Stack]: https://gufolabs.com/products/gufo-stack/\n[NOC]: https://getnoc.com/\n",
"bugtrack_url": null,
"license": "BSD 3-Clause License",
"summary": "",
"version": "0.4.0",
"project_urls": {
"Bug Tracker": "https://github.com/gufolabs/gufo_acme/issues",
"Changelog": "https://github.com/gufolabs/gufo_acme/blob/master/CHANGELOG.md",
"Documentation": "https://docs.gufolabs.com/gufp_acme/",
"Homepage": "https://github.com/gufolabs/gufo_acme/",
"Source Code": "https://github.com/gufolabs/gufo_acme/"
},
"split_keywords": [
"acme",
"automatic certificate management environment",
"rfc8555"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "d5eddd57a95ea6324493525993b9d10e3370cbfb136b881100ee4e8df31cea1e",
"md5": "715d1d504d8904b5f24cc5e559750520",
"sha256": "028d32922b9fbb467677bb24b3de3369de96e72edfdcd076fa12aebf846f97d3"
},
"downloads": -1,
"filename": "gufo_acme-0.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "715d1d504d8904b5f24cc5e559750520",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 19978,
"upload_time": "2023-11-23T13:45:08",
"upload_time_iso_8601": "2023-11-23T13:45:08.255041Z",
"url": "https://files.pythonhosted.org/packages/d5/ed/dd57a95ea6324493525993b9d10e3370cbfb136b881100ee4e8df31cea1e/gufo_acme-0.4.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f8ebc6b0fe850e31a86a09888557e06115028bcc69a92ef63f50fdd65cb32e57",
"md5": "22508a68e6312ad3545fe41c05d11413",
"sha256": "f96969f58f9a3cb0c7ac101bc3d8ded547c44bd73c512e9bad0ba7089b6b4bc9"
},
"downloads": -1,
"filename": "gufo_acme-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "22508a68e6312ad3545fe41c05d11413",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 21851,
"upload_time": "2023-11-23T13:45:18",
"upload_time_iso_8601": "2023-11-23T13:45:18.357682Z",
"url": "https://files.pythonhosted.org/packages/f8/eb/c6b0fe850e31a86a09888557e06115028bcc69a92ef63f50fdd65cb32e57/gufo_acme-0.4.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-11-23 13:45:18",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "gufolabs",
"github_project": "gufo_acme",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "gufo-acme"
}