2013-03-19 23 views
26

ほとんど使用されていませんが、Snapでクライアント証明書にアクセスすることは可能ですか?Snapを使用してクライアント証明書を確認する方法

そうでない場合は、別のウェブスタックを使用できますか?

+1

もっと一般的には、Haskell Webフレームワークが証明書ベースのクライアント認証をサポートしているかどうかを知りたいと思います。 –

+0

これは非回答ですが、回避策として、nginxを使用して証明書を検証し、ヘッダーにDNを渡すことができます。 –

答えて

1

これはSnapのsnap-serverパッケージでは利用できません。これはあなたのサーバーの動作方法を前提としています。

Buuuuutフォークするか、別のモジュールとしてビルドするのは難しくありません(ただし、必要な内部値がエクスポートされないため、コードをコピーする必要があります)。 bindHttpslocated in Snap.Internal.Http.Server.TLSは、ターゲットとするものです。この関数は、HsOpenSSLライブラリからのOpenSSL.Sessionへの呼び出しのラッパーです。このライブラリ自体はOpenSSLライブラリのラッパーです。

私たちのためにラッキーOpenSSLはクライアント証明書を完全にサポートしています。 verification modeSSL_VERIFY_PEERに設定するだけです。あなたはあまりにもバイブルすることができます他のノブがあります。また、実際にクライアント証明書を検証するために証明書チェーンをインストールする必要があります。信頼のチェーンとそのすべてのジャズ。参考までに、nginx does itを参照してください。

なお、この機能は、としてexposedであり、HsOpenSSLである。スナップのbindHttpsの定義にctx :: SSLContextが存在することがわかります。あなたがしなければならないのは、そのモジュールをコピーまたはフォークして、あなたの呼び出しを導入することだけです。

それは、この(未検証のコードの警告)のようになります。

± % diff -u /tmp/{old,new} 
--- /tmp/old 2016-04-11 11:02:42.000000000 -0400 
+++ /tmp/new 2016-04-11 11:02:56.000000000 -0400 
@@ -19,6 +19,7 @@ 

     ctx <- SSL.context 
     SSL.contextSetPrivateKeyFile ctx key 
+  SSL.contextSetVerificationMode ctx (SSL.VerifyPeer True True (Just (\_ _ -> return True))) 
     if chainCert 
     then SSL.contextSetCertificateChainFile ctx cert 
     else SSL.contextSetCertificateFile ctx cert 

最初のブール値にはクライアント証明書が存在しない場合に失敗するOpenSSLを伝えます。 2番目のブール値は、クライアント証明書が最初の要求でのみ必要であり、再交渉では必要なくなったことをOpenSSLに伝えます。 3番目の値はコールバックです。コールバックでTrueを返すだけです。とにかく、それはnginx doesです。

関連する問題