我在 AWS ElastiCache 中使用 Memcached,并启用了传输中加密作为安全要求。
但是,在客户端,当尝试连接到启用了传输中加密的新缓存集群时,连接立即失败,并出现以下错误。
Error: read ECONNRESET
我使用客户端 memcached-elasticache,它本质上是围绕客户端 memcached 进行集群节点自动发现。这个客户端并不容易使用,但它们是迄今为止我在开源世界中找到的最好的客户端。
但是,引用自述文件,该客户端尚不支持 TLS(传输层安全性),这是在服务器集群中启用传输中加密后所需要的。
与其他数据库和消息队列一样,该模块使用 ASCII 协议与服务器通信,这意味着您可以看到通过线路发送的内容。对于调试来说,这对用户和开发人员来说都更容易,但这也意味着不支持 SASL 身份验证,因为它需要二进制协议。
我相信这就是我因为网络协议不匹配而立即重置连接的原因。此开源包中有一个未解决的问题,人们正在询问 TLS 支持。
现有的 Memcached JS/TS 客户端是否具有完整的 TLS 支持?
对于 Java,我们建议您使用支持 TLS 的 memcached Java 客户端 https://github.com/awslabs/aws-elasticache-cluster-client-memcached-for-java
对于 PHP,我们建议您使用支持 TLS 的 PHP 客户端。 https://github.com/awslabs/aws-elasticache-cluster-client-memcached-for-php
对于 Python,pymemcache 客户端支持 TLS https://pypi.org/project/pymemcache/
对于 Rust,我发现了这个支持 TLS 的 rust-memcache 客户端https://crates.io/crates/memcache
对于 Ruby,有 memcached Dalli 客户端支持 TLS https://github.com/petergoldstein/dalli
到目前为止,我还不知道有任何 NodeJS 或 C# .NET 客户端支持 TLS。
我们最近为 electrode-io memcache 客户端 提供了 TLS 支持。除了 NodeJS 之外,它还支持 Typescript。它可以在NPM上获得。
如果memcached服务器配置了TLS,您可以通过指定
tls
ConnectionOptions让客户端连接到它。对于生产环境,服务器应使用由受信任的公共 CA 签名的 TLS 证书。在
在这种情况下,您可以简单地执行以下操作来创建客户端:
import MemcacheClient from "memcache-client";
const client = new MemcacheClient({server: "{server_hostname}:11211", tls: {}});
client.set("key", "value");
如果服务器需要客户端证书认证,可以执行以下操作:
import MemcacheClient from "memcache-client";
import Fs from "fs";
const client = new MemcacheClient({server: "{server_hostname}:11211", tls: {
key: Fs.readFileSync("client-key.pem"),
cert: Fs.readFileSync("client-cert.pem"),
}});
client.set("key", "value");
如果您使用自签名证书运行服务器(即用于本地开发),您可以创建客户端 通过指定 CA 证书并禁用主机名验证,如下所示:
import MemcacheClient from "memcache-client";
import Fs from "fs";
const client = new MemcacheClient({server: "localhost:11211", tls: {
ca: Fs.readFileSync("ca-cert.pem"),
checkServerIdentity: () => {return undefined;}
}});
client.set("key", "value");