在Python中接收Flask的SSL请求问题
这是一个端口监听器,试图使用下面的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()