70 lines
1.7 KiB
Fennel
70 lines
1.7 KiB
Fennel
(local { : view} (require :fennel))
|
|
|
|
(local server (require :http.server))
|
|
(local headers (require :http.headers))
|
|
(local ssl (require :openssl))
|
|
(local csr (require :openssl.x509.csr))
|
|
(local x509 (require :openssl.x509))
|
|
(local pkey (require :openssl.pkey))
|
|
|
|
(fn not-found [out]
|
|
(doto (headers.new)
|
|
(: :append ":status" :404)
|
|
(: :append :content-type :text/plain)
|
|
(out:write_headers false))
|
|
(out:write_chunk "not found" true))
|
|
|
|
(fn slurp [filename]
|
|
(with-open [f (io.open filename "r")] (f:read "*a")))
|
|
|
|
(local ca-key (pkey.new (slurp "ca.key")))
|
|
(local ca-crt (x509.new (slurp "ca.crt")))
|
|
|
|
(fn new-crt [csr]
|
|
(let [crt
|
|
(doto (x509.new)
|
|
(: :setVersion 2)
|
|
(: :setSerial 42)
|
|
(: :setIssuer (ca-crt:getSubject))
|
|
(: :setLifetime (os.time) (+ (* 365 86400) (os.time)))
|
|
(: :setSubject (csr:getSubject))
|
|
(: :setPublicKey (csr:getPublicKey))
|
|
(: :sign ca-key))]
|
|
(crt:toPEM)))
|
|
|
|
(fn handle-sign-csr [out]
|
|
(let [body (out:get_body_as_string)]
|
|
(doto (headers.new)
|
|
(: :append ":status" :200)
|
|
(: :append :content-type :text/plain)
|
|
(out:write_headers false))
|
|
(let [req (csr.new body)]
|
|
(print :subject (req:getSubject))
|
|
(out:write_chunk (new-crt req) true))))
|
|
|
|
(fn on-stream [sv out]
|
|
(let [hdrs (out:get_headers)
|
|
method (hdrs:get ":method")
|
|
path (or (hdrs:get ":path") "/")]
|
|
(print :path path)
|
|
(case path
|
|
"/sign"
|
|
(handle-sign-csr out)
|
|
_
|
|
(not-found out))))
|
|
|
|
|
|
(fn new-server []
|
|
(server.listen
|
|
{
|
|
:host :localhost
|
|
:port 8201
|
|
:onstream on-stream
|
|
}))
|
|
|
|
|
|
(doto (new-server)
|
|
(: :listen)
|
|
(print "server ready")
|
|
(: :loop))
|