V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yueyoum
V2EX  ›  程序员

多个 SERVER 之间相互调用的安全性问题

  •  
  •   yueyoum ·
    yueyoum · 2014-05-12 18:48:12 +08:00 · 2651 次点击
    这是一个创建于 3841 天前的主题,其中的信息可能已经有所发展或是发生改变。
    标题没写清楚,
    情况是这样的。

    有一堆server, 它们之间提供有 http api 供相互调用。

    目前是直接 没有任何认证加密 直接发送。

    但考虑到这些server会暴露在外网,不想指定特定IP允许访问(以后迁移机器徒曾麻烦)
    所以现在必须对请求加以限制。

    目前想到的方式有两种:

    1, 这些api 走https, 并且nginx 开启client验证,
    这个方式的好处就是 限制客户端,加密 一起搞定了。

    折腾了一下午,
    最后按照这个文章 http://drumcoder.co.uk/blog/2011/oct/19/client-side-certificates-web-apps/

    设置好了客户端验证, 但firefox 没搞定, chromium 可以。
    并且使用requests 也没搞定,一直报错。

    2, 就是用 http basic auth
    设置简单, 但安全性显然没有 https 高


    或者,大家对此有什么好的建议?
    第 1 条附言  ·  2014-05-12 20:14:31 +08:00
    终于找到问题所在了,

    python程序还没发出请求就报错。

    因为我的证书是自己颁发给自己的,签名非法。在浏览器中,可以自己添加为trusted。
    但python 的http client 库,都是默认直接会去验证服务器的签名,结果不通过,报SSLError


    找到问题所在了,就好解决了。
    对于那个帖子中生成的 client.crt, client.key 拷贝过来。

    >>> r = requests.get('https://api.test.com', verify=False, cert=('client.crt', 'client.key'))
    >>>
    >>> r.ok
    True

    或者 先执行 cat client.crt client.key > client.pem

    然后
    >>> r = requests.get('https://api.test.com', verify=False, cert='client.pem')
    >>>
    >>> r.ok
    True
    7 条回复    2014-05-13 01:17:13 +08:00
    yueyoum
        1
    yueyoum  
    OP
       2014-05-12 18:51:16 +08:00
    上面没说清楚

    firefox没搞定是 证书成功导入firefox,但在请求url的时候,报错

    An error occurred during a connection to api.test.com. Peer's certificate has an invalid signature. (Error code: sec_error_bad_signature)

    python requests 库, 一直包SSLError
    yueyoum
        2
    yueyoum  
    OP
       2014-05-12 19:14:51 +08:00
    更新

    firefox 也OK了,

    在生成 server.csr 的时候 除了common name 其他的都别填
    common name 就是域名

    client.csr 的 common name 别填 域名
    ritksm
        3
    ritksm  
       2014-05-12 19:23:17 +08:00
    如果暴露给用户的Server还有相互之间的调用的话...说明这个架构设计的有问题

    本来一个内网隔离就解决了的问题...何必搞那么复杂 而且加了https以及验证以后必然会影响性能
    wy315700
        4
    wy315700  
       2014-05-12 19:23:25 +08:00
    post里加一个字段 走HTTPS
    yueyoum
        5
    yueyoum  
    OP
       2014-05-12 19:40:08 +08:00
    @ritksm

    我也知道,但当初期这些server组件 其实是全部署在一台机器上的时候,………………

    理论总是要向现实妥协。


    而且我感觉如果对API请求做了认证加密,也更加放心自如的部署机器。
    KentY
        6
    KentY  
       2014-05-12 20:20:53 +08:00
    我看着像是web service 的use case...
    soulteary
        7
    soulteary  
       2014-05-13 01:17:13 +08:00
    @yueyoum 其中一台做隔离做权限池用途,根据访问量划块内存给机器交互授权用,当机器A访问机器B的时候,A先访问权限服务器,设置一个token(token由时间+盐+你的密钥hash出来),然后访问B,B带着A的KEY去请求权限服务器即可。实现较易,且行且珍惜。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   967 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:51 · PVG 04:51 · LAX 12:51 · JFK 15:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.