HTTPS

https是一种安全为目的的http通道,在http的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 主要由两部分组成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。

HTTP与HTTPS的区别

1.http的传输方式是明文传输,https则是加密传输。
2.http通过TCP三次握手建立连接时中间不需要认证。https则需要通过证书的认证才能成功建立连接。
3.http的传输过程中可能被劫持篡改数据,而https则通过公钥的不对称加密,防止了数据被篡改

HTTPS的加密通信原理

服务器与客户端通信时会发放一个公钥用于客户端加密传输给服务器的数据,客户端选择一个对称加密算法和秘钥,并将它们用公钥加密发送给服务器。服务器接收到加密的数据后会使用私钥进行解密,这个私钥只保存在服务器,不会外泄出去。当服务器需要发送数据给客户端时,就会按照与客户端事先约定好的对称加密算法和客户端密钥对发送的数据进行加密。这样当客户端收到数据时就可以利用客户端的秘钥进行解密了。在建立连接的过程中为了防止有人冒充服务器的公钥,从而达到窃取数据的目的,通常会采用CA(第三方认证机构)证书的方式,保证客户端得到的公钥是正确的服务器公钥。

CA证书

CA是负责签发,认证数字证书的权威机构。CA证书是用来确保客户端得到的公钥是他想要请求的服务器的公钥,保证了没有黑客冒充服务器公钥。

使用openssl生成证书

ubuntu自带openssl,可以直接运行以下命令。window系统需要自行安装,进入openssl命令执行以下命令,执行时去掉openssl

openssl genrsa -out rootkey.pem 2048
生成根证书的密匙。
openssl req -x509 -new -key rootkey.pem -out root.crt
生成根证书。注意-x509,与步骤4和7不同。需要输入机构相关信息。
openssl genrsa -out clientkey.pem 2048
生成客户端的密匙。
openssl req -new -key clientkey.pem -out client.csr 
生成客户端证书的请求文件。请求根证书来签发。
openssl x509 -req -in client.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out client.crt
用根证书来签发客户端请求文件,生成客户端证书client.crt。
openssl genrsa -out serverkey.pem 2048
生成服务器端的密匙。
openssl req -new -key serverkey.pem -out server.csr
生成服务器端证书的请求文件。请求根证书来签发。
openssl x509 -req -in server.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out server.crt
用根证书来签发服务器端请求文件,生成服务器端证书server.crt。
openssl pkcs12 -export -in client.crt -inkey clientkey.pem -out client.pkcs12
打包客户端数据为pkcs12格式(client.pkcs12)。需要输入密码,请记住。
openssl pkcs12 -export -in server.crt -inkey serverkey.pem -out server.pkcs12
打包服务器端数据为pkcs12格式(server.pkcs12 )。需要输入密码,请记住。

下面这一步不是必须的,可不做。

keytool -importkeystore -srckeystore client.pkcs12 -destkeystore client.jks -srcstoretype pkcs12
生成客户端keystore(client.jks)。使用keytool的importkeystore指令。pkcs12转jks。需要pkcs12密码和jks密码。
keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
生成服务器端keystore(server.jks)。使用keytool的importkeystore指令。pkcs12转jks。需要pkcs12密码和jks密码。
keytool -importcert -keystore server.jks -file root.crt
这一步不一定需要的。我发现服务器使用JDK6和JDK7的时候,必须要把根证书加到服务器证书里面,否则交谈失败。nul certification。Google里面很多结果,但是都不灵光。
在springboot中配置ssl
server:
  ssl:
    key-store: classpath:server.pkcs12
    key-store-type: PKCS12
    key-store-password: xxxxx

下面配置将http自动跳转到https

    @Bean
    public ServletWebServerFactory servletWebServerFactory() throws IOException {
        TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory ();
        tomcat.addContextCustomizers(new TomcatContextCustomizer() {
            @Override
            public void customize(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;
    }

    public Connector connector() throws IOException {
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8044);
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setRedirectPort(8080);
        return connector;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值