该服务器有一个控制台应用程序。服务器在 VPS 上运行。一个wifi上有两个设备。第一个是一台电脑。我可以轻松地从那里登录。通过 unity 内部为 android 构建 unity。第二个是我的安卓。我无法从它连接到服务器。
await webSocket.ConnectAsync(new Uri("ws://45.143.93.104:8080"), CancellationToken.None);
我得出的结论是,我需要一个 Android 的 SSL/TLS 证书才能允许连接。但我不知道该怎么做。也涉及 IP。我没有域名...
有人能给我一些建议吗?这个证书是强制性的吗?没有其他办法了吗?稍后是否需要通过WSS来做?
Android 9+ (Pie,API 28)默认阻止所有未加密的(
ws://, )连接。http://可以通过添加权限来解决此问题AndroidManifest.xml:但这只是临时解决办法,因为谷歌正在积极推动
wss://,未来可能会有更严格的限制(如同http://)。最好立即使用它,wss://以避免将来出现问题。如果您仍然需要它,您可以使用 Let's Encrypt 通过Nginx
wss://转发 WebSocket - 然后您将毫无问题地获得真正的 WebSocket 。 Nginx 接受并且服务器继续在 VPS 内部运行。wss://wss://ws://Let's Encrypt 不为 IP 地址颁发证书,因此您需要注册一个域名并将其指向您的服务器。如果您不想这样做,您可以使用自签名证书。 Android 不信任自签名证书,因此您必须手动将其添加到每个设备。他们说您可以配置 Android 应用程序以信任自签名证书,这样您就不必手动将其添加到每个设备。但是我没有找到 Unity 的说明,只有这一个:使用 Android Native、Android Studio 和 retrofit 在本地网络中信任我自己的自签名证书。
安装 Nginx
让我们检查一下它是否有效:
如果没有运行,请运行它:
我们假设您的 C# 应用程序正在某个端口上运行
8080并且正在监听ws://123.123.123.123:8080。让我们检查服务器是否在本地运行:(注意)此示例
curl用作快速端口可用性检查,而不是成熟的 WebSocket 客户端。curl并不真正支持 WebSocket,因此您会收到如下错误:这是正常的,如果服务器有响应,则表示端口是开放的。
如果 WebSocket 服务器响应
ws://123.123.123.123:8080但无法访问ws://localhost:8080,则服务器仅在外部接口上监听。用于0.0.0.0使服务器监听所有连接。现在让我们从 Let's Encrypt 设置一个免费证书(替换
example.com为您的域名):如果您只有 IP(没有域名),Let's Encrypt 将不会颁发证书。在这种情况下,您将必须使用自签名证书(我将在最后解释)。
证书将保存在:
/etc/letsencrypt/live/example.com/fullchain.pem/etc/letsencrypt/live/example.com/privkey.pem检查证书是否已安装:
将 Nginx 设置为 WebSocket 反向代理
我们使用这里描述的协议切换机制:WebSocket 代理。
让我们创建一个将重定向
wss://到的Nginx 配置ws://:添加配置(不要忘记将其替换
example.com为您的域名):激活配置:
让我们检查一下语法:
重新启动Nginx:
现在您可以连接到
wss://example.com而不是ws://123.123.123.123:8080。通过(WebSocket 客户端)检查
wscat:如果一切正常,你应该会看到连接。
没有域名怎么办?
您可以生成自签名证书:
然后替换 Nginx 配置:
缺点:必须手动将此类证书添加到应用程序中。
是否有可能在没有 Nginx 的情况下将证书连接到 C# 服务器?
您可以配置您的 WebSocket 服务器以直接使用 Let's Encrypt 证书。
安装Certbot并运行命令:
证书存储在
/etc/letsencrypt/live/example.com/fullchain.pem和中privkey.pem。将文件转换pem为 PFX:现在您可以下载SslStream证书:
如果您将ASP.NET Core 与 Kestrel结合使用,请参阅文档的SSL/TLS 协议部分。
Let's Encrypt 颁发的证书有效期为 90 天,因此您需要自动续订。按计划执行命令:
您可以将其添加到cron (
crontab -e) 中:优点:
缺点:
80或443)。