【问题标题】:Spring WebFlux Netty SSL with Self Signed Certificate error带有自签名证书错误的 Spring WebFlux Netty SSL
【发布时间】:2019-10-17 11:54:27
【问题描述】:

我正在尝试使用服务器端的自签名证书通过 localhost 中的 https 访问在 Netty 上运行的 Spring Boot 应用程序。

我的application.properties 看起来像这样:

server.ssl.enabled=true
server.ssl.key-store-type=JKS
server.ssl.key-store=test.jks
server.ssl.key-store-password=password
server.ssl.key-alias=testkey

我通过以下方式生成了密钥库:

keytool -genkeypair -alias testkey -keyalg RSA -keysize 4096 -keystore test.jks -validity 36500

我收到以下错误:

io.netty.handler.codec.DecoderException:javax.net.ssl.SSLHandshakeException:收到致命警报:certificate_unknown 在 io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:472) 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)

我尝试将证书导入 JDK 信任库,甚至导入操作系统,但仍然相同。一位消息人士建议将密钥别名命名为“testkey”以使其工作,但这也不起作用。由于 Google 中没有其他提及此错误的信息,因此希望您能提供帮助。

【问题讨论】:

    标签: ssl netty spring-webflux reactor-netty


    【解决方案1】:

    我设法通过使用https://github.com/FiloSottile/mkcert 生成本地有效证书来解决问题

    【讨论】:

    • 看起来 Netty 正在验证自签名证书中的 SAN(主题备用名称)。将 localhost, 127.0.0.1 添加到 SAN 后,当 localhost 客户端使用 HTTPS 连接到服务器时,此错误就会消失
    【解决方案2】:

    扩展@Peter 答案-

    https://github.com/FiloSottile/mkcert/releases 下载 mkcert 版本或直接从源代码构建。

    在 Windows 上生成 p12 格式的自签名证书 -

    mkcert-v1.4.1-windows-amd64.exe -pkcs12 -p12-file self-signed-cert.p12 localhost 127.0.0.1 ::1

    并将以下配置添加到 Spring Boots 属性文件 -

    server.ssl.key-store=classpath:self-signed-cert.p12
    server.ssl.key-store-password=changeit
    server.ssl.key-password=changeit
    

    注意 - classpath 如果您在 resources 文件夹中添加 self-signed-cert.p12。如果你想从特定位置运行它server.ssl.key-store=./self-signed-cert.p12

    【讨论】:

      【解决方案3】:

      这个server.ssl.key-store=test.jks指定你的test.jks在你项目的根目录下,所以检查它是否真的存在。

      如果您在类路径中的其他位置有此文件,则可以使用classpath 方案来指定文件的位置,即server.ssl.key-store=classpath:<path-to-the-file>/test.jks

      Check this for more info

      【讨论】:

      • 如果 Spring 找不到密钥库,则会出现异常:Caused by: java.lang.IllegalStateException: java.lang.IllegalStateException: org.springframework.boot.web.server.WebServerException: Could not load key store
      • 这个问题是 Netty + WebFlux 特有的,它适用于 Tomcat + MVC。
      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 2015-06-18
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多