Spring Boot中实现HTTPS for localhost
Spring Boot中实现HTTPS for localhost
当今时代,几乎所有能访问的网站都是受HTTPS保护的,使用HTTPS保护您的服务器也就意味着您无法从非HTTPS的服务器发送请求到此服务器。
这对使用本地开发环境的开发人员来说是一个问题,因为这些本地开发环境都是运行在http://localhost下的。
本文主要介绍在Spring Boot项目中,localhost如何实现HTTPS。
创建安全套接层(SSL)证书
SSL 证书就是遵守 SSL 安全套接层协议的服务器数字证书,由浏览器中“受信任的根证书颁发机构”在验证服务器身份后颁发,具有网站身份验证和加密传输双重功能。可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息。
如果您能使用 https:// 来访问某个网站,就表示此网站是部署了SSL证书。一般来讲,如果此网站部署了SSL证书,则在需要加密的页面会自动从 http:// 变为 https:// ,如果没有变,你认为此页面应该加密,您也可以尝试直接手动在浏览器地址栏的http后面加上一个英文字母“ s ”后回车,如果能正常访问并出现安全锁,则表明此网站实际上是部署了SSL证书,只是此页面没有做 https:// 链接;如果不能访问,则表明此网站没有部署 SSL证书。
如果 SSL 证书不是由浏览器中“受信任的根证书颁发机构”颁发的,则浏览器会有安全警告。
获取SSL证书的途径
- 通过OpenSSL生成证书
- 通过keytool签名
- 从SSL证书授权中心购买
前两种方法都试过了,网上也看到两篇很有用的博客——localhost 添加 SSL 证书 、Springboot配置使用ssl
通过OpenSSL生成证书
-
首先安装OpenSSL,默认目录安装即可。下载地址
-
新建配置文件localhost.cnf,文件内容如下
[dn] CN=localhost [req] distinguished_name = dn [EXT] subjectAltName=DNS:localhost keyUsage=digitalSignature extendedKeyUsage=serverAuth
-
以管理员身份进入命令行界面
假设 OpenSSL 的安装位置为 ‘C:\Program Files (x86)\GnuWin32’,使用cd命令进入 ‘C:\Program Files (x86)\GnuWin32\bin’
然后执行命令
.\openssl req -x509 -out localhost.crt -keyout localhost.key -newkey rsa:2048 -nodes -sha256 -subj ‘/CN=localhost’ -extensions EXT -config {localhost.cnf文件目录}
证书就会生成成功,如下图所示。
- 此时再打开chrome浏览器,点击设置,找到证书管理,import刚才生成的证书即可。
通过keytool签名
keytool是一个证书管理工具,可以生成自签名证书,个人认为通过keytool生成更便捷一些。
1.在JDK中输入如下命令。
keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
2.将tomcat.keystore拷贝到项目根目录下
3.配置application.yml
server:
port: 8443
servlet:
context-path: '/identity'
ssl:
key-store: tomcat.keystore
key-store-password: 123456
key-store-type: JKS
key-alias: tomcat
此时启动项目就可以直接访问https://localhost:8443/,但尚未实现自动跳转到HTTPS。
4.在运行主类中加入如下代码,即可实现自动跳转。
此时你在浏览器输入http://localhost:8081/identity/login访问,会自动跳转到https://localhost:8443/identity/login
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8081);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}
总结
本文主要是结合个人实践,探讨了Spring Boot中实现HTTPS for localhost,以及获取SSL证书的两种方式。
希望能对大家有所帮助~ 有问题欢迎留言交流,不足之处还请多多指正。