8

Từ CherryPy 3.0 và trở đi, một chiều SSL có thể được bật đơn giản bằng cách trỏ đến các chứng chỉ máy chủ và khóa bí mật, như thế này:2 chiều SSL với CherryPy

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()) 

Điều này cho phép khách hàng để xác nhận tính xác thực của máy chủ. Có ai biết liệu CherryPy có hỗ trợ ssl 2 chiều hay không, ví dụ: nơi máy chủ cũng có thể kiểm tra tính xác thực của máy khách bằng cách xác thực chứng chỉ ứng dụng khách?

Nếu có, bất kỳ ai cũng có thể đưa ra ví dụ về cách thực hiện? Hoặc đăng một tham chiếu đến một ví dụ?

Trả lời

4

Nó không nằm ngoài hộp. Bạn sẽ phải vá wsgiserver để cung cấp tính năng đó. Có một vé (và các bản vá) đang được tiến hành tại http://www.cherrypy.org/ticket/1001.

+2

Hiện có tại https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate – Pim

3

Tôi đã tìm kiếm điều tương tự. Tôi biết có một số bản vá lỗi trên trang web CherryPy.

Tôi cũng tìm thấy thông tin sau tại CherryPy SSL Client Authentication. Tôi đã không so sánh điều này so với các bản vá lỗi CherryPy nhưng có lẽ thông tin sẽ hữu ích.

Chúng tôi vừa mới cần thiết để phát triển một nhưng kiên cường ứng dụng nhanh chóng và REST của thấy rằng CherryPy phù hợp với nhu cầu của chúng tôi tốt hơn so với Python khác mạng khuôn khổ, như Twisted. Thật không may, tính đơn giản của nó thiếu một tính năng chính mà chúng tôi cần, Máy chủ/Khách hàng Xác thực chứng chỉ SSL. Do đó, , chúng tôi đã dành một vài giờ để viết một số ít sửa đổi nhanh chóng cho bản phát hành hiện tại, 3.1.2. sau các đoạn mã là những thay đổi chúng tôi thực hiện:

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() 

các bản vá lỗi trên yêu cầu bao gồm một tùy chọn mới cấu hình bên trong của máy chủ CherryPy cấu hình, server.ssl_ca_certificate. Tùy chọn này xác định chứng chỉ tệp quyền kết nối khách hàng sẽ được xác thực, nếu ứng dụng không xuất trình chứng chỉ của khách hàng hợp lệ, nó sẽ đóng ngay kết nối .

giải pháp của chúng tôi có những ưu điểm và nhược điểm , lợi thế chính là nếu khách hàng kết nối không hiện một chứng chỉ hợp lệ nó kết nối ngay lập tức được đóng lại. Điều này là tốt cho các mối quan tâm về bảo mật như nó không cho phép ứng dụng truy cập vào ứng dụng CherryPy ngăn xếp. Tuy nhiên, do hạn chế được thực hiện ở cấp độ ổ cắm, ứng dụng CherryPy không bao giờ có thể thấy ứng dụng kết nối và do đó giải pháp có phần không linh hoạt.

Giải pháp tối ưu sẽ cho phép ứng dụng kết nối với ổ cắm CherryPy và gửi chứng chỉ ứng dụng khách vào ngăn xếp ứng dụng.Sau đó, một công cụ CherryPy tùy chỉnh sẽ xác nhận chứng chỉ bên trong ngăn xếp ứng dụng và đóng kết nối nếu cần thiết; không may là vì cấu trúc của việc triển khai pyOpenSSL của CherryPy là khó để truy xuất chứng chỉ của ứng dụng khách bên trong ứng dụng ngăn xếp.

Tất nhiên các bản vá lỗi ở trên nên chỉ được sử dụng có nguy cơ của riêng bạn. Nếu bạn tìm ra giải pháp tốt hơn, vui lòng cho chúng tôi biết.

0

Nếu phiên bản hiện tại của CherryPy không hỗ trợ xác minh chứng chỉ ứng dụng, có thể cấu hình CherryPy nghe 127.0.0.1:80, cài đặt HAProxy để nghe 443 và xác minh chứng chỉ phía máy khách và chuyển tiếp lưu lượng truy cập đến 127.0.0.1:80 HAProxy đơn giản, nhẹ, nhanh và đáng tin cậy. An example of HAProxy configuration

Các vấn đề liên quan