我们在上网时,经常会遇到一些网站被浏览器提示“不安全”,比如下面的网站:
出现这种问题的根本原因在于访问网站的协议是http,现在大部分浏览器都推荐使用https来访问,这种方式安全性更高,比如今日头条的网页版:
其实,现在大部分网站都支持https了,但是还是有一些网站是不支持的,那么,如何为一个网站添加https的支持呢?答案很简单,就是给你的网站提供SSL证书就可以了。
但是,一般的SSL证书都很贵,每年几千块钱就算便宜的了,一些保护性更高的,可能需要几万甚至十几万的费用。这对中小型网站来说,也是一个不小的负担。
那么,有没有功能简单些,但也是正式的SSL证书呢?当然是有的了,不但是正式证书认证机构颁发的,而且还是免费的,证书有效周期也长达一年。这样可以节省大笔的费用了,以后有更高的要求时,升级成高级付费证书也是可以的。
“Talk is cheap. Show me the code”,咱们也通过一个基于Spring boot的最简单网站例子来演示一下给已有网站添加SSL证书的过程。
首先新建一个spring boot的web项目,我们只需要有一个网页就可以了,网页内容只显示当前时间。项目结构如下图,实际我们使用的就4个文件。
各个文件内容如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>cert</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cert</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
其实要关心的就两个引用,一个是spring-boot-starter-web,一个是
spring-boot-starter-thymeleaf。
然后看一下application.yml
spring:
thymeleaf:
prefix: classpath:/views/
suffix: .html
mode: HTML
server:
servlet:
context-path: /
port: 8990
也很简单,就配置了一下端口8990.
看一下IndexController
package com.example.cert.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.time.LocalDateTime;
@Controller
public class IndexController {
@RequestMapping(value = "/index")
public ModelAndView rightData(ModelAndView mv) {
mv.addObject("time",LocalDateTime.now());
mv.setViewName("index.html");
return mv;
}
}
有效的代码其实就两行,一个是给time赋上时间,另一行就是指定view文件。
最后是index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<label th:text="'当前时间:'+${time}"></label>
</body>
</html>
里面关键代码就一行,就是显示后台传过来的当前时间。
我们整个项目,关键代码不超过10行,应该不能更简单了。
我们把项目打包传到服务器上,先看一下不启用https的效果:
可以看到有不安全的提示。
咱们的目的是在网站中启用SSL证书来达到通过https协议访问的目的,所以,第一步是先获取SSL证书,这次咱们就薅一把华为云的羊毛,在华为云上申请免费的SSL证书。
1.登录华为云,找到产品->安全->SSL证书管理
2.进入SSL证书管理点击立即购买,会出现如下界面:
证书类型选择:DV(Basic)
证书品牌选择:DigiCert(只有这个提供免费的证书)
域名类型只能选择单域名
其他的默认,可以看到费用是0,点击立即购买,出现SSL证书的声明,同意即可:
点击去支付,实际因为金额是0,不用支付任何费用。
3.订单支付成功后可以在证书列表里看到刚申请的证书,不过现在还没发放。
4.点击申请证书,让你绑定域名,并填写联系信息:
5.然后进入证书列表,会看到提示域名验证的按钮:
点击域名验证,会告诉你要创建的dns记录,记下来给你提供的DNS记录信息。
6.创建域名记录集。进入域名管理页面,根据上一步的dns信息创建域名记录集:
7.验证域名所有权。等一段时间,可能10分钟左右吧,域名所有权验证通过(就是通过刚才的dns信息),会出现已签发的证书状态:
8.下载证书。点击下载,可以进入到证书下载页面:
点击下载,会下载一个压缩包,解压压缩包,可以看到各种服务器下的证书:
9.获取证书和密码。点击Tomcat,可以看到两个文件,一个是keystorePass.txt,存储密码,一个是证书文件server.jks:
这两个文件就是下一步咱们在源码里要配置的内容。
10.配置spring boot项目。在resources下创建cert文件夹,把server.jks复制进去。在application。yml的配置文件最后添加下面两行配置:
ssl:
key-store: classpath:cert/server.jks
key-store-password: 上面keystorePass.txt的密码
效果如下:
这样就大功告成了,我们重新编译打包,上传到服务器,测试一下:
没错,现在我们的网站也是传输安全的了,满足了最基础的SSL安全要求。
是不是很简单,只需要简单的配置就可以满足浏览器基本的安全要求,可以保证用户浏览你的网站是传输安全的。当然,这个免费的SSL证书只能绑定一个域名,如果有多个域名可以使用多个免费证书,或者一个收费证书。