Symfony集成LocalStack SQS时无法禁用SSL?证书匹配错误求助
问题:Symfony Messenger连接LocalStack SQS时SSL禁用失效的解决办法
场景与配置
我在Symfony应用中尝试使用LocalStack搭建本地SQS服务,相关配置如下:
Docker Compose配置
services: php: container_name: php build: context: ./php args: TIMEZONE: ${TIMEZONE} volumes: - ../:/var/www/symfony:cached - symfony_app_var:/var/www/symfony/var - symfony_app_vendor:/var/www/symfony/vendor networks: - symfony_app extra_hosts: - "host.docker.internal:host-gateway" localstack: container_name: localstack image: localstack/localstack ports: - "4566:4566" # main edge port for all services - "4510-4559:4510-4559" # optional: service-specific ports environment: - SERVICES=sqs # only start SQS (you can add more: s3,sns,etc.) - DEBUG=1 - DATA_DIR=/tmp/localstack/data - LOCALSTACK_API_KEY=${LOCALSTACK_API_KEY-} # optional, for Pro volumes: - "./localstack:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock" networks: - symfony_app
安装依赖
composer require symfony/amazon-sqs-messenger
Symfony Messenger配置
framework: messenger: transports: async: '%env(MESSENGER_TRANSPORT_DSN)%' failed: 'doctrine://default?table_name=failed_messages' sqs_channel_manager: dsn: 'sqs://localstack:4566' serializer: App\Infrastructure\Messenger\SqsJsonSerializer options: access_key: '%env(AWS_ACCESS_KEY_ID)%' secret_key: '%env(AWS_SECRET_ACCESS_KEY)%' region: '%env(AWS_REGION)%' queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%' sslmode: false
执行监听命令及错误
执行队列监听命令:
php -d memory_limit=-1 bin/console messenger:consume async sqs_channel_manager -vv
出现错误:
18:32:12 INFO [messenger] Try #1 after 1056ms: SSL: no alternative certificate subject name matches target host name 'localstack' for "https://localstack:4566/". ["count" => 1,"delay" => 1056]
原因分析
sslmode: false选项并非用来切换HTTP/HTTPS协议,它仅控制是否验证SSL证书的有效性。Symfony的Amazon SQS Messenger传输默认会使用HTTPS协议连接,但LocalStack默认在4566端口提供的是HTTP服务,因此会出现SSL证书不匹配的错误。
解决方法
需要明确指定使用HTTP协议连接LocalStack,有两种可行方式:
方式一:在DSN中添加scheme参数
修改SQS传输的DSN,通过scheme=http强制使用HTTP协议:
sqs_channel_manager: dsn: 'sqs://localstack:4566?scheme=http' serializer: App\Infrastructure\Messenger\SqsJsonSerializer options: access_key: '%env(AWS_ACCESS_KEY_ID)%' secret_key: '%env(AWS_SECRET_ACCESS_KEY)%' region: '%env(AWS_REGION)%' queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'
方式二:在options中指定endpoint
直接在options里配置HTTP协议的endpoint地址:
sqs_channel_manager: dsn: 'sqs://localstack:4566' serializer: App\Infrastructure\Messenger\SqsJsonSerializer options: access_key: '%env(AWS_ACCESS_KEY_ID)%' secret_key: '%env(AWS_SECRET_ACCESS_KEY)%' region: '%env(AWS_REGION)%' queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%' endpoint: 'http://localstack:4566'
两种方式都能强制Symfony使用HTTP连接LocalStack的SQS服务,从而避免SSL相关错误。
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

