铿然架构 | 作者 / 铿然一叶 这是 铿然架构 的第 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基础(五)函数式接口-复用,解耦之利刃