快速开始
访问https://start.spring.io 官方已经提供了很简单的创建方式,以下是个栗子:
curl https://start.spring.io/starter.zip -d dependencies=web,thymeleaf -d javaVersion=11 -d groupId=czx.me -d artifactId=demo -o demo.zip
大意是创建一个groupId
为czx.me
,artifactId
为demo
,环境为java11
的web项目
解压后即可运行。
HTTPS
由于web正在转向HTTPS。越来越多的站点只能通过使用HTTP访问。由于Let's Encrypt,您可以访问免费的TLS证书,并使用ACME协议实现证书管理的自动化。
但在我们的开发环境中,有一个领域TLS并不普遍。这是一个问题,因为浏览器中越来越多的功能需要安全的上下文。例如Geolocation,Service Workers,Web Crypto 等。这些功能仅在通过HTTPS提供页面时才有效,但幸运的是,浏览器对于与localhost和127.0.0的连接存在异常,您可以在开发环境中使用HTTP over纯文本TCP来处理这些功能。
但是有一个功能需要TLS连接,HTTP / 2。如果要在开发中使用HTTP / 2,则必须启用TLS。有一个关于在明文TCP上使用HTTP / 2的规范,但浏览器和Spring Boot没有实现它。
在开发环境中使用TLS的另一个原因是混合内容问题。例如,您有一个HTML页面,它使用HTTP引用jQuery库。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Mixed Content</title>
</head>
<body>
<script src="http://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
</body>
</html>
在您的开发环境中,您在cleartext TCP上使用HTTP,开起来工作正常。然后将此web页面部署到一个通过HTTPS提供资源的生产服务器。突然间,应用不再工作了,因为当主机页面通过安全连接加载时,浏览器拒绝通过不安全连接加载资源。 控制台打印这个错误消息:
Mixed Content: The page at 'https://localhost:8443/index.html' was loaded over HTTPS, but requested an
insecure script 'http://code.jquery.com/jquery-3.3.1.slim.min.js'. This request has been blocked;
the content must be served over HTTPS.
您可以看到,始终使用生产中使用的相同协议开发和测试应用程序是有正当理由的。
安装
brew install mkcert
这是一个用Go编写的命令行工具,可以在Windows、Linux和macOS上运行。
https://github.com/FiloSottile/mkcert 这里以mac为🌰
可以使用以下命令获取CA根目录:
mkcert -CAROOT
你需要首先在系统信任库中安装本地CA:
mkcert -install
接下来,给localhost 127.0.0.1和::1创建一个TLS证书,该证书由我们自己的私有CA签名。默认情况下,mkcert创建PEM格式的证书。因为我们希望在Java应用程序(Spring Boot)中使用证书,而Java不能加载PEM证书,所以我们必须以PKCS#12格式创建证书。
命令行切换到项目到根目录下方
mkcert -pkcs12 localhost 127.0.0.1 ::1
这将localhost+2.p12在当前目录中创建一个新文件。PKCS#12捆绑包使用密码进行保护changeit。
打开src/main/resources/application.properties(默认为空),并插入以下内容:
server.http2.enabled=true
server.port=9991
server.ssl.enabled=true
server.ssl.key-store=./localhost+2.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=changeit
通过这些设置,我们启用TLS和HTTP / 2并将侦听端口设置为9991.在Spring Boot中启用TLS时,还必须指定密钥存储区,格式和密码(默认为changeit)。
修改启动入口为
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
String serverPort = run.getEnvironment().getProperty("server.port");
System.out.println("started at http://localhost:"+serverPort);
}
@GetMapping("/")
public String helloWorld() {
return "Hello World";
}
}
最终效果:
控制台:
灵感来源以及更多信息:https://golb.hplar.ch/2019/01/spring-boot-with-tls-localhost.html
Q.E.D.