8

CherryPy 3.0 以降では、次のようにサーバー証明書と秘密鍵を指定するだけで一方向 SSL を有効にできます。

import cherrypy

class HelloWorld(object):
    def index(self):
        return "Hello SSL World!"
    index.exposed = True

cherrypy.server.ssl_certificate = "keys/server.crt"
cherrypy.server.ssl_private_key = "keys/server.crtkey" 
cherrypy.quickstart(HelloWorld())

これにより、クライアントはサーバーの信頼性を検証できます。CherryPy が双方向 ssl をサポートしているかどうか、たとえば、サーバーがクライアント証明書を検証してクライアントの信頼性を確認できるかどうかを知っている人はいますか?

はいの場合、誰かがそれがどのように行われるか例を挙げてもらえますか? または、例への参照を投稿しますか?

4

3 に答える 3

4

箱から出してはいけません。その機能を提供するには、wsgiserver にパッチを適用する必要があります。http://www.cherrypy.org/ticket/1001で進行中のチケット (およびパッチ) があります。

于 2010-12-13T18:02:23.753 に答える
3

私は同じものを探してきました。CherryPy サイトにいくつかのパッチがあることは知っています。

CherryPy SSL Client Authenticationで次のことも見つけました。これと CherryPy パッチを比較したことはありませんが、情報が役立つかもしれません。

最近、迅速で回復力のある REST アプリケーションを開発する必要がありましたが、CherryPy が Twisted などの他の Python ネットワーキング フレームワークよりも私たちのニーズに適していることがわかりました。残念ながら、その単純さには、必要な重要な機能であるサーバー/クライアント SSL 証明書の検証が欠けていました。そのため、現在のリリースである 3.1.2 にいくつかの簡単な変更を加えるのに数時間を費やしました。次のコード スニペットは、私たちが行った変更です。

cherrypy/_cpserver.py

@@ -55,7 +55,6 @@ instance = None ssl_certificate = None ssl_private_key
= None
+ ssl_ca_certificate = None nodelay = True

def __init__(self):

cherrypy/wsgiserver/__init__.py

@@ -1480,6 +1480,7 @@
# Paths to certificate and private key files ssl_certificate = None ssl_private_key = None
+    ssl_ca_certificate = None

def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, max=-1, request_queue_size=5, timeout=10, shutdown_timeout=5):

@@ -1619,7 +1620,9 @@

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if self.nodelay: self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-        if self.ssl_certificate and self.ssl_private_key:
+        if self.ssl_certificate and self.ssl_private_key and \
+            self.ssl_ca_certificate:
+ if SSL is None: raise ImportError("You must install pyOpenSSL to use HTTPS.")

@@ -1627,6 +1630,11 @@ ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.use_privatekey_file(self.ssl_private_key) ctx.use_certificate_file(self.ssl_certificate)
+            x509 = crypto.load_certificate(crypto.FILETYPE_PEM,
+                open(self.ssl_ca_certificate).read())
+            store = ctx.get_cert_store()
+            store.add_cert(x509)
+            ctx.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT, lambda *x:True) self.socket = SSLConnection(ctx, self.socket) self.populate_ssl_environ()

上記のパッチでは、CherryPy サーバー構成 server.ssl_ca_certificate 内に新しい構成オプションを含める必要があります。このオプションは、接続しているクライアントが検証される認証局ファイルを識別します。クライアントが有効なクライアント証明書を提示しない場合、すぐに接続を閉じます。

私たちのソリューションには長所と短所があります。主な利点は、接続しているクライアントが有効な証明書を提示しない場合、接続がすぐに閉じられることです。これは、CherryPy アプリケーション スタックへのアクセスをクライアントに許可しないため、セキュリティ上の問題に適しています。ただし、制限はソケット レベルで行われるため、CherryPy アプリケーションはクライアントが接続していることを確認できず、そのため、ソリューションはやや柔軟性に欠けます。

最適なソリューションは、クライアントが CherryPy ソケットに接続し、クライアント証明書をアプリケーション スタックに送信できるようにすることです。次に、カスタム CherryPy ツールがアプリケーション スタック内の証明書を検証し、必要に応じて接続を閉じます。残念ながら、CherryPy の pyOpenSSL 実装の構造により、アプリケーション スタック内でクライアント証明書を取得することは困難です。

もちろん、上記のパッチは自己責任でのみ使用してください。より良い解決策を思いついた場合は、お知らせください。

于 2011-01-14T17:22:44.643 に答える