packages feed

Lucu-0.3: examples/SSL.hs

import           Control.Monad
import           Control.Monad.Trans
import           Data.Time.Clock
import           Network
import           Network.HTTP.Lucu
import           OpenSSL
import           OpenSSL.EVP.PKey
import           OpenSSL.RSA
import qualified OpenSSL.Session as SSL
import           OpenSSL.X509

main :: IO ()
main = withOpenSSL $
       do ctx  <- SSL.context

          key  <- generateRSAKey 1024 3 Nothing
          cert <- genCert key
          SSL.contextSetPrivateKey     ctx key
          SSL.contextSetCertificate    ctx cert
          SSL.contextSetDefaultCiphers ctx

          let config    = defaultConfig {
                            cnfServerPort = PortNumber 9000
                          , cnfSSLConfig  = Just SSLConfig {
                                              sslServerPort = PortNumber 9001
                                            , sslContext    = ctx
                                            }
                          }
              resources = mkResTree [ ( []
                                      , helloWorld )
                                    ]
          putStrLn "Access https://localhost:9001/ with your browser."
          runHttpd config resources []


helloWorld :: ResourceDef
helloWorld 
    = ResourceDef {
        resUsesNativeThread = False
      , resIsGreedy         = False
      , resGet
          = Just $ do setContentType $ read "text/plain"
                      outputChunk "getRemoteCertificate = "
                      cert <- do c <- getRemoteCertificate
                                 case c of
                                   Just c  -> liftIO $ printX509 c
                                   Nothing -> return "Nothing"
                      outputChunk cert
      , resHead   = Nothing
      , resPost   = Nothing
      , resPut    = Nothing
      , resDelete = Nothing
      }


genCert :: KeyPair k => k -> IO X509
genCert pkey
    = do cert <- newX509
         setVersion      cert 2
         setSerialNumber cert 1
         setIssuerName   cert [("CN", "localhost")]
         setSubjectName  cert [("CN", "localhost")]
         setNotBefore    cert =<< liftM (addUTCTime (-1)) getCurrentTime
         setNotAfter     cert =<< liftM (addUTCTime (365 * 24 * 60 * 60)) getCurrentTime
         setPublicKey    cert pkey
         signX509        cert pkey Nothing
         return cert