You need to enable JavaScript to run this app. Linux Docker版Cosmos DB模拟器公网访问及自定义服务器证书使用问题
优惠活动
大模型
产品
解决方案
定价
更多

Linux Docker版Cosmos DB模拟器公网访问及自定义服务器证书使用问题

Cosmos DB Linux Docker模拟器跨主机访问问题解答

1. 是否可以使用自定义自签名证书替代模拟器自动生成的证书?

可以,你之前启动失败是配置和证书本身的问题,修正步骤如下:

  • 修正证书路径配置:你将宿主机的/home/user1/emulator/cosmos/appdata/挂载到了容器的/tmp/cosmos/appdata/,因此环境变量AZURE_COSMOS_EMULATOR_CERTIFICATE应该填容器内的路径/tmp/cosmos/appdata/self-signed-cosmos-cert.pfx,而不是宿主机路径。
  • 新增证书密码环境变量:添加AZURE_COSMOS_EMULATOR_CERTIFICATE_PASSWORD: "<你的PFX证书密码>"到environment配置中,即使你设置的是空密码也需要显式配置。
  • 生成符合要求的自签名证书:证书必须包含SAN(使用者备用名称)扩展,覆盖你需要用到的主机名、公网IP,同时开启服务器身份验证的密钥用法,可通过以下openssl命令生成:
    # 生成密钥和证书
    openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
      -keyout cosmos.key -out cosmos.crt \
      -subj "/CN=azurecosmosemulator" \
      -addext "subjectAltName=DNS:azurecosmosemulator,IP:<替换为你的公网IP>" \
      -addext "extendedKeyUsage=serverAuth"
    # 导出为PFX格式
    openssl pkcs12 -export -out self-signed-cosmos-cert.pfx \
      -inkey cosmos.key -in cosmos.crt \
      -password pass:<替换为你设置的证书密码>
    

配置正确后模拟器即可正常加载自定义证书,后续容器重建只要复用这个证书,Java端无需重复导入。

2. 其他可行的跨主机访问解决方案

如果你不想维护自定义证书,有两种更简单的方案适配azure-spring-boot-starter-cosmos:

  • 直接添加Java启动参数禁用证书主机名校验:Azure Cosmos Java SDK原生支持参数-Dcosmos.emulator.ssl.endpoint.identification.algorithm=,直接在Java应用的启动命令中添加该参数即可跳过主机名校验,无需修改任何代码。
  • 通过自定义配置修改HttpClient校验逻辑:你可以注入CosmosClientBuilderCustomizer Bean来修改底层Reactor Netty配置,示例代码如下:
    import com.azure.spring.data.cosmos.config.CosmosClientBuilderCustomizer;
    import com.azure.cosmos.http.NettyAsyncHttpClientBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class CosmosConfig {
        @Bean
        public CosmosClientBuilderCustomizer disableHostnameVerifyCustomizer() {
            return builder -> builder.httpClient(
                NettyAsyncHttpClientBuilder.create()
                    .disableHostnameVerification()
                    .build()
            );
        }
    }
    

3. 模拟器是否仅支持本地部署,不支持公网IP访问?

不是,官方明确支持远程/公网IP访问,你之前配置IP_OVERRIDE后出现连接超时是网络配置错误导致的:
你同时开启了network_mode: "host"和设置AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE为公网IP,绝大多数云服务器的公网IP是NAT映射的弹性IP,并未直接绑定在宿主机网卡上,模拟器会尝试监听不存在的公网IP,导致RNTBD协议端口绑定失败,出现连接超时错误。
修正方案:

  • 删掉network_mode: "host"配置,使用默认的bridge网络模式,保留端口映射配置
  • 安全组/防火墙放开所有映射的端口(8081、10250-10256等)的公网入方向规则
  • 保留AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE: <你的公网IP>配置即可正常通过公网IP访问

内容的提问来源于stack exchange,提问作者Pandey Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:09:03