前提条件
在运行代码前,需完成控制台配置及本地环境准备。
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) throwsKeyStoreException,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加密端口,一般为5671factory.setPort(5671);factory.useSslProtocol(c);factory.enableHostnameVerification();// 以下信息根据实际情况填写factory.setVirtualHost("/");factory.setUsername("admin");factory.setPassword("password");// 连接能正常建立即代表成功Connection conn = factory.newConnection();}}