Ssl 使用自签名证书保护WebSocket

Ssl 使用自签名证书保护WebSocket,ssl,ssl-certificate,websocket,Ssl,Ssl Certificate,Websocket,我想使用安全WebSocket来提高成功率。 我不需要加密 在使用安全WebSocket时,我是否会看到警告(wss://example.com)使用自签名证书? 我用Chrome10试过了,没有看到警告,也没有要求我接受证书。它只是工作 这是chrome中的错误还是预期的行为? 我将来能使用自签名证书吗 谢谢是的,这是Chrome当前的行为,但我不希望它在未来继续成为政策。在Firefox4中(如果您在about:config中启用WebSockets),您将收到关于证书的警告。要批准证书,您

我想使用安全WebSocket来提高成功率。 我不需要加密

在使用安全WebSocket时,我是否会看到警告(wss://example.com)使用自签名证书? 我用Chrome10试过了,没有看到警告,也没有要求我接受证书。它只是工作

这是chrome中的错误还是预期的行为? 我将来能使用自签名证书吗


谢谢

是的,这是Chrome当前的行为,但我不希望它在未来继续成为政策。在Firefox4中(如果您在about:config中启用WebSockets),您将收到关于证书的警告。要批准证书,您可能还必须在浏览器中输入WebSockets URL(将wss替换为https)并首先在那里批准证书(因为WebSockets连接发出的关于自签名证书的警告可能不会给您批准证书的机会)


我希望所有浏览器都能集中到正确的行为上,即弹出一个警告对话框,允许自签名证书获得批准。

自v19()以来,自签名证书被Chrome拒绝。如果您尝试连接到使用自签名证书的wss URL,则请求将以静默方式中止。
要允许使用自签名证书,请使用
--ignore certificate errors
标志启动Chrome,例如:

chromium --user-data-dir=/tmp/whatever --ignore-certificate-errors
据我所知,没有办法让Firefox接受您的wss自签名证书。因此,只需使用
ws://
在Firefox中进行测试。如果您正在通过https测试web应用程序,则必须切换首选项以允许连接到(不安全的)
ws://
URL:

  • 访问
    about:config
  • network.websocket.allowInsecureFromHTTPS
    设置为
    true

  • 我通过以下方式使其工作:

    首先生成您的自签名证书:

    openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes
    
    然后使用节点的内置https服务器从express应用程序创建您的httpsServer:

    var privateKey  = fs.readFileSync('sslcert/key.pem', 'utf8');
    var certificate = fs.readFileSync('sslcert/cert.pem', 'utf8');
    
    var credentials = {key: privateKey, cert: certificate};
    var express = require('express');
    var app = express();
    
    //... bunch of other express stuff here ...
    
    //pass in your express app and credentials to create an https server
    var httpsServer = https.createServer(credentials, app);
    httpsServer.listen(8443);
    
    然后设置websocket服务器(具有讽刺意味的是,这将使用与http服务器相同的端口,我不知道这一点,但我想协议可以共享端口?--这让我经历了一段时间)

    现在浏览到
    https://0.0.0.0:8443
    server并接受Chrome中的自签名证书。那么WebSocket现在应该可以在浏览器中工作了

    打开chrome devtools控制台并键入:

    var ws = new WebSocket('wss://0.0.0.0:8443');
    ws.send('foo');
    
    ..或任何主机:您用于httpsServer的端口,这里的关键是您使用的是
    wss://
    协议

    在node express web服务器中,您应该会看到一条记录到控制台的消息。使用
    节点启动服务器。/server.js


    当您使用
    wscat
    时,您可以使用-n标志(-n,--no check:不检查未经授权的证书)


    您知道下一个WebSocket草案是否会提高非安全WebSocket的成功率吗?可能不会。主要的变化是数据的框架(基于长度而不是基于分隔符),从客户机到服务器的数据没有被屏蔽以解决行为不端的中介问题。端口80和443仍然是标准的WebSocket端口,握手仍然类似于HTTP。您看到的导致WebSocket无法为您连接的问题是什么?我指的是。它说端口80的成功率只有63%,而端口443的成功率为95%。我还被迫使用端口443或8080,因为我使用nginx作为代理,它不支持http1.1。端口443需要一个证书,这会使事情复杂化,可能会有一点开销。我不知道有多少用户的8080端口被阻塞了。这些成功率不适用于本地连接,它们用于在任意地点往返互联网,并且它们没有测量情绪问题(要么有效,要么无效)。端口80的问题是因为可能有许多中介会干扰被视为正常HTTP流量的内容。通过端口443使用wss在本地网络上不会获得更高的成功。很少有用户会阻止传出的8080,因为在Internet上的8xxx端口上运行正常的web服务并不少见。此外,大多数端口80问题将出现在服务器端,而不是客户端。如果您的服务器在端口80上运行WebSockets连接,并且您能够自己连接,那么其他所有人的成功率也会更高。一些公司透明代理可能会在客户端造成问题,但很少家庭用户会看到端口80存在任何客户端问题。您可以使用的一个技巧是使用自签名证书访问与websocket端点位于同一地址/端口的HTTPS URL,当它抛出一个框时,您可以添加安全异常。此异常也将继续适用于WebSocket连接。许多WebSocket实现还可以服务于HTTPS页面。否则,通过apache或
    openssl s_服务器
    建立一个快速HTTPS服务器来添加安全异常也会起作用。这在包括FireFox在内的所有主流浏览器中都能起作用。这一点很有效,我忽略了“现在浏览到服务器并接受Chrome中的自签名证书”这一部分。老实说,我不认为用户在其内容未出现时会费力地接受证书。对大多数用户来说,接受证书过于技术化。
    var ws = new WebSocket('wss://0.0.0.0:8443');
    ws.send('foo');
    
    wscat -c "wss://30.90.212.255:8000" -n