Spring Boot 2.7.1配置LetsEncrypt PEM keystore报资源位置不能为空异常
问题原因
异常的核心诱因是SSL私钥的配置属性名书写错误:
Spring Boot 2.7.0+ 原生PEM格式证书配置规则中,服务端证书私钥的正确配置属性为server.ssl.certificate-private-key,你的配置里错误写成了server.ssl.certificate.certificate-private-key,多了一层.certificate层级,导致Spring Boot无法读取到私钥文件的路径配置,传入资源加载器的路径为null,最终抛出密钥库加载失败的异常。
另外你的配置中还存在一处无关笔误:spring1.jpa.hibernate.ddl-auto=update的前缀多写了数字1,正确前缀应为spring.jpa,该问题不会触发本次SSL相关异常,但会导致JPA表结构自动更新配置不生效。
解决步骤
- 修正SSL私钥配置的属性名,删除多余的
.certificate层级 - 修正JPA配置的笔误,将
spring1.jpa改为spring.jpa - 确认
fullchain1.pem、privkey1.pem两个文件放在Spring Boot可扫描的资源路径下:本地开发可直接放在src/main/resources/目录;生产环境部署如果放在服务器外置目录,需要在路径前加file:前缀指定绝对路径,避免资源读取失败。
修正后的完整配置参考:
spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=false spring.jpa.properties.hibernate.format_sql=false server.port=443 server.ssl.certificate=fullchain1.pem server.ssl.certificate-private-key=privkey1.pem server.ssl.trust-certificate=fullchain1.pem
额外注意
- Linux系统下默认非root用户没有权限绑定1024以下端口,如果配置443端口启动报权限不足,可以通过给Java程序授权网络端口权限、配置Nginx反向代理或者端口转发的方式解决,不要直接用root用户启动应用。
- 如果使用certbot默认生成的证书,直接复制证书文件到项目资源目录时注意文件权限,建议生产环境直接引用certbot生成的证书绝对路径,例如
server.ssl.certificate=file:/etc/letsencrypt/live/your-domain/fullchain.pem。
内容的提问来源于stack exchange,提问作者user3224416
相关产品推荐
相关产品推荐

