You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在http4s BlazeServerBuilder服务端启用hostNameVerifier

在http4s Blaze服务端启用主机名验证的实现方法

由于http4s Blaze服务器默认不提供服务端主机名验证的直接配置项,你需要通过自定义SSLEngine配置来实现和Akka HTTP一致的主机名验证逻辑(检查证书的CN/SAN与请求主机名匹配),具体步骤如下:

1. 核心思路

http4s基于Java的SSL体系构建服务端SSL逻辑,服务端主机名验证需要通过调整SSLEngine的参数来启用——通过设置SSLParameters的端点识别算法,或自定义HostnameVerifier实现验证逻辑。

2. 具体实现代码

2.1 基础版:启用标准HTTPS主机名验证

先创建一个自定义的SSLEngine提供者,在服务端模式下启用标准的主机名验证:

import org.http4s.blaze.server.BlazeServerBuilder
import org.http4s.{HttpApp, IO}
import javax.net.ssl.{SSLContext, SSLEngine, SSLParameters}
import scala.concurrent.ExecutionContextExecutor

// 生成带主机名验证的SSLEngine
def createSslEngineWithHostnameVerification(sslContext: SSLContext): String => SSLEngine = { (addr: String) =>
  val engine = sslContext.createSSLEngine()
  engine.setUseClientMode(false) // 切换为服务端模式

  // 启用标准HTTPS主机名验证,自动检查证书CN/SAN与请求主机名匹配
  val sslParams = engine.getSSLParameters
  sslParams.setEndpointIdentificationAlgorithm("HTTPS")
  engine.setSSLParameters(sslParams)

  engine
}

// 构建Blaze服务器
def buildSecureServer(httpApp: HttpApp[IO], sslContext: SSLContext)(implicit ec: ExecutionContextExecutor): IO[Unit] = {
  BlazeServerBuilder[IO](ec)
    .bindHttp(443, "0.0.0.0")
    .withSslContext(sslContext) // 传入你的SSLContext(从密钥库加载等方式获取)
    .withSslEngineProvider(createSslEngineWithHostnameVerification(sslContext)) // 应用自定义SSLEngine配置
    .withHttpApp(httpApp)
    .resource
    .use(_ => IO.never) // 保持服务器运行
    .as(())
}

2.2 进阶版:自定义主机名验证逻辑

如果需要替换默认的验证规则(比如自定义允许的主机名列表),可以实现自己的HostnameVerifier:

import javax.net.ssl.HostnameVerifier

// 自定义主机名验证器
val customHostnameVerifier: HostnameVerifier = (requestedHostname, sslSession) => {
  // 这里实现你的验证逻辑,比如检查主机名是否在白名单内
  val allowedHosts = Set("your-domain.com", "api.your-domain.com")
  allowedHosts.contains(requestedHostname)
}

// 修改SSLEngine生成逻辑
def createCustomSslEngine(sslContext: SSLContext): String => SSLEngine = { (addr: String) =>
  val engine = sslContext.createSSLEngine()
  engine.setUseClientMode(false)
  
  // 禁用默认算法,使用自定义验证器
  val sslParams = engine.getSSLParameters
  sslParams.setEndpointIdentificationAlgorithm(null)
  engine.setSSLParameters(sslParams)
  engine.setHostnameVerifier(customHostnameVerifier)

  engine
}

3. 补充说明

  • 你需要自行准备合法的SSLContext(通常通过加载密钥库和信任库文件生成),这部分逻辑和http4s的常规SSL配置一致。
  • Akka HTTP服务端默认启用主机名验证属于特殊行为(通常主机名验证是客户端防范中间人攻击的手段),http4s遵循Java SSL的默认规范,因此需要手动配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:45:27