8

CherryPy 3.0 및 이후, 단방향 SSL은 다음과 같이 간단하게 서버 인증서와 개인 키를 가리키는 켤 수 있습니다에서 : 유효성을 검사양방향 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

상자는 기본적으로 제공되지 않습니다. 이 기능을 제공하려면 wsgiserver를 패치해야합니다. 진행중인 티켓 (및 패치)이 http://www.cherrypy.org/ticket/1001에 있습니다.

+2

https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate – Pim

3

나는 똑같은 것을 찾고 있었다. CherryPy 사이트에 패치가 있다는 것을 알고 있습니다.

나는 또한 CherryPy SSL Client Authentication에서 다음을 발견했다. 나는 이것을 CherryPy 패치와 비교하지 않았지만 아마도 정보가 도움이 될 것입니다.

우리는 최근 빠른 하지만 탄력적 인 REST 응용 프로그램을 개발하는 데 필요한 및 는 CherryPy 다른 파이썬은 트위스트처럼 프레임 워크 네트워킹보다 더 나은 우리의 필요 을 적합한 것으로 나타났다. 아쉽게도 단순함에는 핵심 기능이 없었습니다. 서버/클라이언트 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 도구는 응용 프로그램 스택의 내부에서 인증서의 유효성을 검사하고 필요한 경우 연결을 닫습니다. 불행히도 체리 파이의 구조로 인해 pyOpenSSL 구현은 클라이언트 내부에서 인증서를 검색하기가 어렵습니다. 스택입니다.

물론 위 패치는 사용자의 책임하에 사용해야합니다. 더 좋은 해결책을 제시한다면 알려주세요. CherryPy의 현재 버전은 클라이언트 인증서 확인을 지원하지 않는 경우

0

, 443을 듣고 클라이언트 측 인증서를 확인하고 트래픽을 전달하기 위해, 127.0.0.1:80 듣고 HAProxy를 설치 CherryPy를 구성 할 수 있습니다 127.0.0.1:80 HAProxy는 간단하고 가볍고 빠르고 안정적입니다. An example of HAProxy configuration