summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2016-01-25 17:42:29 -0500
committerAndrew Cady <d@jerkface.net>2016-01-25 17:42:29 -0500
commit3fc632688205e46295803460b5e652751c803d59 (patch)
tree2ebe6903854018cb1d0c640b84807529fb6b6fa8
parentcf440860e186e7fd775ae27da08220d9fe5e233e (diff)
move genReq into the library
-rw-r--r--acme-certify.hs20
-rw-r--r--src/Network/ACME.hs20
2 files changed, 21 insertions, 19 deletions
diff --git a/acme-certify.hs b/acme-certify.hs
index cda3d09..360579b 100644
--- a/acme-certify.hs
+++ b/acme-certify.hs
@@ -13,14 +13,12 @@ module Main where
13 13
14import BasePrelude 14import BasePrelude
15import qualified Data.ByteString.Lazy.Char8 as LC 15import qualified Data.ByteString.Lazy.Char8 as LC
16import Network.ACME (CSR (..), canProvision, certify, fileProvisioner, ensureWritableDir, (</>), domainToString) 16import Network.ACME (canProvision, certify, fileProvisioner, ensureWritableDir, (</>), genReq)
17import Network.ACME.Encoding (Keys (..), readKeys, toStrict) 17import Network.ACME.Encoding (Keys (..), readKeys)
18import Network.URI 18import Network.URI
19import OpenSSL 19import OpenSSL
20import OpenSSL.EVP.Digest
21import OpenSSL.PEM 20import OpenSSL.PEM
22import OpenSSL.RSA 21import OpenSSL.RSA
23import OpenSSL.X509.Request
24import Options.Applicative hiding (header) 22import Options.Applicative hiding (header)
25import qualified Options.Applicative as Opt 23import qualified Options.Applicative as Opt
26import System.Directory 24import System.Directory
@@ -95,20 +93,6 @@ genKey privKeyFile = withOpenSSL $ do
95 writeFile privKeyFile pem 93 writeFile privKeyFile pem
96 return pem 94 return pem
97 95
98genReq :: Keys -> [DomainName] -> IO CSR
99genReq _ [] = error "genReq called with zero domains"
100genReq (Keys priv pub) domains@(domain:_) = withOpenSSL $ do
101 Just dig <- getDigestByName "SHA256"
102 req <- newX509Req
103 setSubjectName req [("CN", domainToString domain)]
104 setVersion req 0
105 setPublicKey req pub
106 void $ addExtensions req [(nidSubjectAltName, intercalate ", " (map (("DNS:" ++) . domainToString) domains))]
107 signX509Req req priv (Just dig)
108 CSR domains . toStrict <$> writeX509ReqDER req
109 where
110 nidSubjectAltName = 85
111
112getOrCreateKeys :: FilePath -> IO (Maybe Keys) 96getOrCreateKeys :: FilePath -> IO (Maybe Keys)
113getOrCreateKeys file = do 97getOrCreateKeys file = do
114 exists <- doesFileExist file 98 exists <- doesFileExist file
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