使用自签名证书“​​没有此类文件或目录”运行Flask时出错

时间:2018-11-03 14:44:54

标签: python flask

运行基于this guide的Flask +自签名证书的测试

烧瓶服务器:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return '<html><head></head><body><p>blabla</body></html>'

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=443, ssl_context=('cert.pem', 'key.pem'))

我使用以下方法生成了证书:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

当我运行服务器时(sudo python test.py) 我收到以下错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/home/abuyoyo/.local/lib/python2.7/site-packages/werkzeug/serving.py", line 774, in inner
    fd=fd)
  File "/home/abuyoyo/.local/lib/python2.7/site-packages/werkzeug/serving.py", line 660, in make_server
    passthrough_errors, ssl_context, fd=fd)
  File "/home/abuyoyo/.local/lib/python2.7/site-packages/werkzeug/serving.py", line 601, in __init__
    self.socket = ssl_context.wrap_socket(sock, server_side=True)
  File "/home/abuyoyo/.local/lib/python2.7/site-packages/werkzeug/serving.py", line 511, in wrap_socket
    ssl_version=self._protocol, **kwargs)
  File "/usr/lib/python2.7/ssl.py", line 949, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 560, in __init__
    self._context.load_cert_chain(certfile, keyfile)
IOError: [Errno 2] No such file or directory

我将绝对路径绑定到证书,我尝试了错误的路径,但是每次都遇到相同的错误。

3 个答案:

答案 0 :(得分:0)

具有路径许可权的问题。

将证书移动到/ tmp可以解决此问题。

答案 1 :(得分:0)

看起来像文件权限问题。创建一个特定的文件夹以将其存储在其中,并将其授予管理服务器的用户的权限。

仅作为示例,考虑“ www”是您以以下方式启动服务器的用户:

$ sudo mkdir /etc/ssl/certs/myPythonServerCert
$ sudo chown www:www /etc/ssl/certs/myPythonServerCert
$ sudo chmod 500 /etc/ssl/certs/myPythonServerCert

这将在/ etc / ssl / certs中创建一个文件夹,只有www用户可以访问和读取。 将您的证书放进去,它应该可以工作。

答案 2 :(得分:-1)

移动/ tmp下的证书解决了该问题。 / tmp具有777权限。我已将cert.pem和key.pem文件放置到/ tmp中的子目录中。