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 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9654 小时前
tcp/ip 中的多路复用
后端
bobz9654 小时前
tls ingress 简单记录
后端
皮皮林5516 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友6 小时前
什么是OpenSSL
后端·安全·程序员
bobz9656 小时前
mcp 直接操作浏览器
后端
前端小张同学8 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康9 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在9 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net