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 vs. Spring Boot 1
Spring Boot Webflux/Netty - 检测关闭的连接