在GitLab流水线中使用Testcontainers运行Keycloak时遇HTTPS要求错误
解决GitLab流水线中Testcontainers+Keycloak的HTTPS强制要求问题
问题分析
本地用start-dev启动Keycloak容器测试正常,但GitLab流水线中调用GetDiscoveryDocumentAsync时触发HTTPS required错误,核心原因是:
- Keycloak在容器网络环境下自动检测的Base URL可能被识别为HTTPS(比如容器内部网络的默认配置或GitLab Runner的网络逻辑)
- IdentityModel默认对非本地地址强制要求HTTPS
解决方案
1. 显式配置Keycloak强制使用HTTP
修改容器启动命令,添加参数禁用HTTPS严格检查并明确启用HTTP:
new ContainerBuilder() .WithName("Keycloak-Client-Test-" + Guid.NewGuid().ToString("D")) .WithImage("quay.io/keycloak/keycloak:21.0.1") .WithPortBinding(privateKeycloakPort, true) .WithResourceMapping(new FileInfo("ContainerData/clienttest-realm.json"), new FileInfo("/opt/keycloak/data/import/realm.json")) .WithCommand( "start-dev", "--import-realm", "--http-enabled=true", "--hostname-strict=false", "--hostname-strict-https=false" ) .WithWaitStrategy(Wait.ForUnixContainer().UntilHttpRequestIsSucceeded(r => r.ForPort(privateKeycloakPort))) .Build();
同时在导入的clienttest-realm.json中,给realm指定HTTP格式的发行地址:
{ "realm": "clienttest", "accessTokenIssuer": "http://docker:${MAPPED_PORT}/realms/clienttest", "baseUrl": "http://docker:${MAPPED_PORT}/realms/clienttest", // 其他原有配置... }
注:${MAPPED_PORT}可通过Testcontainers的GetMappedPort方法获取实际映射端口后动态替换。
2. 让IdentityModel允许HTTP访问
在调用发现文档接口时,显式关闭HTTPS强制要求(仅用于测试环境):
var discoveryDoc = await httpClient.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest { Address = "http://docker:32769/realms/clienttest", Policy = new DiscoveryPolicy { RequireHttps = false } });
3. 确认Testcontainers的访问地址正确性
在代码中输出容器的实际访问地址,验证是否为HTTP格式:
var keycloakContainer = // 你的容器实例 var actualBaseUrl = $"http://{keycloakContainer.Hostname}:{keycloakContainer.GetMappedPort(privateKeycloakPort)}"; // 输出到日志用于调试 Console.WriteLine($"Keycloak测试访问地址: {actualBaseUrl}");
验证步骤
- 应用修改后重新运行GitLab流水线测试
- 若仍报错,添加日志输出Keycloak返回的发现文档内容,检查
issuer、authorization_endpoint等字段是否为HTTP地址
内容的提问来源于stack exchange,提问作者Eelke
相关产品推荐
相关产品推荐

