|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +# TLS test setup script for CI and local development |
| 4 | +# Generates certificates using tls-gen and configures RabbitMQ with TLS-enabled management API |
| 5 | + |
| 6 | +set -e |
| 7 | + |
| 8 | +CTL=${RUST_HTTP_API_CLIENT_RABBITMQCTL:="sudo rabbitmqctl"} |
| 9 | +PLUGINS=${RUST_HTTP_API_CLIENT_RABBITMQ_PLUGINS:="sudo rabbitmq-plugins"} |
| 10 | + |
| 11 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 12 | +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" |
| 13 | +CERTS_DIR="${REPO_ROOT}/tests/tls/certs" |
| 14 | + |
| 15 | +# Docker container ID (passed via environment or extracted from CTL) |
| 16 | +CONTAINER_ID="" |
| 17 | + |
| 18 | +case $CTL in |
| 19 | + DOCKER*) |
| 20 | + CONTAINER_ID="${CTL##*:}" |
| 21 | + PLUGINS="docker exec ${CONTAINER_ID} rabbitmq-plugins" |
| 22 | + CTL="docker exec ${CONTAINER_ID} rabbitmqctl" |
| 23 | + ;; |
| 24 | +esac |
| 25 | + |
| 26 | +echo "Will use rabbitmqctl at ${CTL}" |
| 27 | +echo "Will use rabbitmq-plugins at ${PLUGINS}" |
| 28 | + |
| 29 | +# Create certs directory |
| 30 | +mkdir -p "${CERTS_DIR}" |
| 31 | + |
| 32 | +# Check if tls-gen is available |
| 33 | +TLSGEN_DIR="${TLSGEN_DIR:-}" |
| 34 | +if [ -z "$TLSGEN_DIR" ]; then |
| 35 | + echo "TLSGEN_DIR not set, cloning tls-gen..." |
| 36 | + TLSGEN_DIR="${REPO_ROOT}/target/tls-gen" |
| 37 | + if [ ! -d "$TLSGEN_DIR" ]; then |
| 38 | + git clone --depth 1 https://github.com/rabbitmq/tls-gen.git "$TLSGEN_DIR" |
| 39 | + fi |
| 40 | +fi |
| 41 | + |
| 42 | +echo "Using tls-gen at ${TLSGEN_DIR}" |
| 43 | + |
| 44 | +# Generate certificates using basic profile |
| 45 | +cd "${TLSGEN_DIR}/basic" |
| 46 | +make CN=localhost |
| 47 | +make alias-leaf-artifacts |
| 48 | + |
| 49 | +# Copy certificates to the test directory |
| 50 | +cp result/ca_certificate.pem "${CERTS_DIR}/" |
| 51 | +cp result/server_certificate.pem "${CERTS_DIR}/" |
| 52 | +cp result/server_key.pem "${CERTS_DIR}/" |
| 53 | +cp result/client_certificate.pem "${CERTS_DIR}/" |
| 54 | +cp result/client_key.pem "${CERTS_DIR}/" |
| 55 | + |
| 56 | +# Create PKCS#12 client identity for native-tls compatibility |
| 57 | +openssl pkcs12 -export \ |
| 58 | + -out "${CERTS_DIR}/client_identity.p12" \ |
| 59 | + -inkey "${CERTS_DIR}/client_key.pem" \ |
| 60 | + -in "${CERTS_DIR}/client_certificate.pem" \ |
| 61 | + -certfile "${CERTS_DIR}/ca_certificate.pem" \ |
| 62 | + -passout pass: |
| 63 | + |
| 64 | +echo "Certificates generated and copied to ${CERTS_DIR}" |
| 65 | + |
| 66 | +# Create RabbitMQ configuration for TLS |
| 67 | +RABBITMQ_CONF="${CERTS_DIR}/rabbitmq.conf" |
| 68 | +cat > "${RABBITMQ_CONF}" << 'EOF' |
| 69 | +# Enable TLS on management plugin |
| 70 | +management.ssl.port = 15671 |
| 71 | +management.ssl.cacertfile = /certs/ca_certificate.pem |
| 72 | +management.ssl.certfile = /certs/server_certificate.pem |
| 73 | +management.ssl.keyfile = /certs/server_key.pem |
| 74 | +
|
| 75 | +# Keep HTTP enabled for other tests |
| 76 | +management.tcp.port = 15672 |
| 77 | +loopback_users = none |
| 78 | +EOF |
| 79 | + |
| 80 | +echo "RabbitMQ TLS configuration written to ${RABBITMQ_CONF}" |
| 81 | + |
| 82 | +# If using Docker, start a container with TLS configuration |
| 83 | +if [ -n "$CONTAINER_ID" ]; then |
| 84 | + echo "Note: Docker service container ${CONTAINER_ID} detected." |
| 85 | + echo "For TLS tests, use a standalone Docker container instead." |
| 86 | + echo "" |
| 87 | + echo "To start RabbitMQ with TLS manually:" |
| 88 | + echo " docker run -d --name rabbitmq-tls \\" |
| 89 | + echo " -p 15671:15671 -p 15672:15672 -p 5672:5672 \\" |
| 90 | + echo " -v ${CERTS_DIR}:/certs:ro \\" |
| 91 | + echo " -v ${RABBITMQ_CONF}:/etc/rabbitmq/conf.d/10-tls.conf:ro \\" |
| 92 | + echo " rabbitmq:4.0-management" |
| 93 | +fi |
| 94 | + |
| 95 | +# Enable management plugin (should already be enabled in the management image) |
| 96 | +$PLUGINS enable rabbitmq_management |
| 97 | + |
| 98 | +sleep 3 |
| 99 | + |
| 100 | +# Configure vhosts and users (same as before_build.sh) |
| 101 | +$CTL add_vhost / |
| 102 | +$CTL add_user guest guest || true |
| 103 | +$CTL set_permissions -p / guest ".*" ".*" ".*" |
| 104 | + |
| 105 | +$CTL add_user rust3 rust3 || true |
| 106 | +$CTL set_permissions -p / rust3 ".*" ".*" ".*" |
| 107 | + |
| 108 | +# Reduce retention policy for faster publishing of stats |
| 109 | +$CTL eval 'supervisor2:terminate_child(rabbit_mgmt_sup_sup, rabbit_mgmt_sup), application:set_env(rabbitmq_management, sample_retention_policies, [{global, [{605, 1}]}, {basic, [{605, 1}]}, {detailed, [{10, 1}]}]), rabbit_mgmt_sup_sup:start_child().' |
| 110 | +$CTL eval 'supervisor2:terminate_child(rabbit_mgmt_agent_sup_sup, rabbit_mgmt_agent_sup), application:set_env(rabbitmq_management_agent, sample_retention_policies, [{global, [{605, 1}]}, {basic, [{605, 1}]}, {detailed, [{10, 1}]}]), rabbit_mgmt_agent_sup_sup:start_child().' |
| 111 | + |
| 112 | +$CTL add_vhost "rust/http/api/client" || true |
| 113 | +$CTL set_permissions -p "rust/http/api/client" guest ".*" ".*" ".*" |
| 114 | + |
| 115 | +# Set cluster name |
| 116 | +$CTL set_cluster_name rabbitmq@localhost |
| 117 | + |
| 118 | +$CTL enable_feature_flag all |
| 119 | + |
| 120 | +# Enable additional plugins |
| 121 | +$PLUGINS enable rabbitmq_shovel |
| 122 | +$PLUGINS enable rabbitmq_shovel_management |
| 123 | +$PLUGINS enable rabbitmq_federation |
| 124 | +$PLUGINS enable rabbitmq_federation_management |
| 125 | +$PLUGINS enable rabbitmq_stream |
| 126 | +$PLUGINS enable rabbitmq_stream_management |
| 127 | + |
| 128 | +# Export certificate paths for tests |
| 129 | +echo "" |
| 130 | +echo "=== TLS Test Environment ===" |
| 131 | +echo "CA Certificate: ${CERTS_DIR}/ca_certificate.pem" |
| 132 | +echo "Client Certificate: ${CERTS_DIR}/client_certificate.pem" |
| 133 | +echo "Client Key: ${CERTS_DIR}/client_key.pem" |
| 134 | +echo "TLS Endpoint: https://localhost:15671/api" |
| 135 | +echo "" |
| 136 | +echo "To run TLS tests:" |
| 137 | +echo " TLS_CERTS_DIR=${CERTS_DIR} cargo nextest run -E 'binary(async_tls_tests) | binary(blocking_tls_tests)' --run-ignored=only --all-features" |
| 138 | +echo "" |
| 139 | + |
| 140 | +true |
0 commit comments