나는 똑같은 것을 찾고 있었다. 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의 현재 버전은 클라이언트 인증서 확인을 지원하지 않는 경우
https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate – Pim