3

安全な WebSocket (wss://) とクライアント証明書ベースの認証を twisted で実装するオプションがあるかどうかを知りたいですか?

http://twistedmatrix.com/documents/12.3.0/core/howto/ssl.htmlの指示に従いました。ここでは、https:// を介したサイトのセットアップとクライアント証明書が説明されています。自己署名証明書を使用すると、これは正常に機能します。ただし、Websocket が登場すると事態は複雑になります。

IE 10 で全体を実行すると問題なく動作します。クライアントは証明書を使用して認証し、サイトへのアクセスを取得して、Websocket を開くことができます。ただし、FF と Chrome は機能しません。webserver と websocket は同じポートで実行されることに注意してください。

私の意見では、IE は何らかの方法でクライアントの認証を保存し、それを WebSocket へのアクセスにも使用しているようです。FF と Chrome は、どういうわけか Websocket を以前に認証が行われていない別のリソースとして扱います。

誰かが同じまたはやや似た問題を経験したことがありますか、またはこれに対する解決策を実装しましたか?

必要に応じて、これまでのソース コードを提供できます。

4

2 に答える 2

3

同じ問題を抱えているすべての興味のある読者のために、私は最終的にそれを理解しました. 解決策は、ssl コンテキストのセッション ID を設定することです。次に、ブラウザは、websocket のようなサブリソースに対しても証明書認証を覚えているようです。

これはそれを行う必要があります:

contextFactory = twisted.internet.ssl.DefaultOpenSSLContextFactory('keys/server.key',
                                                 'keys/server.crt')


ctx = contextFactory.getContext()
ctx.set_verify(
     OpenSSL.SSL.VERIFY_PEER | OpenSSL.SSL.VERIFY_CLIENT_ONCE,
     verifyCallback
     )
## Since we have self-signed certs we have to explicitly
## tell the server to trust them.
ctx.load_verify_locations("keys/ca.crt")
ctx.set_session_id("id")

とにかく1〜8行目が必要です。新しいのは 9 行目です。ここでは、セッション ID を設定する必要があります。

于 2013-07-03T05:49:58.947 に答える
1

問題について説明したように、これは単にブラウザのバグであり、Twisted でできることはあまりありません。

悲しいことに、Websocket はまだ未熟な技術であり、ご覧になっているようなバグはまだ解決されていません。ブラウザに対してバグを報告し、修正されることを望みます。

おそらく、client-cert-auth がその API / プロトコルで機能すると仮定して、非 IE ブラウザー用のサーバー送信イベントの実装を検討できますか?

于 2013-05-20T18:09:44.420 に答える