SpringBoot配置Https访问

一、Https协议

  • HTTP(Hypertext transfer protocal)是一种详细规定了浏览器和万维网服务器之间相互通信的规则,通过因特网传送万维网文档的数据传送协议。
  • HTTPS(Hypertext transfer protocal over Secure Socket Layer)是以安全为目标的http通道,https的安全基础是ssl,因此加密的详细内容就需要ssl。https协议需要到ca申请证书(一般免费的证书很少)。
  • http是超文本传输协议,信息是明文传输的(http协议是不安全的,黑客可以在用户和服务器之间设置拦截器窃取传输的内容。也可以伪造用户提交的表单向服务器发出请求,从而获取到服务器的响应)。https则是具有安全性的ssl加密传输协议,http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    在这里插入图片描述

超文本传输安全协议(Https,也被称作HTTP over TLS, HTTP over SSL或者HTTP Secure)是一种网络安全的传输协议,SSL(Secure Socket Layer,安全套接字层),TLS(Transport Layer Security,传输层安全协议),HTTPS开发的主要目的,是提供对网络服务器的认证,保证交换信息的机密性和完整性。
在这里插入图片描述

SSL是位于可靠的面向连接的网络层协议和应用层协议之间的一种协议。SSL通过相互认证、使用数字签名保证完整性、使用加密确私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL加密协议和SSL握手协议。SSL的核心概念:加密算法,数字证书,CA。
TLS用于确保两个通用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议(TLS是传输层加密协议,它的前身是SSL协议,如果没有特殊要求,可以简单理解为TLS和SSL都属于同一协议)。

1.1 TLS、SSL加密算法

加密算法严格来说属于编码学(密码编码学),编码是信息从一种形式或格式转换为另一种形式的过程,解码是编码的逆过程(对应密码学中的解密)。加密算法主要分为两类,对称加密算法和非对称加密算法。

  • 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这一个密钥进行加密和解密,这就要求解密方事先知道加密密钥。
    在这里插入图片描述

  • 非对称加密算法需要两个密钥,公开密钥和私有密钥,公开密钥与私有密钥是一对,如果用公开密钥进行数据加密,只有用对应的私有密钥才能解密,服务器端发送加密锁给客户端,公开密钥需要定期更换。
    在这里插入图片描述

  • 身份认证是建立每一个TLS连接不可或缺的部分,比如你有可能跟任何一方建立一个加密的通道,包括攻击者,除非我们确保通信的,在开始加密通道之前。服务端是我们可以信任的,否则所有的加密(保密)工作都没有任何作用,而身份认证的方式就是通过证书以数字方式签名的声明,它将公钥与持有相应私钥的主体(个人、设备或服务)身份绑定在一起,通过在证书上签名,CA可以核实与证书上公钥相对应的私钥为证书所指定的主体所拥有。客户端和服务器首先必须建立连接和交换参数,这个过程叫握手。
    在这里插入图片描述

1.2 OpenSSL签发证书

OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其他目的使用。通过在一定范围内部署一台CA(Certificate Authority)服务器,可以实现局域网内的证书认证和授权,保证数据传输的安全性,也可以通过具体的部署实践,了解国际上大型CA机构的工作原理,为企业级的证书管理提供知识积累。
在这里插入图片描述

使用centos7签发证书流程如下:
在这里插入图片描述

  • 签发CA根证书

    1.生成CA密钥对(密钥对长度2048字节)
    openssl genrsa -out /usr/local/srv/ftp/cas/cakey.pem 2048 RSA

    2.生成根证书签发申请(证书访问时已域名出现)
    openssl req -new -key /usr/local/srv/ftp/cas/cakey.pem -out /usr/local/srv/ftp/cas/cacert.csr -subj /CN=cas.com

    3.根证书签发
    openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey /usr/local/srv/ftp/cas/cakey.pem -in /usr/local/srv/ftp/cas/cacert.csr -out /usr/local/srv/ftp/cas/ca.cer

  • 签发服务器证书

    1.生成服务器私钥
    openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/server/server-key.pem 2048

    2.生成服务器证书签发申请
    openssl req -new -key /usr/local/srv/ftp/cas/server/server-key.pem -out /usr/local/srv/ftp/cas/server/server.csr -subj /CN=cas.com

    3.生成服务器证书
    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA /usr/local/srv/ftp/cas/ca.cer -CAkey /usr/local/srv/ftp/cas/cakey.pem -CAserial /usr/local/srv/ftp/cas/server/ca.srl -CAcreateserial -in /usr/local/srv/ftp/cas/server/server.csr -out /usr/local/srv/ftp/cas/server/server.cer

  • 签发客户端证书

    1.生成客户端私钥
    openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/client/client-key.pem 2048

    2.生成客户端证书申请
    openssl req -new -key /usr/local/srv/ftp/cas/client/client-key.pem -out /usr/local/srv/ftp/cas/client/client.csr -subj /CN=cas.com

    3.生成客户端签发证书
    openssl x509 -req -days 365 -sha1 -CA /usr/local/srv/ftp/cas/ca.cer -CAkey /usr/local/srv/ftp/cas/cakey.pem -CAserial /usr/local/srv/ftp/cas/server/ca.srl -in /usr/local/srv/ftp/cas/client/client.csr -out /usr/local/srv/ftp/cas/client/client.cer

  • 生成Java证书(证书转换)

    1.生成客户端证书
    openssl pkcs12 -export -clcerts -name cas-client -inkey /usr/local/srv/ftp/cas/client/client-key.pem -in /usr/local/srv/ftp/cas/client/client.cer -out /usr/local/srv/ftp/cas/client/client.p12

    2.生成服务器证书
    openssl pkcs12 -export -clcerts -name cas-server -inkey /usr/local/srv/ftp/cas/server/server-key.pem -in /usr/local/srv/ftp/cas/server/server.cer -out /usr/local/srv/ftp/cas/server/server.p12

    3.服务器证书导入本机受信任证书
    keytool -importcert -trustcacerts -alias cas.com -file /usr/local/srv/ftp/cas/ca.cer -keystore /usr/local/tomcat/ca-trust.p12

    4.查看所有证书信息
    keytool -list -keystore /usr/local/srv/ftp/cas/client/client.p12 -storetype pkcs12 -v

二、SpringBoot配置Https

在Tomcat容器或是在SpringBoot项目中配置Https,一般都属于单体应用。实际上的分布式系统应该在Nginx代理上实现Https证书的配置。

2.1 生成证书

keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore 

在这里插入图片描述

执行上面的命令将会生成一个erver.keystore的证书文件,将此文件拷贝到资源目录中。

2.2 修改配置

application.yml支持如下配置信息:

No.属性名称描述
1server.ssl.ciphers设置是否支持SSL Ciphers
2server.ssl.client-auth设置client-Authentica是Wanted还是Needed
3server.ssl.enabled设置是否开启SSL
4server.ssl.key-alias设置keystore中key的别名
5server.ssl.key-password设置keystore中key的密码
6server.ssl.key-store设置keyStore的路径
7server.ssl.key-store-password设置访问keyStore的密码
8server.ssl.key-store-provider设置keyStore的提供者
9server.ssl.key-store-type设置keyStore类型
10server.ssl.protocol设置SSL协议类型,默认为TLS
11server.ssl.trust-store设置持有SSL Certificates的Trust Store
12server.ssl.trust-store-password设置访问Trust Store的密码
13server.ssl.trust-store-provider设置Trust Store的提供者
14server.ssl.trust-store-type设置Trust Store的类型

修改application.yml文件:

server:
  port: 443 # https默认访问端口
  ssl:
    key-store: classpath:server.keystore # 证书存放的位置
    key-alias: tomcat # 证书别名
    key-store-type: JKS # P12证书格式
    key-store-password: 123456

编写SpringBoot启动类:

@Controller
@SpringBootApplication
public class StartSpringBoot {
    public static void main(String[] args) {
        SpringApplication.run(StartSpringBoot.class, args);
    }

    @ResponseBody
    @RequestMapping("/home")
    public String home() {
        return "<h1>hello springboot !!! </h1>";
    }
}

启动项目,发现Tomcat在443端口进行了启动:
在这里插入图片描述
访问https://localhost/home :
在这里插入图片描述

2.3 配置转换器

既然已经配置了https访问,那么原来使用http协议进行访问的路径也应该重定向到https路径下,这里仅以tomcat为例,新建配置类:

@Configuration
public class HttpConnectorConfig {

    /**
     * 获取Http连接器
     * @return Connector
     */
    public Connector getHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http"); // 使用http协议
        connector.setSecure(false); // 非安全传输
        connector.setPort(80); // HTTP监听端口
        connector.setRedirectPort(443); // 重定向端口
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        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(getHttpConnector()); // 添加连接器
        return tomcat;
    }
}

重新启动项目,发现项目同时监听了80和443端口。
在这里插入图片描述
访问:http://localhost/home 发现自动跳转为https访问。
在这里插入图片描述

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SpringBoot项目的部署可以按照以下步骤进行: 1. 在Maven项目中引入SpringBoot打包插件,以确保打包完整。这可以通过在项目的pom.xml文件中添加插件依赖来实现。 2. 配置SpringBoot多环境,根据不同的环境加载相应的配置文件。可以创建名为application-环境名.yml或者application-环境名.properties的配置文件,并在其中设置不同环境下的配置项。 3. 在部署时,使用JDK运行SpringBoot的jar包,并选择相应的环境。可以使用以下命令运行:java -jar jar包名 --spring.profiles.active=环境名。这样可以根据不同的环境加载相应的配置文件。 4. 确保防火墙中的端口对外开放,以便能够访问SpringBoot项目。可以使用以下命令检查防火墙设置:firewall-cmd --zone=public --list--ports。确保8080端口已经对外开放。 通过以上步骤,你可以成功地部署SpringBoot项目。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringBoot项目部署](https://blog.csdn.net/qq_48788523/article/details/123999714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [springboot项目部署](https://blog.csdn.net/weixin_58414150/article/details/126943981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值