使用Let's Encrypt生成Tomcat使用的SSL证书并使用

标签:#https##tomcat##证书# 时间:2022/09/06 11:23:50 作者:小木

随着安全隐私被大家所重视,网站开启HTTPS访问已经是不可阻挡的趋势。HTTPS协议就是借助SSL/TLS证书实现http的加密传输的协议(HTTP Over SSL/TLS)。这里的SSL(Secure Sockets Layer)和TLS(Transport Layer Security)都是一种采用证书实现鉴权的安全协议,后者算是前者的继任者,修复了前者的一些漏洞。由于SSL太著名,所以大家在讨论TLS的时候都会提到SSL。其发展历史:

  • SSL 1.0 – 由于安全问题从未公开发布。
  • SSL 2.0 – 1995年发布。2011年弃用。存在已知的安全问题。
  • SSL 3.0 – 1996年发布。2015年弃用。存在已知的安全问题。
  • TLS 1.0 – 1999年作为SSL 3.0的升级发布。计划在2020年弃用。
  • TLS 1.1 – 2006年发布。计划在2020年弃用。
  • TLS 1.2 – 2008年发布。
  • TLS 1.3 – 2018年发布。
    (来源:https://www.wbolt.com/tls-vs-ssl.html

本文将记录如何使用第三方库申请Let’s Encrypt证书,并在tomcat中开启相关的功能。


[TOC]

一、为什么要使用Let’s Encrypt的第三方库申请证书?

网站开启HTTPS访问其实就是在服务端提供证书认证的机制。证书的申请在各大云服务厂商都有收费的申请使用方法,很简单,但是费钱。而业界也有提供免费证书申请的服务。其中,Let’s Encrypt就是一家免费提供证书的网站。从Let’s Encrypt申请证书,然后放到网站所在的服务器上,可以帮助我们实现HTTPS的访问。不过,由于Let’s Encrypt建议的证书申请方式是通过CertBot实现,而certbot安装依赖snap服务,而这些使用都很麻烦,国内的话不管是网络还是Linux系统版本都不太容易满足安装snap服务。不过,Let’s Encrypt本身也提供了一些业界实现的申请证书的第三方库,可以让大家使用。但是,tomcat服务器本身使用证书的方式也有点差别(因为需要依赖java实现证书的支持,所以有点麻烦)。

二、Tomcat支持的证书

Tomcat支持三种证书使用:分别是crt、jks和pfx。

首先,crt是指用pem编码的SSL证书,后缀通常是crt或者pem。是各大证书机构最常见的证书分发格式。也是本次记录的证书安装方式。

其次,JKS证书,是指Java KeyStore。Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。Tomcat的运行也是依赖Java的,所以这也是之前一直被广泛使用的证书。不过,由于JKS证书本身并不是常见的证书机构发放的格式,因此,通常需要将crt或者pem转换成JKS才可以被使用。这个方式也很麻烦,就不建议了。

最后是pfx格式证书,是一种证书格式,包含了公钥和私钥,与其它格式的证书可以互相转换。在Windows IIS服务器用的多。这里也不记录了。

三、使用Let’s Encrypt第三方库申请

从Let’s Encrypt申请证书需要你自己有一对公钥和私钥(这里简称账户密钥),公钥注册到Let’s Encrypt那里,然后用你的私钥去对请求进行签名,这样才能证明你是你(这是关于认证的原理,不懂的话可以搜一下认证与加密,学习一下基础知识,不了解没关系,照着后面做就行。)。然后,生成另一个域名证书相关的公钥和私钥(简称域名密钥),用这个私钥去生成一个证书请求,把你需要启用认证的域名信息写入这个证书请求中。然后,用你的账户密钥和生成的证书请求,一起发送给Let’s Encrypt,然后Let’s Encrypt验证过你的网站所有权之后,就会给你签发一个crt证书文件,把这个证书文件放到tomcat配置文件中就可以了。

这里,我们使用第三方python库acme-tiny来帮助我们完成上述证书申请过程,选择这个库的原因是它仅仅依赖于openssl和python3,前者在几乎所有的Linux服务器都已经有了,后者也基本上是主流了。所以依赖很小,使用很方便。库地址:https://github.com/diafygi/acme-tiny

那么,总结下具体过程就是:

1、生成账户密钥

首先,登录到你的服务器,然后选择一个证书存放的位置,再进行后面的操作,这里我们选择了某一个路径,例如 /home/datalearner/cert下,然后直接执行如下命令:

openssl genrsa 4096 > account.key

这个命令就会再当前目录下,使用openssl生成一个私钥(公钥从私钥中提取,所以不需要额外生成)文件,然后你就可以看到了account.key文件。

2、生成域名私钥

前面说了,除了账户私钥外,还需要一个域名私钥,操作如下:

openssl genrsa 4096 > domain.key

生成了domain.key文件

3、使用openssl生成一个证书请求

这里是用域名密钥来生成一个证书请求(下面三个命令根据情况三选一即可),用的也是openssl:

# 仅仅绑定一个域名
openssl req -new -sha256 -key domain.key -subj "/CN=datalearner.com" > domain.csr

# 绑定多个域名 (一般都是绑定至少两个:datalearner.com与www.datalearner.com)
openssl req -new -sha256 -key domain.key -subj "/" -addext "subjectAltName = DNS:datalearner.com, DNS:www.datalearner.com" > domain.csr

# 绑定多个域名,如果上面执行出错,可能是你的openssl版本的问题 (openssl < 1.1.1版本使用下面命令)
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:datalearner.com,DNS:www.datalearner.com")) > domain.csr

好了,执行了上述命令之后,我们就有了一个证书请求文件domain.csr

4、准备验证权限的目录

并不是你申请任意网站证书都能成功,所以Let’s Encrypt需要验证你对网站的所有权才会发放证书。一般都是通过让你在网站的某个目录下创建文件夹,然后Let’s Encrypt随机生成一些内容放到这个目录下可以访问到就行了。默认都是 你的域名/.well-known/acme-challenge/目录。例如,我们的网站目录可能就是 /home/tomcat/webapps/ROOT/.well-known/acme-challenge/。你需要确保这个目录存在,且可以被公网访问到。本站就是 h-t-t-p://www.datalearner.com/.well-known/acme-challenge/ (注意,没有启用https之前,确保http能访问就行)。

5、向Let’s Encrypt发送证书申请

这个步骤就是用你的账户密钥和刚才生成的证书请求以及本地的目录位置来确保证书的方法,前面我们说了,我们用的是acme-tiny操作,这里开始就是用这个了,我们需要从 https://github.com/diafygi/acme-tiny 项目中,把 acme_tiny.py文件下载到当前目录,然后开始执行如下命令即可:

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /home/tomcat/webapps/ROOT/.well-known/acme-challenge/ > ./signed_chain.crt

注意,这里需要是python3执行,另外确保前面生成的account.key、domain.csr文件存在,以及/home/tomcat/webapps/ROOT/.well-known/acme-challenge/目录存在,然后执行完毕之后,就可以在当前目录下查看到了Let’s Encrypt签发的证书文件signed_chain.crt了。至此,证书就申请好了。

6、在tomcat中启用证书访问

证书申请完毕之后,在tomcat配置一下证书的位置即可,我们假设tomcat配置文件目录如下:

vim /home/tomcat/conf/server.xml

一般来说,默认已经有了80端口的访问,接下来我们启用443端口的https访问即可(在文件中的<Connector port=”80” … 后面加入如下代码即可):

  <Connector
       protocol="HTTP/1.1"
       port="443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       SSLCertificateFile="/home/datalearner/cert/signed_chain.crt"       
       SSLCertificateKeyFile="/home/datalearner/cert/domain.key"
       SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"/>

注意,这里只加了两个文件配置,SSLCertificateFile="/home/datalearner/cert/signed_chain.crt"SSLCertificateKeyFile="/home/datalearner/cert/domain.key",通常tomcat里面还有个配置是SSLCertificateChainFile,我们没有可以不配置,这是可选的。至此,重启tomcat即可完成。

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
相关博客