关于springboot项目的SSL配置

关于springboot项目的SSL配置

Scroll Down

关于springboot项目的SSL配置

什么是SSL证书

来自Symantec网站

SSL代表安全套接字层,简而言之,它是保持互联网连接安全和保护在两个系统之间发送的任何敏感数据的标准技术,可防止犯罪分子阅读和修改任何传输的信息,包括潜在的个人信息。这两个系统可以是服务器和客户端(例如,购物网站和浏览器)或服务器到服务器(例如,具有个人可识别信息或具有工资单信息的应用程序)

TLS(传输层安全性)只是SSL的更新,更安全的版本

当网站受SSL证书保护时,HTTPS(超文本传输协议安全)出现在URL中。可以通过单击浏览器栏上的锁定符号来查看证书的详细信息,包括颁发机构和网站所有者的公司名称

TLS(传输层安全性)

来自维基百科

传输层安全性(TLS)及其现已弃用的前身安全套接字层(SSL),是旨在通过计算机网络提供通信安全性的加密协议。协议的几个版本广泛用于诸如网页浏览,电子邮件,即时消息和IP语音(VoIP)之类的应用程序中。网站可以使用TLS来保护其服务器和Web浏览器之间的所有通信

TLS协议主要旨在提供两个或更多通信计算机应用程序之间的隐私和数据完整性。当通过TLS保护时,客户端(例如,Web浏览器)和服务器(例如,wikipedia.org)之间的连接应具有以下一个或多个属性:

  • 连接是私有的(或安全的),因为对称加密用于加密传输的数据
  • 可以使用公钥加密来验证通信方的身份。该认证可以是可选的,但通常需要至少一方(通常是服务器)
  • 该连接是可靠的,因为发送的每个消息包括使用消息认证码的消息完整性检查,以防止在传输期间未检测到的丢失或数据的改变

获取证书

自签名证书可以用于开发和测试目的,如果你想要部署到production(生产环境),你需要CA trusted certifcate Let's Encrypt是第一个免费开放的CA。这里也是我的选择!

获取源代码

git clone https://github.com/certbot/certbot

生成证书

./certbot-auto certonly -a standalone -d example.com -d www.example.com
或
./certbot-auto certonly -a standalone -d example.com
或
./certbot-auto certonly --standalone -d example.com

参数说明可以使用./certbot-auto --help查看

注意:安装证书过程请务必先关掉当前环境中占用80端口的服务,否则会安装失败。查看端口进程命令netstat -nap | grep 80

查看证书

安装成功后在/etc/letsencrypt路径下会生成相关文件(夹),证书存放路径/etc/letsencrypt/live/你的域名

drwx------ 3 root root 4096 7月  11 22:54 accounts
drwx------ 5 root root 4096 7月  14 01:47 archive
drwxr-xr-x 2 root root 4096 7月  14 01:47 csr
drwx------ 2 root root 4096 7月  14 01:47 keys
drwx------ 5 root root 4096 7月  14 01:47 live
drwxr-xr-x 2 root root 4096 7月  14 01:47 renewal
drwxr-xr-x 5 root root 4096 7月  11 22:54 renewal-hooks

Springboot 项目配置

证书转换

切换至证书目录/etc/letsencrypt/live/你的域名下,执行命令

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out springboot_letsencrypt.p12 -name tomcat -CAfile chain.pem -caname root

执行过程需要输入两次密码,一次设置密码,一次确认密码,请记住密码,执行过后在当前目录下会生成springboot_letsencrypt.p12这个文件,拷贝至你的项目中

项目中的配置

配置文件中的设置

server:
  port: 443
  ssl:
    key-store: classpath:springboot_letsencrypt.p12(存放配置文件同级)或着http://(网络路径)
    key-store-password: 上一步中的设置密码
    key-store-type: PKCS12
    key-alias: tomcat
  http:
    port: 8080

http重定向https

完成以上配置后,访问https://你的域名即可看到地址栏中的网址已被加密,但是若访问http://你的域名却会让你大失所望(并没有)

添加Java配置代码

@Configuration
public class SSLConfig {

    @Value("${server.port}")
    private int httpsPort;
    @Value("${server.http.port}")
    private int httpPort;

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection securityCollection = new SecurityCollection();
                securityCollection.addPattern("/*");
                securityConstraint.addCollection(securityCollection);
                context.addConstraint(securityConstraint);
            }
        };
        factory.addAdditionalTomcatConnectors(redirectConnector());
        return factory;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector(Http11NioProtocol.class.getName());
        connector.setScheme("http");
        connector.setPort(httpPort);
        connector.setSecure(false);
        connector.setRedirectPort(httpsPort);
        return connector;
    }
}

增加上述Java代码后,当访问8080端口时(http)会自动重定向到443端口(https)