我想使用 Quarkus RabbitMQ Connector 连接到 RabbitMQ Broker(队列)。客户需要同行验证和客户端证书身份验证(而不是用户名/密码)。不幸的是,我找不到如何配置客户端证书的示例。
在Quarkus的描述中,我发现他的Vert.x RabbitMQ客户端是可以定制的(https://quarkus.io/guides/rabbitmq-reference#customizing-the-underlying-rabbitmq-client)。我有 .crt 形式的服务器证书(运行 RabbitMQ 代理的位置)和 .key 文件形式的密钥文件。我还有 .pem 文件形式的客户端证书,其中包含证书链和加密的私钥。
------开始证书-----
计算机紧急响应小组
-----证书结束-----
-----开始证书-----
计算机紧急响应小组
-----证书结束-----
-----开始证书-----
计算机紧急响应小组
-----证书结束-----
-----开始加密私钥-----
-----加密私钥结束-----
有人有客户端证书认证和RabbitMQ的经验吗?
我目前不确定客户端证书身份验证是否适用于 Quarkus 和 RabbitMQ 连接器。对于底层 vert.x 客户端,我只能配置一个信任库(https://vertx.io/docs/vertx-rabbitmq-client/java/#_jks_trust_store_option)。我在那里设置了服务器证书文件和密码。或者我应该创建一个自己的密钥库,其中包含服务器证书和客户端证书?这可能吗?
您不需要需要服务器的私钥!这将违背服务器保密的目的。
如果您的 RabbitMQ 服务器(或放置在其前面的代理,用于终止 TLS 流量)使用自签名证书(未由受信任的 CA 签名),则需要将此配置部分添加到您的 RabbitMQ 客户端:
PemTrustOptions trust = new PemTrustOptions().addCertPath("./tlc/ca.crt");
RabbitMQOptions options = new RabbitMQOptions()
.setSsl(true)
.setPemTrustOptions(trust)
// ... the rest of configuration options
其中
./tlc/ca.crt
包含已签署服务器证书的 CA 的公钥(也称为证书)。
我建议首先尝试在没有客户端证书的情况下完成这项工作。
如果要启用对等验证,则必须向 RabbitMQ 客户端提供客户端的私钥和公钥,如下所示:
PemKeyCertOptions keycert = new PemKeyCertOptions()
.addCertPath("./tls/tls.crt")
.addKeyPath("./tls/tls.key");
RabbitMQOptions options = new RabbitMQOptions()
.setSsl(true)
.setPemKeyCertOptions(keycert)
// ... the rest of configuration options
其中
./tls/tls.crt
是公钥,./tls/tls.key
是您的客户端证书的私钥。
此外,请确保 RabbitMQ 配置为对等验证。如果您的 RabbitMQ 服务器不处理 TLS 流量,请阅读如何在更高一层执行此操作(如果您的 RabbitMQ 服务器位于 HaProxy、Nginx 等后面)。
如果您的客户端证书是自签名的,您需要通知服务器(RabbitMQ 或 TLS 终止代理)它可以信任。建立这种信任的具体步骤超出了本文的范围。