TLS 加密示例代码

最近更新时间:2025-12-10 10:45:21

我的收藏
本文为 TDMQ RabbitMQ 开源托管版 TLS 加密连接的配套示例代码文档,需结合《为客户端接入点配置 TLS 加密》使用。

前提条件

在运行代码前,需完成控制台配置及本地环境准备。
TDMQ RabbitMQ 集群控制台已绑定证书,并对接入点开启 TLS 加密,记录分配的 TLS 5671 端口及域名。
TDMQ RabbitMQ 集群中已创建 Vhost、Exchange 和 Queue,且配置 Exchange 和 Queue 的绑定关系。

示例代码(Java)

代码是同时支持单向/双向认证,根据注释标注两种场景的配置差异,您可以根据实际使用的认证方式调整代码。
package org.tencent.tdmq;

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.concurrent.TimeoutException;

public class Main {
public static void main(String[] args) throws
KeyStoreException,
IOException,
NoSuchAlgorithmException,
CertificateException,
UnrecoverableKeyException,
KeyManagementException,
TimeoutException {
/*
* KeyStore相关信息,只有在开启双向认证的前提下需要填写,单向认证时删除以下代码即可。
* 可以通过以下命令生成client_key.p12:
*
* openssl pkcs12 -export \\
* -in client_amqp-jbgdbk2n.com_certificate.pem \\ # 客户端证书
* -inkey client_amqp-jbgdbk2n.com_key.pem \\ # 客户端私钥
* -out client_key.p12 \\
* -passout pass:bunnies # KeyStore密码
*/
char[] keyPassphrase = "bunnies".toCharArray();
KeyStore ks = KeyStore.getInstance("PKCS12");
// client_key.p12的位置
ks.load(
Files.newInputStream(Paths.get("/path/to/client_key.p12")),keyPassphrase
);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keyPassphrase);

/*
* TrustStore相关信息,可以通过以下命令生成server_certificate.p12:
*
* keytool -import -file server_VM-0-35-tencentos_certificate.pem \\ # 服务端证书
* -keystore server_certificate.p12 \\
* -storepass bunnies \\ # TrustStore密码
* -storetype PKCS12 -noprompt
*/
char[] trustPassphrase = "bunnies".toCharArray();
KeyStore tks = KeyStore.getInstance("PKCS12");
// server_certificate.p12的位置
tks.load(
Files.newInputStream(Paths.get("/path/to/server_certificate.p12")),trustPassphrase
);

TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(tks);

SSLContext c = SSLContext.getInstance("TLSv1.2");
// 单向认证时第一个参数填null即可
c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

/*
* 证书绑定的域名,需要将其CNAME到服务端提供的域名上,例如:
* amqp-jbgdbk2n.com --CNAME-> amqp-jbgdbk2n-gz-hv4udh8p-jcqw88jc-x.amqp.tencenttdmq.com
*/
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("amqp-jbgdbk2n.com");
// TLS加密端口,一般为5671
factory.setPort(5671);
factory.useSslProtocol(c);
factory.enableHostnameVerification();
// 以下信息根据实际情况填写
factory.setVirtualHost("/");
factory.setUsername("admin");
factory.setPassword("password");

// 连接能正常建立即代表成功
Connection conn = factory.newConnection();
}
}