2014-09-11 2 views
2

아래의 python 스크립트를 사용하여 SSL 요청을 수신하려고 시도하는 포트 수신기입니다. OpenSSL 모듈에서 실패합니다. 이 위치에는 SSL 요청 만 제공됩니다.Python에서 SSL 요청 플라스크 받기 문제

파이썬 스크립트 :

import logging 

from OpenSSL import SSL 

log = logging.getLogger() 
log.setLevel(logging.DEBUG) 

log_path = 'C:\\Temp\\Receive SSL Request Flask.log' 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
fh = logging.FileHandler(log_path) 
fh.setFormatter(formatter) 
log.addHandler(fh) 

from flask import Flask, request, make_response, Response 
app = Flask(__name__) 

@app.route('/', defaults={'path':''}) 
@app.route('/<path:path>', methods=['GET', 'POST']) 
def handle(path): 
    try: 
     log.info('Path: ' + path) 
     log.info(' ') 

     if path == 'Client': 
      request_stream = str(request.stream.read()) 
      log.info('Request Stream *(Original): ' + request_stream) 
      log.info(' ') 

      return Response("{'msg':'Received SSL Request','success':True}") 
    except Exception as e: 
     log.debug('Exception: ' + str(e)) 

def main_process(): 
    try: 
     context = SSL.Context(SSL.SSLv3_METHOD) 
     context.use_privatekey_file('C:\\Temp\\server.key') 
     context.use_certificate_file('C:\\Temp\\sever.crt') 

     app.run('0.0.0.0', debug=True, port=80, ssl_context=('C:\\Temp\\server.crt', 'C:\\Temp\\server.key')) 
    except KeyboardInterrupt: 
     log.info("^C Caught, Shutting Down...") 
    finally: 
     log.info("GoodBye!!!") 

if __name__ == "__main__": 
    main_process() 

스택 추적 :이 줄 어떤 도움을 크게 감상 할 수

Traceback (most recent call last): 
    File "C:\Temp\Receive SSL Request Flask.py", line 46, in <module> 
    main_process() 
    File "C:\Temp\Receive SSL Request Flask.py", line 37, in main_process 
    context.use_certificate_file('C:\\Temp\\sever.crt') 
    File "C:\Python34\lib\site-packages\OpenSSL\SSL.py", line 391, in use_certific 
ate_file 
    _raise_current_error() 
    File "C:\Python34\lib\site-packages\OpenSSL\_util.py", line 22, in exception_f 
rom_error_queue 
    raise exceptionType(errors) 
OpenSSL.SSL.Error: [('system library', 'fopen', 'No such file or directory'), (' 
BIO routines', 'FILE_CTRL', 'system lib'), ('SSL routines', 'SSL_CTX_use_certifi 
cate_file', 'system lib')] 
... "main_process"기능에서

답변

1

있다 읽는 중 :

(210) 나는

코드가 잘 작동 (서버에서 R 통지) "C:\\Temp\\sever.crt""C:\\Temp\\server.crt" 있어야한다고 생각합니다.

(나는 리눅스에서 작동하도록 조금 변경) :

openssl genrsa -des3 -out server.key 1024 
openssl req -new -key server.key -out server.csr 
cp server.key server.key.org 
openssl rsa -in server.key.org -out server.key 
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 
다음

추적 코드를 사용하여 :

나는 내 자신의 자체 서명 된 SSL 인증서를 생성하기 위해 내 TMP 디렉토리에 다음과 같은 쉘 명령을 사용
import logging 
import os 


from OpenSSL import SSL 

log = logging.getLogger() 
log.setLevel(logging.DEBUG) 

log_path = os.getcwd() + '/tmp/ssl_flask_demo_log.log' 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
fh = logging.FileHandler(log_path) 
fh.setFormatter(formatter) 
log.addHandler(fh) 

from flask import Flask, request, make_response, Response 
app = Flask(__name__) 

@app.route('/', defaults={'path':''}) 
@app.route('/<path:path>', methods=['GET', 'POST']) 
def handle(path): 
    try: 
     log.info('Path: ' + path) 
     log.info(' ') 

     if path == 'Client': 
      request_stream = str(request.stream.read()) 
      log.info('Request Stream *(Original): ' + request_stream) 
      log.info(' ') 

      return Response("{'msg':'Received SSL Request','success':True}") 
     else: 
      return Response("{'msg'}:'Not a client', 'success':True}") 
    except Exception as e: 
     log.debug('Exception: ' + str(e)) 
     return "YOU CAUSED AN EXCEPTION. GOOD JOB...", str(e) 
    return "...How..are you seeing this?" 

def main_process(): 
    try: 
     pkey = os.getcwd() + '/tmp/server.key' 
     cert = os.getcwd() + '/tmp/server.crt' 
     context = SSL.Context(SSL.SSLv3_METHOD) 
     context.use_privatekey_file(pkey) 
     context.use_certificate_file(os.getcwd() + '/tmp/server.crt') 
     port = 5002 
     print "visit https://localhost:" + str(port) 
     app.run(debug=True, port=port, ssl_context=(cert, pkey)) 

    except KeyboardInterrupt: 
     log.info("^C Caught, Shutting Down...") 
    finally: 
     log.info("GoodBye!!!") 

if __name__ == "__main__": 
    main_process()