(Python)将证书添加到Bottle服务器

时间:2017-04-18 17:52:43

标签: python ssl certificate cherrypy

我遇到问题已经有一段时间了,无法找到合适的解决方案。

我有一个基于使用PyCharm编写的Bottle(Python 3)的python服务器。我正在使用“pyinstaller”将我的文件转换为一个“exe”,以便在固定的PC上启动服务器(win7)。服务器可以正常工作,但现在我想为它添加更多的安全性。

我有一个签名证书(不是自签名)和一个我要添加的密钥。我试着用他们启动服务器,但我不确定,如果我必须对他们做其他事情,因为证书没有显示在主页的信息中,网站仍显示为不保存。

我的普通服务器正在运行:

from bottle import run, ...
...
if __name__ == "__main__":
   ...
   run(host=IP, port=PORT)

我已经尝试了一些瓶子的框架,我最终以cherrypy为主,以适当的方式启动我的服务器。 服务器正在运行:

run(host=IP, port=PORT, server='cherrypy', certfile='./static/MyCert.pem', keyfile='./static/key.pem')

它不适用于当前版本的cherrypy,因此我将其(经过一些搜索后)降级为“> = 3.0.8,< 9.0.0”。 服务器正在运行,但网站仍未保存。我不知道它是否只是没有加载证书或我错过了别的东西。我尝试过在代码中保留“密钥文件”或将密钥添加到我的证书中,但它不会改变任何内容。

我尝试的另一个框架是gevent:

from gevent import monkey; monkey.patch_all()
...
if __name__ == "__main__":
  run(host=IP, port=PORT, reloader=False, server='gevent', certfile='./static/MyCert.pem', keyfile='./static/key.pem')

但在这里我无法进入网站。当我尝试时,终端要求我输入PEM短语,但是我无法添加它(或者只是不知道如何)并且得到一个我以前从未见过的错误: terminal_error

就像在我的樱桃示例中一样,我尝试使用一些离开代码部分或更改证书的组合,但它总是在这里结束。

如果有人能解决我的问题,或者能给我一些我遗漏或者还没有想到的东西,那将会很好。我想继续使用cherrypy或其他框架,所以我不需要更改我当前的代码。

由于

P上。

1 个答案:

答案 0 :(得分:1)

听起来像你在证书中添加了一个密码。在没有密码短语的情况下重新生成您的证书,然后重试。

另外,提出建议。我强烈建议在反向代理模式下运行nginx后面的瓶子/ cherrypy服务器。这通过让nginx处理SSL会话的终止来简化您的配置,然后您的python Web服务器永远不需要了解有关证书的任何信息。

这是我们用于终止我们的(自签名)SSL证书的nginx配置的编辑副本,并反向代理我们在端口9000上的localhost上运行的cherrypy站点:

server {
  listen   example.com:80;
  server_name  test.example.com;
  access_log  /var/log/nginx/test.example.com.access.log main;
  return 301 https://test.example.com$request_uri;
}

server {
    listen   example.com:443;
    access_log  /var/log/nginx/test.example.com.access.log main;
    server_name test.example.com;
    root /usr/local/www/test.example.com/html;
    ssl                  on;
    ssl_certificate      /etc/ssl/test.example.com.crt;
    ssl_certificate_key  /etc/ssl/test.example.com.key;
    ssl_session_timeout  5m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;  # don't use SSLv3 ref: POODLE
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    client_max_body_size 16M;

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
     return 403;
    }

    location / {
    proxy_pass http://127.0.0.1:9000;
    proxy_set_header X-REAL-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}