Spring Boot 2 使用 Webflux、Netty 和 HTTP2,导致证书无效,可能配置错误

Posted

技术标签:

【中文标题】Spring Boot 2 使用 Webflux、Netty 和 HTTP2,导致证书无效,可能配置错误【英文标题】:Spring Boot 2 using Webflux, Netty and HTTP2, causing invalid certificate, possible misconfiguration 【发布时间】:2021-05-23 11:34:23 【问题描述】:

我没有找到太多关于使用 HTTP2 配置 Netty 和 Webflux的信息。

我过去使用过类似的配置,但没有使用基于反应器的 Spring Boot 模块,通常是 Spring Boot Web。我已经在下面发布了我的步骤。

问题是 SSL 不能与 Netty 一起正常工作。在设置方面我需要更多的工作吗?希望得到一些指示或示例,以了解如何正确配置。

生成的证书

生成对本地开发人员使用有效的证书mkcert localhost 127.0.0.1

输出:证书localhost+1.pem密钥localhost+1-key.pem

使用 openssl 生成密钥库openssl pkcs12 -export -in localhost+1.pem -inkey localhost+1-key.pem -out keystore.p12 -name localdev

应用程序文件

application.yaml

server:
  port: 8443
  shutdown: graceful
  http2:
    enabled: true
  server:
    ssl:
      enabled: true
      #format of the keystore
      key-store-type: PKCS12
      #path to the keystore containing the cert
      key-store: classpath:keystore.p12
      #pw used to gen the keystore
      key-store-password: password
      #alias mapped to the certificate inside the keystore
      key-alias: localdev

build.gradle

plugins 
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id "com.google.osdetector" version "1.7.0"



dependencies 
    //HTTP2 Reactive Netty (auto-configured version via spring dependency BOM)
    runtimeOnly ("io.netty:netty-tcnative-boringssl-static::$osdetector.classifier")

    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'  
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'

    runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
    runtimeOnly 'io.r2dbc:r2dbc-postgresql'

    
    testImplementation ('org.springframework.boot:spring-boot-starter-test') 
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testImplementation 'io.projectreactor:reactor-test'

运行和请求

application running

2021-02-20 17:20:43.122  INFO 1 --- [main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8443
2021-02-20 17:20:43.143  INFO 1 --- [main] d.c.test.store.Application               : Started Application in 6.655 seconds (JVM running for 7.826)

curl request

curl --cert --http2 localhost+1.pem --key localhost+1-key.pem --insecure https://localhost:8443/actuator/health

Error response

curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number`

执行相同的请求命令,但使用 http 会返回您所期望的执行器数据,所以我缺少一些基于 netty reactor 的配置,我对它相当陌生。

Similiar question

【问题讨论】:

【参考方案1】:

您的 application.yml 文件不正确。 ssl 属性实际上位于 server.server.ssl 而不是 server.ssl。因此 SSL 设置无效,您的服务器是 HTTP 服务器而不是 HTTPS 服务器。这就是 curl 与 http 一起使用的原因。

要修复,请删除第 6 行(服务器:)并返回缩进行“ssl:”和以下内容。这会给你(例如) server.ssl.enabled=true 而不是 server.server.ssl.enabled=true

【讨论】:

哦,我真累,哎呀:'(就是这样……但是,仍然是 SSL 错误 我不会删除它,可能会帮助其他人设置所需的东西......教训我自己远离电脑哈哈。谢谢圭多。看起来我的密钥库已经损坏了。

以上是关于Spring Boot 2 使用 Webflux、Netty 和 HTTP2,导致证书无效,可能配置错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 Webflux的全局异常处理

Spring Boot 2 反应式 webflux

原始性能表格 - Spring Boot 2 Webflux vs. Spring Boot 1

Spring Boot Webflux/Netty - 检测关闭的连接

如何使用 Spring Boot 对 WebFlux 进行异常处理?

如何在 Spring boot 2 + Webflux + Thymeleaf 中配置 i18n?