{"id":20358353,"url":"https://github.com/webprofusion/anvil","last_synced_at":"2025-08-23T01:34:50.525Z","repository":{"id":39714394,"uuid":"310510337","full_name":"webprofusion/anvil","owner":"webprofusion","description":"A client implementation for the Automated Certificate Management Environment (ACME) protocol","archived":false,"fork":false,"pushed_at":"2025-07-11T09:22:29.000Z","size":1821,"stargazers_count":33,"open_issues_count":1,"forks_count":8,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-08-01T01:34:38.041Z","etag":null,"topics":["acme","dotnet"],"latest_commit_sha":null,"homepage":"https://certifytheweb.com","language":"C#","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"fszlin/certes","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webprofusion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-11-06T06:23:17.000Z","updated_at":"2025-07-11T09:22:32.000Z","dependencies_parsed_at":"2024-04-30T07:39:17.719Z","dependency_job_id":"7baaa7f7-d3bf-415d-80a7-5f3c121078fe","html_url":"https://github.com/webprofusion/anvil","commit_stats":null,"previous_names":["webprofusion/certes"],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/webprofusion/anvil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webprofusion%2Fanvil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webprofusion%2Fanvil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webprofusion%2Fanvil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webprofusion%2Fanvil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webprofusion","download_url":"https://codeload.github.com/webprofusion/anvil/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webprofusion%2Fanvil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271730085,"owners_count":24811030,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-22T02:00:08.480Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acme","dotnet"],"created_at":"2024-11-14T23:26:35.203Z","updated_at":"2025-08-23T01:34:50.495Z","avatar_url":"https://github.com/webprofusion.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Anvil\n\n**The project is a fork of https://github.com/fszlin/certes with packaging updates, feature updates and experimental extensions.** \n\nThis library is an ACME client implementation primarily used by https://certifytheweb.com and is subject to changes required by that application.\n\nExtended Features:\n- ACME ARI (renewal info)\n- Certificate chain build does not require installed/embedded root cert\n- Optional use of modern PFX cert/key algorithms for OpenSSL 3.x+ compatibility\n- Authority token challenges, tkauth-01 and TnAuthList\n## Account\n\n\nCreating new ACME account:\n```C#\nvar acme = new AcmeContext(WellKnownServers.LetsEncryptStagingV2);\nvar account = await acme.NewAccount(\"admin@example.com\", true);\n\n// Save the account key for later use\nvar pemKey = acme.AccountKey.ToPem();\n```\nUse an existing ACME account:\n```C#\n// Load the saved account key\nvar accountKey = KeyFactory.FromPem(pemKey);\nvar acme = new AcmeContext(WellKnownServers.LetsEncryptStagingV2, accountKey);\nvar account = await acme.Account();\n```\n\nSee [API doc](APIv2.md#accounts) for additional operations.\n\n## Order\n\nPlace a wildcard certificate order\n*(DNS validation is required for wildcard certificates)*\n```C#\nvar order = await acme.NewOrder(new[] { \"*.your.domain.name\" });\n```\n\nGenerate the value for DNS TXT record\n```C#\nvar authz = (await order.Authorizations()).First();\nvar dnsChallenge = await authz.Dns();\nvar dnsTxt = acme.AccountKey.DnsTxt(dnsChallenge.Token);\n```\nAdd a DNS TXT record to `_acme-challenge.your.domain.name` \nwith `dnsTxt` value.\n\nFor non-wildcard certificate, HTTP challenge is also available\n```C#\nvar order = await acme.NewOrder(new[] { \"your.domain.name\" });\n```\n## Authorization\n\nGet the **token** and **key authorization string**\n```C#\nvar authz = (await order.Authorizations()).First();\nvar httpChallenge = await authz.Http();\nvar keyAuthz = httpChallenge.KeyAuthz;\n```\n\nSave the **key authorization string** in a text file,\nand upload it to `http://your.domain.name/.well-known/acme-challenge/\u003ctoken\u003e`\n\n## Validate\n\nAsk the ACME server to validate our domain ownership\n```C#\nawait challenge.Validate();\n```\n\n## Certificate\n\nDownload the certificate once validation is done\n```C#\nvar privateKey = KeyFactory.NewKey(KeyAlgorithm.ES256);\nvar cert = await order.Generate(new CsrInfo\n{\n    CommonName = \"your.domain.name\",\n}, privateKey);\n```\n\nExport full chain certification\n```C#\nvar certPem = cert.ToPem();\n```\n\nExport PFX\n```C#\nvar pfxBuilder = cert.ToPfx(privateKey);\nvar pfx = pfxBuilder.Build(\"my-cert\", \"abcd1234\");\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebprofusion%2Fanvil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebprofusion%2Fanvil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebprofusion%2Fanvil/lists"}