在Python中接收Flask的SSL请求问题

2 投票
1 回答
3126 浏览
提问于 2025-04-21 03:38

这是一个端口监听器,试图使用下面的Python脚本接收SSL请求。但是在OpenSSL模块那里出现了问题。只有SSL请求会发送到这个位置。

Python脚本:

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')]

任何帮助都将非常感谢...

1 个回答

1

在“main_process”这个函数里,有一行代码是这样的:

context.use_certificate_file('C:\\Temp\\sever.crt')

我觉得 "C:\\Temp\\sever.crt" 应该改成 "C:\\Temp\\server.crt"(注意这里的“server”多了个“r”)

这段代码运行得很好。

我在我的临时目录里用以下命令生成了自己的自签名SSL证书:

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

然后我用下面的代码:(我稍微改了一下,以便在Linux上运行)

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

撰写回答