Spring支持SSL实践


铿然架构 | 作者 / 铿然一叶 这是 铿然架构 的第 117 篇原创文章


1. SSL介绍

SSL(安全套接层)是一种安全协议,主要用于互联网通信中,以确保数据传输的安全性。

1.1 SSL的作用

1.1.1 加密通信

SSL通过加密算法对数据进行加密,确保数据在互联网上传输时不会被窃听或篡改。这意味着即使数据被拦截,也无法被未授权者读取。

1.1.2 身份验证

● 服务器身份验证

SSL 证书还包含服务器的身份信息。当用户访问一个使用 SSL 的网站时,浏览器会自动验证服务器的 SSL 证书是否由受信任的证书颁发机构签发,确保用户正在与预期的服务器进行通信,而非被欺骗到某个假冒网站。

● 客户端身份验证

在某些情况下,SSL 也可以用于验证客户端的身份,尽管这不如服务器身份验证那么常见。

1.1.3 数据完整性

● 防止篡改

SSL 加密还包括完整性检查,确保数据在传输过程中未被修改。这意味着任何对数据的未授权更改都会被检测到。

1.1.4 增强信任和可靠性

● 信任标志

使用 SSL 的网站通常会在浏览器地址栏显示一个锁形图标,表明连接是安全的。这增加了用户对网站的信任。

● 遵守规范

对于处理敏感信息(如信用卡信息、个人数据)的网站,使用 SSL 是一种最佳实践,有时甚至是法律或行业规定的要求。

1.1.5 SEO优势

● 搜索引擎优化

搜索引擎(如 Google)倾向于对使用 SSL 的网站给予更高的排名,因此使用 SSL 可以提高网站的搜索引擎可见性。

1.2 应用场景

● 网上购物

保护用户的信用卡信息和个人信息。

● 在线银行

确保金融交易的安全。

● 登录页面

保护用户名和密码不被窃取。

● 任何需要保护数据隐私和安全的在线服务。

2. 申请证书

建议购买一个证书,不要用自建证书,除非是内部使用或者测试用。

另外虽然可以申请免费证书,但是也不建议:

腾讯购买网址:buy.cloud.tencent.com/ssl ,可选择适合的证书:

购买证书后还需要审核,如果是个人证书,很快就能通过。

3. 配置证书

3.1 下载证书

下载证书文件得到如下内容:

文件 描述
kengcoder.com.pfx 放到spring工程的resources目录下。
keystorePass.txt 里面的密码后面会用到。

3.2 参数配置

证书格式有JKS和PFX两种,个人网站证书是PFX格式,适合spring的是tomcat配置,腾讯给的参考如下:

实际不需要按照它这里描述的全部配置,特别是如下两个参数:

java 复制代码
        enabled-protocols: TLSv1.1,TLSv1.2,TLSv1.3
        ciphers: TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256

配置不正确,有可能导致两者不匹配报如下错误:

java 复制代码
    协议不受支持
    客户端和服务器不支持一般 SSL 协议版本或加密套件。

    www.XXXX.com 使用了不受支持的协议。
    ERR_SSL_VERSION_OR_CIPHER_MISMATCH

最后的配置如下:

java 复制代码
server:
  port: 443

  ssl:
    enabled: true
    key-store: classpath:kengcoder.com.pfx
    key-store-password: xxxxxxxxxxx
    key-store-type: PKCS12
    client-auth: none
配置参数 描述
port 注意必须是443端口给https协议使用,80端口用于http协议
enabled 启用ssl就配置为true
key-store 配置证书文件路径,可以是绝对路径,也可以是classpath,前面已经放到工程resources目录下,因此classpath方式可以找到
key-store-password 前面keystorePass.txt文件里的密码
key-store-type PKS证书填写PKCS12
client-auth none为不验证客户端;need为要验证;want为可以验证,但不强制,验证不过也可以

上述配置完成后,就可以通过https协议访问站点了,但是此时只能通过443端口访问,而通常都是不带端口访问(也就是使用80端口访问),所以我们还有一步需要完成。

4. http自动转https

为了将http访问自动转https,需要配置两个bean,代码如下:

java 复制代码
@Configuration
@ConditionalOnProperty(prefix = "server.ssl", name = "enabled", havingValue = "true", matchIfMissing = false)
public class HttpsConfig {

    @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        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;
    }
}

注:ConditionalOnProperty这个注解不是必须的,这里它的作用是为了区分本地环境和生产环境,一个不使用ssl,一个要使用ssl做的开关,以决定是否要加载这两个bean。

5. 总结

本文介绍了SSL的作用,以及SSL证书申请和在spring下的部署过程,对于任何需要保护数据隐私和安全的在线服务,例如网上购物、在线银行、登录页面,SSL都是必不可少的传输协议。

因此,在商用环境要使用SSL,并且建议使用正式证书,仅在测试环境使用免费或自建证书。


其他阅读:

萌新快速成长之路
如何编写软件设计文档
Spring Cache架构、机制及使用
布隆过滤器适配Spring Cache及问题与解决策略
JAVA编程思想(一)通过依赖注入增加扩展性
JAVA编程思想(二)如何面向接口编程
JAVA编程思想(三)去掉别扭的if,自注册策略模式优雅满足开闭原则
Java编程思想(七)使用组合和继承的场景
JAVA基础(一)简单、透彻理解内部类和静态内部类
JAVA基础(二)内存优化-使用Java引用做缓存
JAVA基础(三)ClassLoader实现热加载
JAVA基础(五)函数式接口-复用,解耦之利刃

相关推荐
云:4 分钟前
寒假准备找实习复习java基础-day1
java·开发语言
凡人的AI工具箱8 分钟前
每天40分玩转Django:Django Email
数据库·人工智能·后端·python·django·sqlite
罗政10 分钟前
PDF书籍《手写调用链监控APM系统-Java版》第3章 配置文件系统的建立
java·pdf·linq
后端转全栈_小伵11 分钟前
SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明
数据库·spring boot·后端·sqlite·学习方法
罗政16 分钟前
PDF书籍《手写调用链监控APM系统-Java版》第11章 插件与链路的结合:HttpClient插件实现跨进程传输TraceSegment
java·开发语言·pdf
Beekeeper&&P...19 分钟前
java中list和map区别
java·windows·list
鹿屿二向箔22 分钟前
基于SSM(Spring + Spring MVC + MyBatis)框架构建一个图书馆仓储管理系统
spring·mvc·mybatis
李长渊哦30 分钟前
使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径
java·spring boot·spring
活在大染缸中37 分钟前
获取程序启动类
java
是小崔啊37 分钟前
JVM -垃圾回收机制
java·开发语言·jvm