4 import Control.Monad.Trans
8 import OpenSSL.X509.Request
9 import System.Console.Haskeline
10 import System.Console.ParseArgs
12 import System.Posix.Files
13 import System.Posix.Uname
19 deriving (Show, Eq, Ord)
21 arginfo :: [Arg Options]
27 , argDesc = "print this help."
33 , argData = argDataDefaulted "COMMAND" ArgtypeString "update"
34 , argDesc = "command to the client (default: \"update\")."
40 do m <- parseArgsIO ArgsComplete arginfo
44 case getRequiredArg m Command of
52 = do fqdn <- runInputT defaultSettings $
53 do defaultFqdn <- liftM uNodeName $ liftIO uname
54 fqdn <- getInputLine ("What's your FQDN? (default: " ++ defaultFqdn ++ "): ")
56 Just s@(_:_) -> return s
57 _ -> return defaultFqdn
59 putStrLn "Generating keypair..."
60 key <- generateRSAKey 1024 3 Nothing
62 let pubFile = fqdn ++ ".pub"
63 withFile pubFile WriteMode $ \ h ->
64 writePublicKey key >>= hPutStr h
65 putStrLn ("Wrote " ++ pubFile)
67 let keyFile = fqdn ++ ".key"
68 withFile keyFile WriteMode $ \ h ->
69 writePKCS8PrivateKey key Nothing >>= hPutStr h
70 setFileMode keyFile (ownerReadMode `unionFileModes` ownerWriteMode)
71 putStrLn ("Wrote " ++ keyFile ++ " (with no encryption)")
75 setSubjectName req [("CN", fqdn)]
77 let reqFile = fqdn ++ ".req"
78 withFile reqFile WriteMode $ \ h ->
79 writeX509Req req ReqNewFormat >>= hPutStr h
80 putStrLn ("Wrote " ++ reqFile)
81 putStrLn ("Now send " ++ reqFile ++ " to the server operator and tell him/her to sign it.")