php - 使用 Ratchet PHP 在 websocket 服务器中处理过期的 Let's Encyrpt SSL
问题描述
在阅读了几乎所有关于让 Websockets 的 Ratchet PHP 实现与 SSL 一起工作的文章之后,我终于在许多技巧的帮助下让它工作了,尽管主要是这里的信息https://github.com/ratchetphp/Ratchet/ issues/489基本上修改了您创建 IoServer 以使用 React 的安全服务器的方式。我在服务器端的 PHP 实现如下:
$loop = \React\EventLoop\Factory::create();
$secure_websockets = new \React\Socket\Server('0.0.0.0:8080', $loop);
$secure_websockets = new \React\Socket\SecureServer($secure_websockets, $loop, [
'local_cert' => '/path/to/letsencyrpt/cert.crt',
'local_pk' => '/path/to/letsencyrpt/key.key',
'verify_peer' => false
]);
$app = new \Ratchet\Http\HttpServer(
new \Ratchet\WebSocket\WsServer(
new Chat()
)
);
$server = new \Ratchet\Server\IoServer($app, $secure_websockets, $loop);
$server->run();
而在客户端的Javascript:
function startWebsocket() {
var conn = new WebSocket('wss://domain.com:port');
conn.onopen = function(e) {
console.log("Connection established!");
};
}
startWebsocket();
这很好用。
但是...我在服务器上使用 Let's Encrypt 证书,它们的生命周期相当短。这在 https 上很好,因为主机(Siteground)会在到期前自动更新 SSL,但如果我放置一个特定证书/密钥对的路径(如上所述),它们就会过期。
所以,我的选择是:
A:在我的日历中重复记录以提醒我每 3 个月更新一次证书/密钥路径并使用它,或者.. B:有没有办法发现当前的证书/密钥对并将其作为多变的?
需要记住的一些事项:
- 我在使用云服务器的 Siteground 上,但没有 root 访问权限(几年前我愚蠢地注册了“Geeky Features”,然后我的技术知识提高到足以让我需要 root)。
- 虽然我没有 root,但它实际上是一个专用服务器,所以我可以要求 Siteground 的支持人员为我进行更改 - 但我确实需要非常具体地处理任何请求。在这里尝试可能不是一个选择。
- 我探索了另一种获取 wss 的方法:使用 Ratchet,即将 https 请求代理到 ws 端口。并没有走得太远,因为安装的 Apache 版本似乎不够新,无法支持隧道,尽管在 Siteground 上提到了与 Apache 并行运行的 NGINX,但我每次尝试时都会出错用它来代理。没有root访问权限没有帮助,我能做的事情非常有限。
解决方案
推荐阅读
- elmah - 可以在 VSTS 版本中转换 ELMAH 主题吗?
- java - Vector not changing with "AES/CBC/pkcs7padding" in Java
- oracle - 为其他用户创建 FK 时 Oracle 表或视图不存在
- r - 如何在 ggplotly() 中使分组热图的列宽相同
- ios - 使用 AWS Comprehend iOS 的问题
- sql - 是否可以从单个字符创建一个字符串?
- python - 散点图 - 时间序列中 dx (dt) 的偏移点
- azure - Azure 流分析作业的同一输出中是否可以有多个查询?
- git - 在服务器端设置预接收挂钩
- ruby-on-rails - Ruby - 展平数组和散列的散列