module DDNS.Client.MakeReq ( makeReq ) where import Control.Monad import Control.Monad.Trans import DDNS.Utils import OpenSSL.PEM import OpenSSL.RSA import OpenSSL.X509.Request import System.Console.Haskeline import System.IO import System.Posix.Files import System.Posix.Uname makeReq :: IO () makeReq = do fqdn <- runInputT defaultSettings $ do defaultFqdn <- liftM uNodeName $ liftIO uname fqdn <- getInputLine ("What's your FQDN? (default: " ++ defaultFqdn ++ "): ") case trim fqdn of Just s -> return s _ -> return defaultFqdn putStrLn "Generating RSA keypair..." key <- generateRSAKey 1024 3 Nothing let pubFile = fqdn ++ ".pub" withFile pubFile WriteMode $ \ h -> writePublicKey key >>= hPutStr h putStrLn ("Wrote " ++ pubFile) let keyFile = fqdn ++ ".key" withFile keyFile WriteMode $ \ h -> writePKCS8PrivateKey key Nothing >>= hPutStr h setFileMode keyFile ownerReadMode putStrLn ("Wrote " ++ keyFile ++ " (with no encryption)") req <- newX509Req setVersion req 2 setSubjectName req [("CN", fqdn)] setPublicKey req key signX509Req req key Nothing let reqFile = fqdn ++ ".req" withFile reqFile WriteMode $ \ h -> writeX509Req req ReqNewFormat >>= hPutStr h putStrLn ("Wrote " ++ reqFile) putStrLn ("Now send " ++ reqFile ++ " to the server operator and tell him/her to sign it.")