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
关于使用 HTTP2..配置 Netty 和 Webflux,我发现的信息不多
我过去使用过类似的配置,但没有使用基于反应器的 spring 引导模块,通常是 spring 引导 web。我已经在下面发布了我的步骤。 问题是 SSL 无法与 Netty 一起正常工作。在设置方面我需要做更多的工作吗?希望得到一些指示或例子来理解如何正确地确认这一点。 生成证书 生成对本地开发人员使用有效的证书: 输出:证书 使用 openssl 生成密钥库: 应用程序文件 运行 和请求 执行相同的请求命令,但使用您期望的 http returns 返回执行器数据,所以我遗漏了一些基于 netty reactor 的配置,我对它相当陌生。
mkcert localhost 127.0.0.1
localhost+1.pem
密钥localhost+1-key.pem
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`
您的 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