Centos7 + Tomcat 8 + Let's encrypt 免费 SSL 升级 https

目标 :为域名配置SSL证书,使用https开头访问域名。

基础环境

centos7 x64 服务器
tomcat8 web容器
JDK8 Java环境
可爱的免费SSL申请网站Let's encrypt https://letsencrypt.org/

配置顺序

1、生成证书
2、配置其他支持环境
3、证书配置进tomcat

开始

一、获取 Let’s Encrypt 免费 SSL 证书
1、下载代码,上传至服务器指定目录 我放在了/var/ssl/下
生成证书需要下载letsencrypt软件支持,我直接在本地拉取github的代码,传到服务器,解压后位置为/var/ssl/letsencrypt/*

# letsencrypt拉取地址,下面两个都是可以的
https://github.com/certbot/certbot 或 https://github.com/letsencrypt/letsencrypt 

2、用命令获取ssl证书

# 获取证书, 选用 standalone 参数,在此需要把 tomcat 服务器关闭(否则可能会报错)
# -d 你的域名 例如:  smartisan.com -d www.smartisan.com
$ ./letsencrypt-auto certonly --standalone --email 你的邮箱 -d smartisan.com -d www.smartisan.com
注意了!!!

执行出问题的先看这里了,我在执行上面获取证书的代码时遇到了一些问题主要是两个
①首先要关闭正在运行且使用80端口的tomcat 为了保险期间 我建议你关闭所有tomcat
②仔细看上面的命令 [./letsencrypt-auto] 是不是感觉很熟悉啊,没错这个就是shell脚本,我这边呢下载下来的代码是位于/var/ssl/letsencrypt/letsencrypt-auto 这个letsencrypt-auto其实就是sh脚本 不用管他为什么不写后缀名,这里我下的版本有个坑,就是这个shell脚本的文件编码是win的 如果你执行上面的命令,出现
-bash: ./letsencrypt-auto: /bin/sh^M: bad interpreter: No such file or directory
那么请你先检查一下 这个文件的编码

# 查看该错误文件的格式(一般报错的文件格式是DOS)
 vi letsencrypt-auto
:set ff
如果ff=dos 说明就是这里了 
:set ff=unix 
:wq
再运行就好了

如果遇到下面的情况说明你获取成功了,中间黑的地方是以自己域名命名的文件夹


获取SSL证书成功后的信息

这段说明里面有一个点要注意下,就是证书到期的日期,如图我的是2019年3月22日到期
可以在你的 /etc/letsencrypt/live/域名/ 目录下看到一下几个文件


证书全部文件

到这一步,说明你已经准备好相关的证书了。
二、配置其他支持环境

这里说一下 在tomcat里面要配置ssl证书需要三个环境基础,分别是tomcat-native,apr,apr-util
apr和apr-util建议从官网下载压缩包 版本都选最新的就行 上传到服务器 然后进行安装
我上传到/usr/local/src下 我们用命令分别安装


#  安装apr
 
$ cd /usr/local/src
$ wget  https://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz
 
$ tar -xzvf apr-1.6.3.tar.gz
$ cd apr-1.6.3/
$ ./configure --prefix=/usr/local/apr
$ make && make install
 
 
# 安装 apr-util
 
$ cd /usr/local/src
$ tar -xzvf apr-util-1.6.1.tar.gz  
$ cd apr-util-1.6.1/
$ ./configure --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr 
$ make && make install
 
 
# 在 /etc/profile 文件中 添加以下两句话
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib
 
# 使环境变量 立刻生效
$ source /etc/profile
 
# 安装tomcat-native    tomcat-native 默认在 tomcat/bin 目录下有,所以找到之后执行编译安装就行
 
$ cd 到你的tomcat/bin目录下
$ tar -xzxf  tomcat-native-1.2.17-src.tar.gz
# 安装这里的Java-home写你自己的jdk配置路径
./configure --prefix=/usr/local/apr --with-java-home=./jdk1.8.0_181/
./configure && make && make install

三、证书配置进tomcat

注意 了 如果你使用的是tomcat9以上的版本可以直接使用上面获取到的SSL证书文件,下面分别列出两种配置

tomcat9

修改 安装 tomcat 目录下的 conf/server.xml 文件

<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443" />

<!--  以下这部分代码在原始文件中是 被注释掉的,取消掉注释 -->
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150" SSLEnabled="true" URIEncoding="UTF-8" >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
            <Certificate             
                    certificateKeyFile="/etc/letsencrypt/live/你的域名/privkey.pem"
                    certificateFile="/etc/letsencrypt/live/你的域名/cert.pem"
                    certificateChainFile="/etc/letsencrypt/live/你的域名/chain.pem"
            type="RSA" />
    </SSLHostConfig>
</Connector>

这一步中 的端口号 原始的是 8443 可以保持原端口号, 注意你的系统 将其端口打开
打开端口的具体方式 centos6 和 centos7 的方式也不太一样,具体可以百度。
//修改 web.xml (web.xml 和 server.xml在同一目录)
//在最后添加下面代码

<security-constraint>
        <web-resource-collection >
            <web-resource-name >SSL</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
</security-constraint>
tomcat7 or 8

需要用到 Linux 下的 openssl 和 keytool 工具,将SSL证书由 .pem 格式转换成 Tomcat 所支持的 .jks 格式。
这里需要设置密码 比如我设置的是qwer@12

# 导出.p12格式的证书
$ openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out lsl_letsencrypt.p12 -name tomcat_letsencrypt

# 再将证书由.p12格式转换成.jks格式
$ keytool -importkeystore -srckeystore lsl_letsencrypt.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore lsl_letsencrypt.jks

经过上面的两步操作,/etc/letsencrypt/live/你的域名/ 目录下就生成了一个新的证书 lsl_letsencrypt.jks。接下来,修改 %tomcat%/conf/server.xml 文件,添加 keystoreFile 和 keystorePass 两行配置。其中,keystoreFile 指向 jks 证书文件,而 keystorePass 则为证书的密钥。修改后的关键配置如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/etc/letsencrypt/live/你的域名/lsl_letsencrypt.jks"
    keystorePass="qwer@12"
/>

好了搞到这里就OK了 反正我是OK了,哈哈,打开浏览器输入你的域名用https访问,看看是否有个小锁,这里有个问题,如果你在服务器上的话 建议将自己的端口直接设置成443,记住了 端口要打开噢 ,centos7的端口开关和以前的版本不一样,要注意,下面给个自动续期的博客,可以尝试一下。
https://blog.csdn.net/anukram/article/details/78176614
参考博客:
https://blog.csdn.net/u013291612/article/details/81123663
https://blog.csdn.net/lyq8479/article/details/79022888
https://confluence.atlassian.com/confkb/ssl-connector-fails-to-initialize-during-tomcat-startup-646251490.html
最后隆重感谢https://letsencrypt.org/
谢谢开源世界

推荐阅读更多精彩内容