springboot配置https

# springboot配置https

HTTP与 HTTPS区别 
    首先,来简单了解一下 HTTP 与 HTTPS 吧。
    超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递数据。HTTP 协议是以明文方式发送数据,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此 HTTP 协议不适合传输一些敏感信息,比如信用卡号、密码等信息。
    为了解决 HTTP 协议的这一缺陷,需要使用另一种传输协议:安全套接字层超文本传输协议,也就是 HTTPS 协议。为了数据传输的安全,HTTPS 在HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密(具体加密原理这里不赘述)。
    两者的区别主要为以下四点:
        1、https 协议需要到申请 ssl 证书,现在,免费的ssl证书申请机构不少,个人网站使用完全没问题(文末列出几个提供免费证书的网站);
        2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议;
        3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;
        4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
目前,很多网站都开始启用 HTTPS 协议进行数据传输,这也是保证数据传输安全的一种方式。那么,当我们搭建自己的网站的时候应该怎么启用 HTTPS 呢?下面将介绍如何在 SpringBoot 项目中添加 HTTPS 支持。


KeyTool 生成自签发证书文件
    命令:
        keytool -genkey -alias test123 -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore MyKeyStore.p12 -validity 36500
    关键参数说明:
        storetype 指定密钥仓库类型 
        keyalg 生证书的算法名称,RSA是一种非对称加密算法 
        keysize 证书大小 
        keystore 生成的证书文件的存储路径(可指定相对路径或绝对路径) 
        validity 证书的有效期(天 为单位)
    注意:
        然后一路操作,输入相应的设置, 最后在确认是否正确的时候,检查输入的值是否正确,是就输入y 进行确认。
    控制台输入以下命令查看密钥库中的信息
        keytool -list -v -keystore MyKeyStore.p12 -storepass chengblog
    输入 y 确认设置之后,keytool 工具在设置路径下生成  MyKeyStore.p12 文件,当填写文件名称,会在存储在相对路径下,也就是控制台定位到的目录下。将该文件拷贝到项目根目录下resources的ssl内。
    在 application.properties 配置文件中添加以下配置项:

#证书格式转换
    转换1,ca.p12转client.jks
        keytool -importkeystore -srckeystore ca.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore client.jks
    过程:
        输入目标密钥库口令(新jks口令):
        再次输入新口令:
        输入源密钥库口令:(p12文件口令)
        已成功导入别名 1 的条目。
        已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消


    转换2,client.jks转ca_client.p12
        keytool -importkeystore -srckeystore client.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore ca_client.p12
    过程:
        输入目标密钥库口令(新p12口令):
        再次输入新口令:
        输入源密钥库口令(原client.jks设置口令):
        输入 <1> 的密钥口令(生成client.jks的原p12口令):
        已成功导入别名 1 的条目。
        已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消


springboot配置https:
    0.生成证书:
        keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore KeyStore.p12 -validity 36500
        存放目录:resources/ssl/KeyStore.p12
    1.配置文件:
        #http端口
        server.port=9960    
        #https端口
        server.https.port=9962
        # 指定签名文件,对应生成的密钥库文件
        server.ssl.key-store=classpath:ssl/keystore.p12
        # 指定签名密码,设置的密钥库指令
        server.ssl.key-store-password=test123
        # 指定密钥仓库类型,PKCS12
        server.ssl.key-store-type=PKCS12
        # 指定别名,生成密钥库的时候进行了设定
        server.ssl.keyAlias=test123

    2.更改pom文件,添加如下
         <!--禁止maven擅作主张修改资源文件的限制-->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <!-- 过滤后缀为pem、pfx、p12、jks的证书文件 -->
                        <nonFilteredFileExtensions>
                            <nonFilteredFileExtension>pem</nonFilteredFileExtension>
                            <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
                            <nonFilteredFileExtension>p12</nonFilteredFileExtension>
                            <nonFilteredFileExtension>jks</nonFilteredFileExtension>
                        </nonFilteredFileExtensions>
                    </configuration>
                </plugin>
            </plugins>
        </build>

    3.添加HttpsConfig.java
        package com.ab.dh.analysis.config;

        import org.apache.catalina.Context;
        import org.apache.catalina.connector.Connector;
        import org.apache.tomcat.util.descriptor.web.SecurityCollection;
        import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
        import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
        import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
        import org.springframework.boot.context.embedded.Ssl;
        import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;

        @Configuration
        public class HttpsConfig{
            /**
             * httpPort         Server的http端口号
             * httpsPort        Server的https端口号
             * keyStorePassword Keystore的密码
             * keyStorePath     KeyStore的所在路径
             */

            @Value("${server.port}")
            private int httpPort;

            @Value("${server.https.port}")
            private int httpsPort;

            @Value("${server.ssl.key-store-password}")
            private String keyStorePassword;

            @Value("${server.ssl.key-store}")
            private String keyStorePath;


            @Bean
            public EmbeddedServletContainerCustomizer containerCustomizer() {
                return new EmbeddedServletContainerCustomizer() {
                    @Override
                    public void customize(ConfigurableEmbeddedServletContainer container) {
                        Ssl ssl = new Ssl();
                        // Server.jks或者server.p12都是中包含服务器私钥和证书
                        ssl.setKeyStore(keyStorePath);
                        ssl.setKeyStorePassword(keyStorePassword);
                        container.setSsl(ssl);
                        container.setPort(httpsPort);
                    }
                };
            }

            @Bean
            public EmbeddedServletContainerFactory servletContainerFactory() {
                TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
                    @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);
                    }
                };
                factory.addAdditionalTomcatConnectors(createHttpConnector());
                return factory;
            }

            /**
             * 通过http端口访问直接跳转到https端口访问
             * @return connector
             */
            private Connector createHttpConnector() {
                Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
                connector.setScheme("http");
                connector.setSecure(false);
                connector.setPort(httpPort);
                connector.setRedirectPort(httpsPort);
                return connector;
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值