标签: stunnel

经济高效地终止大量SSL连接

我最近建立了一个基于Node.js的Web套接字服务器,该服务器已经过测试,可以在一个小的EC2实例(m1.small)上每秒处理大约2,000个新的连接请求.考虑到m1.small实例的成本,以及将多个实例放在支持WebSocket的代理服务器(如HAProxy)后面的能力,我们对结果非常满意.

但是,我们意识到我们尚未使用SSL进行任何测试,因此研究了许多SSL选项.很明显,终止代理服务器上的SSL连接是理想的,因为代理服务器可以检查流量并插入诸如X-Forward-For之类的标头,以便服务器知道请求来自哪个IP.

所以我研究了许多解决方案,如Pound,stunnel和stud,所有这些解决方案都允许终止443上的传入连接,然后传递到端口80上的HAProxy,然后将连接传递到Web服务器上.然而不幸的是,我发现在c1.medium(高CPU)实例上向SSL终止代理服务器发送流量非常快速地消耗了所有CPU资源,并且仅以每秒50个左右的请求速率消耗.我尝试使用上面列出的所有三个解决方案,并且所有这些解决方案的表现大致相同,我认为它们都依赖于OpenSSL.我尝试使用64位非常大的高CPU实例(c1.xlarge),发现性能只能随成本线性增长.因此,基于EC2定价,我需要为每秒200个SSL请求支付大约600美元/手,而不是每秒2,000个非SSL请求60美元/米.当我们开始计划每秒接受1,000或10,000个请求时,前一个价格在很快就变得经济上不可行.

我也尝试使用Node.js的https服务器终止SSL,性能与Pound,stunnel和stud非常相似,所以没有明显的优势.

因此,我希望有人可以提供帮助,建议我如何克服这个荒谬的成本,我们必须吸收提供SSL连接.我听说SSL硬件加速器提供了更好的性能,因为硬件设计用于SSL加密和解密,但由于我们目前正在为所有服务器使用Amazon EC2,因此除非我们有单独的数据,否则不能使用SSL硬件加速器以物理服务器为中心.我只是在努力想知道亚马逊,谷歌,Facebook等公司如何能够通过SSL提供所有流量,而其成本如此之高.那里必须有更好的解决方案.

任何建议或想法将不胜感激.

谢谢马特

ssl openssl haproxy stunnel node.js

13
推荐指数
2
解决办法
5228
查看次数

为什么拒绝连接localhost?

我有一台服务器,客户端机器连接到该服务器.最近我决定加密与stunnel的连接,所以现在客户端程序不是直接连接到服务器,而是连接到localhost:8045(我检查过,这个端口没有被占用).

Java代码:

URL url = new URL("http://localhost:8045/malibu/GetProviders");
InputStream stream = url.openStream();
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:519)
    at java.net.Socket.connect(Socket.java:469)
    at java.net.Socket.<init>(Socket.java:366)
    at java.net.Socket.<init>(Socket.java:180)
    . . .
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用相同的页面curl,一切都很好.

什么可以导致这种行为?

编辑:是的,有一个监听套接字 - 运行netstat -avn | grep 8045给出:

tcp6       0      0 ::1:8045                :::*                    LISTEN
Run Code Online (Sandbox Code Playgroud)

java url networking localhost stunnel

7
推荐指数
1
解决办法
6万
查看次数

Secure WebSocket(wss://)在Firefox上不起作用

我有一个有效的WebSocket非安全应用程序.但我的网站使用https,我需要一个安全的WebSocket连接,以避免Firefox抱怨连接不安全的事实.

我使用php-websocket-server为我的WebSocket服务器使用PhP 5.2.9,所以当我使用WebSocket安全时,我无法使用openssl_decrypt函数解密数据包.

这就是为什么我使用stunnel来解密客户端使用wss发送的数据包,为了做那个我绑定的客户端WebSocket到12345端口服务器WebSocket到54321端口,然后我在服务器模式中添加了一个stunnel:

[wsServer]
accept  = 12345
connect = 192.168.1.227:54321
Run Code Online (Sandbox Code Playgroud)

使用此配置,我的应用程序可以通过https + wss在Chrome上正常运行.但在Firefox有握手期间是一个问题,似乎Sec-WebSocket-VersionSec-WebSocket-Key在标题中失踪.我不明白,因为它可以通过http + ws在Firefox上运行.

在此先感谢您的帮助.

编辑:我在端口12345上添加了证书的例外,现在握手进展顺利,因为我认为Firefox现在有了Sec-WebSocket-Key.

这里使用Firefox的工作头请求(大于Chrome请求):

GET / HTTP/1.1
Host: 192.168.1.227:12345
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive, Upgrade
Sec-WebSocket-Version: 13
Origin: https://192.168.1.227
Sec-WebSocket-Protocol: HyBi-00
Sec-WebSocket-Key: 65nHN33M6drIPjQHcGK8pA==
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Run Code Online (Sandbox Code Playgroud)

php firefox html5 stunnel websocket

7
推荐指数
1
解决办法
1万
查看次数

证书问题:SSL页面显示"您需要在Android上使用凭证存储之前设置锁定屏幕密码或密码"

我们在服务器上设置了证书,在请求https://www.ourserver.org时,Android(无论使用什么浏览器)显示一点弹出窗口

You need to set a lock screen pin or password 
before you can use credential storage
Run Code Online (Sandbox Code Playgroud)

哪个错了,似乎手机正试图注册该证书..?

它确实只在Android上发生,到目前为止它在iPhone和桌面浏览器上都很好

我们的Stunnel配置:

[www.ourserver.org]
  cert = /etc/stunnel/certs/www.ourserver.org.crt
  key = /etc/stunnel/keys/www.ourserver.org.key
  CAfile = /etc/stunnel/certs/www.ourserver.org.intermediate.crt
  accept  = 10.10.54.2:9443
  connect = 10.10.54.2:9444
  verify=1
  xforwardedfor = yes
  TIMEOUTclose = 0
Run Code Online (Sandbox Code Playgroud)

cert文件由RapidSSL发布.中间体CAfile包含:中间证书优先和cert certificate.

知道我们的证书配置出了什么问题吗?

如果我使用锁定屏幕进行手机保护,请访问同一页面然后显示

No certificates found

The app Chrome has requested a certificate. 
Choosing a certificate will let the app use this 
identity with servers now and in …
Run Code Online (Sandbox Code Playgroud)

ssl https android certificate stunnel

7
推荐指数
1
解决办法
9292
查看次数

无法连接到websocket

我使用Ratchet创建了一个PHP websocket .此Websocket正在8080我的内部服务器的端口上运行10.0.4.160.

我试图从一个启用了SSL"又名使用https协议"的网站连接到它.

当尝试从FireFox浏览器连接到websocket时,我从浏览器中得到安全问题,因为我在安全/非安全连接之间混合.这是我在javascript控制台中看到的错误.

SecurityError:操作不安全.

为了解决安全问题,我创建了一个stunnel代理,允许我接受连接 10.0.4.160:58443并将其连接到端口127.0.0.1:8080.这个安全隧道应该允许我保持与websocket的连接,并绕过浏览器的安全检查.

但是,每次我尝试连接到websocket时都会出错

与'wss://10.0.4.160:58443 /'的WebSocket连接失败:连接建立错误:net :: ERR_TIMED_OUT

这是用于连接websocket的jQuery脚本

<script>

    $(function(){
        if ("WebSocket" in window)
        {
            var conn = new WebSocket('wss://10.0.4.160:58443');

            conn.onopen = function(e) {
                console.log("Connection established!");
                showMessage('Connected', 0);
            };

            conn.onmessage = function(e) {
                console.log(e.data);
                showMessage(e.data, 1);
            };

            conn.onclose = function(e) {
                console.log(e.code);
                console.log(e.reason);
            };              

            conn.onerror = function(e) {
                console.log(e);
            };      

        } else {
            console.log('Your browser does not support Websocket!');
        }

        function showMessage(msg, append){ …
Run Code Online (Sandbox Code Playgroud)

javascript ssl jquery stunnel websocket

7
推荐指数
1
解决办法
3357
查看次数

一台机器作为带有 STunnel 的服务器和客户端

我知道可以使用配置文件中的“client = no”或“client = yes”行将 STunnel 设置为服务器或客户端。有没有办法让机器既是服务器又是客户端?

sockets client stunnel

6
推荐指数
2
解决办法
2771
查看次数

通过多个前端部分减少 haproxy acl 中的重复

我使用 haproxy 和 stunnel 处理 SSL(并使用代理模式来保留 haproxy 的原始 IP)。

我有几个 acl 测试,根据域、标头或路径重定向到不同的后端。

问题是,无论您是通过 http 还是 https 进入,这些都是相同的,但我必须在配置中复制它们。有什么办法可以减少重复吗?

这是一个示例配置:

global
    user haproxy
    group haproxy
    #etc...

frontend http-in
    bind *:80

    acl files_path path_beg /files/
    acl beta_host hdr_beg(host) -i beta.

    use_backend files if files_path
    use backend beta_host
    default_backend appservers

frontend https-in
    bind *:442 accept-proxy

    acl files_path path_beg /files/
    acl beta_host hdr_beg(host) -i beta.

    use_backend files if files_path
    use backend beta_host
    default_backend appservers


backend appservers
    balance roundrobin
    option forwardfor

    server appserver_1 localhost:8080 weight 1 …
Run Code Online (Sandbox Code Playgroud)

haproxy stunnel

6
推荐指数
2
解决办法
1万
查看次数

Stunnel 是否支持非加密连接?

关于 Stunnel 的 1 个问题。我想使用 Stunnel 作为互联网的 FIX(金融信息交换)网关,以支持 SSL 和非 SSL 连接。Stunnel 可以在没有任何加密的情况下进行吗?我刚刚尝试使用普通套接字,但看起来 Stunnel 拒绝了连接,说“协议无效”或其他什么。

ssl stunnel fix-protocol

6
推荐指数
1
解决办法
3807
查看次数

我该如何测试stunnel?

我已经创建了一个conf文件,用于连接到stunnel的地址和端口,其位置在/ usr/local/etc/stunnel /中,并启动了stunnel服务.

我已经将地址绑定到我的本地IP地址127.0.0.1:60005

为了测试连接,我试图通过telnet连接地址:

telnet 127.0.0.1 60005

打开:

尝试127.0.0.1 ...连接到127.0.0.1.逃脱角色是'^]'.外部主机关闭连接.

我知道外部主机没有关闭连接,因为我尝试使用原始IP地址telnet,没有问题.

那么,除了使用telnet之外,我该如何测试我的stunnel连接?谢谢.

ubuntu stunnel

6
推荐指数
1
解决办法
5724
查看次数

SslStream客户端无法完成与stunnel服务器的握手

我有一个完全可操作的系统,基于openssl的客户端与openssl服务器交互.每个客户端都有自己的证书,由服务器验证.已使用openssl(X509,pem)生成证书.他们是自签名的.

我现在想要编写一个基于SslStream的测试客户端.我使用了SslStream类文档中的客户端示例.

我的SslStream客户端无法完成握手.stunnel抱怨客户没有发送证书.这在Wireshark中确认(证书长度:握手消息中的0).

我的客户端显示以下异常:

内部异常:收到的消息是意外的或格式错误

这是我加载证书的方式:

X509Certificate cert = new X509Certificate2(filename, password);
X509CertificateCollection certColl = new X509CertificateCollection();
certColl.Add(cert);
Run Code Online (Sandbox Code Playgroud)

我尝试检索证书的各种属性(例如:GetSerialNumberString()).有用.Verify方法返回false.这是我要研究的下一件事.

我如何设置我的SslStream似乎并不重要(相同的结果):

sslStream.AuthenticateAsClient(serverName);

SslStream sslStream = new SslStream(
  client.GetStream(),
  false,
  new RemoteCertificateValidationCallback(ValidateServerCertificate), 
  new LocalCertificateSelectionCallback(SelectLocalCertificate));
Run Code Online (Sandbox Code Playgroud)

与身份验证相同:

sslStream.AuthenticateAsClient(serverName);

sslStream.AuthenticateAsClient(serverName,
  certColl,
  SslProtocols.Tls,
  true);
Run Code Online (Sandbox Code Playgroud)

SelectLocalCertificate被叫(两次)并返回我的证书.ValidateServerCertificate目前从未被召唤(令我惊讶).

我该怎么调试呢?如果你可以解决我的问题,那就更好了.

UPDATE

我添加了一个函数来执行基于文档中的X509Chain示例的链验证.它显示证书上的各种信息,包括两个有趣的消息:

Element certificate is valid: False
Element error status length: 1
Run Code Online (Sandbox Code Playgroud)

最后,我没有比调用验证时更多的细节.

输出openssl verify cert.pem不报告任何异常.

error 18 at 0 depth lookup:self signed certificate
OK
Run Code Online (Sandbox Code Playgroud)

UPDATE

我从pem中提取了私钥和证书,并生成了cert.pfx(pkcs12).我在个人密钥库中导入cert.pfx没有问题.在我的证书详细信息中,我可以看到一个小图标,表示附加的私钥.

我修改了我的客户端以从我的个人商店检索证书.但我得到了同样的确切失败.

.net c# openssl sslstream stunnel

5
推荐指数
1
解决办法
8693
查看次数