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

Spring Boot 2 using Webflux, Netty and HTTP2, causing invalid certificate, possible misconfiguration

关于使用 HTTP2..配置 Netty 和 Webflux,我发现的信息不多

我过去使用过类似的配置,但没有使用基于反应器的 spring 引导模块,通常是 spring 引导 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 returns 返回执行器数据,所以我遗漏了一些基于 netty reactor 的配置,我对它相当陌生。

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

的原因

要修复,请删除第 6 行 (server:) 和后缩进行“ssl:”及后续行。这会给你(例如) server.ssl.enabled=true 而不是 server.server.ssl.enabled=true