summaryrefslogtreecommitdiff
path: root/src/Network/ACME.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/ACME.hs')
-rw-r--r--src/Network/ACME.hs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/Network/ACME.hs b/src/Network/ACME.hs
index 5a66028..f6bffe2 100644
--- a/src/Network/ACME.hs
+++ b/src/Network/ACME.hs
@@ -31,14 +31,32 @@ import Network.Wreq (Response, checkStatus, defaults,
31 statusMessage) 31 statusMessage)
32import qualified Network.Wreq as W 32import qualified Network.Wreq as W
33import qualified Network.Wreq.Session as WS 33import qualified Network.Wreq.Session as WS
34import OpenSSL.RSA
35import System.Directory 34import System.Directory
36import Text.Email.Validate 35import Text.Email.Validate
37import Text.Domain.Validate hiding (validate) 36import Text.Domain.Validate hiding (validate)
38import Network.URI 37import Network.URI
38import OpenSSL
39import OpenSSL.EVP.Digest
40import OpenSSL.RSA
41import OpenSSL.X509.Request
42import Data.List
39 43
40type HttpProvisioner = URI -> ByteString -> IO () 44type HttpProvisioner = URI -> ByteString -> IO ()
41 45
46genReq :: Keys -> [DomainName] -> IO CSR
47genReq _ [] = error "genReq called with zero domains"
48genReq (Keys priv pub) domains@(domain:_) = withOpenSSL $ do
49 Just dig <- getDigestByName "SHA256"
50 req <- newX509Req
51 setSubjectName req [("CN", domainToString domain)]
52 setVersion req 0
53 setPublicKey req pub
54 void $ addExtensions req [(nidSubjectAltName, intercalate ", " (map (("DNS:" ++) . domainToString) domains))]
55 signX509Req req priv (Just dig)
56 CSR domains . toStrict <$> writeX509ReqDER req
57 where
58 nidSubjectAltName = 85
59
42fileProvisioner :: WritableDir -> HttpProvisioner 60fileProvisioner :: WritableDir -> HttpProvisioner
43fileProvisioner challengeDir = BC.writeFile . uToF 61fileProvisioner challengeDir = BC.writeFile . uToF
44 where 62 where