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.hs71
1 files changed, 45 insertions, 26 deletions
diff --git a/src/Network/ACME.hs b/src/Network/ACME.hs
index 85a27e4..2734132 100644
--- a/src/Network/ACME.hs
+++ b/src/Network/ACME.hs
@@ -1,4 +1,5 @@
1{-# LANGUAGE FlexibleContexts #-} 1{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE MultiParamTypeClasses #-}
2{-# LANGUAGE OverloadedStrings #-} 3{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE ScopedTypeVariables #-} 4{-# LANGUAGE ScopedTypeVariables #-}
4 5
@@ -9,41 +10,44 @@
9 10
10module Network.ACME where 11module Network.ACME where
11 12
12import Control.Lens hiding (each, (.=)) 13import Control.Arrow
14import Control.Error
15import Control.Lens hiding (each, (.=))
13import Control.Monad 16import Control.Monad
14import Control.Monad.RWS.Strict 17import Control.Monad.RWS.Strict
15import Data.Aeson (Value) 18import Control.Monad.Trans.Resource hiding (register)
16import Data.Aeson.Lens hiding (key) 19import Data.Aeson (Value)
17import qualified Data.Aeson.Lens as JSON 20import Data.Aeson.Lens hiding (key)
18import Data.ByteString (ByteString) 21import qualified Data.Aeson.Lens as JSON
19import qualified Data.ByteString.Char8 as BC 22import Data.ByteString (ByteString)
20import qualified Data.ByteString.Lazy as LB 23import qualified Data.ByteString.Char8 as BC
21import qualified Data.ByteString.Lazy.Char8 as LC 24import qualified Data.ByteString.Lazy as LB
25import qualified Data.ByteString.Lazy.Char8 as LC
22import Data.Coerce 26import Data.Coerce
23import Data.String (fromString) 27import Data.List
24import qualified Data.Text as T 28import Data.String (fromString)
25import Data.Text.Encoding (decodeUtf8, encodeUtf8) 29import qualified Data.Text as T
26import Data.Time.Clock.POSIX (getPOSIXTime) 30import Data.Text.Encoding (decodeUtf8, encodeUtf8)
31import Data.Time.Clock.POSIX (getPOSIXTime)
27import Network.ACME.Encoding 32import Network.ACME.Encoding
28import Network.Wreq (Response, checkStatus, defaults,
29 responseBody, responseHeader,
30 responseStatus, statusCode,
31 statusMessage)
32import qualified Network.Wreq as W
33import qualified Network.Wreq.Session as WS
34import System.Directory
35import Text.Email.Validate
36import Text.Domain.Validate hiding (validate)
37import Network.URI 33import Network.URI
34import Network.Wreq (Response, checkStatus, defaults,
35 responseBody, responseHeader,
36 responseStatus, statusCode,
37 statusMessage)
38import qualified Network.Wreq as W
39import qualified Network.Wreq.Session as WS
38import OpenSSL 40import OpenSSL
39import OpenSSL.EVP.Digest 41import OpenSSL.EVP.Digest
42import OpenSSL.EVP.PKey
43import OpenSSL.EVP.Sign hiding (sign)
44import OpenSSL.PEM
40import OpenSSL.RSA 45import OpenSSL.RSA
46import OpenSSL.X509 (X509, readDerX509)
41import OpenSSL.X509.Request 47import OpenSSL.X509.Request
42import OpenSSL.X509 (readDerX509, X509) 48import System.Directory
43import Data.List 49import Text.Domain.Validate hiding (validate)
44import Control.Error 50import Text.Email.Validate
45import Control.Arrow
46import Control.Monad.Trans.Resource hiding (register)
47 51
48genReq :: Keys -> [DomainName] -> IO CSR 52genReq :: Keys -> [DomainName] -> IO CSR
49genReq _ [] = error "genReq called with zero domains" 53genReq _ [] = error "genReq called with zero domains"
@@ -59,6 +63,21 @@ genReq (Keys priv pub) domains@(domain:_) = withOpenSSL $ do
59 where 63 where
60 nidSubjectAltName = 85 64 nidSubjectAltName = 85
61 65
66data Keys = Keys RSAKeyPair RSAPubKey
67readKeys :: String -> IO (Maybe Keys)
68readKeys privKeyData = do
69 keypair :: SomeKeyPair <- readPrivateKey privKeyData PwTTY
70 let (priv :: Maybe RSAKeyPair) = toKeyPair keypair
71 pub <- maybe (return Nothing) (fmap Just . rsaCopyPublic) priv
72 return $ Keys <$> priv <*> pub
73
74signPayload :: Keys -> String -> ByteString -> IO LC.ByteString
75signPayload (Keys priv pub) = signPayload' sign pub
76 where
77 sign x = do
78 Just dig <- getDigestByName "SHA256"
79 signBS dig priv x
80
62type HttpProvisioner = URI -> ByteString -> ResIO () 81type HttpProvisioner = URI -> ByteString -> ResIO ()
63fileProvisioner :: WritableDir -> HttpProvisioner 82fileProvisioner :: WritableDir -> HttpProvisioner
64fileProvisioner challengeDir uri thumbtoken = do 83fileProvisioner challengeDir uri thumbtoken = do