ol.clave.acme.solver.http

HTTP-01 challenge solver with Ring middleware.

This namespace provides a complete HTTP-01 challenge solution for clojure ring servers.

  • solver creates a solver map for use with ol.clave/obtain-certificate

  • wrap-acme-challenge is Ring middleware that serves challenge responses

Usage:

(require '[ol.clave.acme.solver.http :as http-solver])

(def my-solver (http-solver/solver))

;; Add middleware to your Ring app
(def app (-> your-handler
             (http-solver/wrap-acme-challenge my-solver)))

;; Use solver with obtain-certificate
(clave/obtain-certificate lease session identifiers cert-key
                          {:http-01 my-solver} {})

solver

(solver)

Create an HTTP-01 solver that registers challenges in a registry.

Creates its own registry atom internally. The wrap-acme-challenge middleware reads from this registry to serve challenge responses.

Returns a solver map with :present, :cleanup, and :registry.

Example:

(def my-solver (solver))

;; Pass solver to middleware
(def app (-> handler (wrap-acme-challenge my-solver)))

;; Use with obtain-certificate
(clave/obtain-certificate lease session identifiers cert-key
                          {:http-01 my-solver} {})

wrap-acme-challenge

(wrap-acme-challenge handler solver)

Ring middleware that serves ACME HTTP-01 challenge responses.

Intercepts requests to /.well-known/acme-challenge/{token} and returns the key-authorization from the solver’s registry. Other requests pass through to the wrapped handler.

Parameters:

| name | description | |-----------|------------------------------| | handler | The Ring handler to wrap | | solver | Solver created by solver |

Response behavior: - Returns 200 with key-authorization as plain text if token found - Returns 404 if token not in registry - Passes through to handler for non-challenge paths

Example:

(def my-solver (solver))

(def app
  (-> my-handler
      (wrap-acme-challenge my-solver)))

handler

(handler solver)

Standalone Ring handler for ACME HTTP-01 challenges.

Use this when you want a dedicated server for challenges rather than integrating with an existing application.

Parameters:

| name | description | |----------|------------------------------| | solver | Solver created by solver |

Returns a Ring handler function.

Example:

(def my-solver (solver))

;; Start a dedicated challenge server
(run-jetty (http-solver/handler my-solver) {:port 80})