问题复现:
1 | . ____ _ __ _ _ |
Spring Boot 2.1.1版本,配置完HTTPS后启动,启动过程中没有出现什么异常信息,但是浏览器无法访问并且一访问立马报了上面日志中的第二和第三段异常信息。
于是二话不说,直接谷歌搜索“springboot java.lang.UnsatisfiedLinkError:org.apache.tomcat.jni.SSL.renegotiatePending(J)I”,从第一个stackoverflow里面的回答 就找到了解决方案(果然还是谷歌大法好!),主要是两种:
1.在pom.xml里指定tomcat的版本,覆盖springboot的默认配置
Spring Boot 2.1.1集成的Tomcat 从9.0.12升级到了9.0.13。所以想继续使用9.0.12版本的话直接在properties下面指定tomcat.version为9.0.12就行了
1 | <properties> |
或者用Spring Boot 2.1.0的版本也行,但这毕竟不是长久之计,我们总不能都一直用着旧版本的吧
2.手动编译安装tomcat-native
如果你用的是CentOS你会发现epel源里面有已经有现成的tomcat-native包,但它的版本是1.2.17的,Spring Boot 2.1.1版本如果配置HTTPS的话,就必须至少是1.2.18版本的,而epel源目前还没有更新至1.2.18版本,所以只能手动编译安装了
去官网下载源码,目前最新的版本是1.2.19
如果已经通过yum源安装了把就先卸载安装的旧版本
1 | yum remove -y tomcat-native |
按照官方的手册,先安装必要的依赖:
1 | yum install apr-devel openssl-devel -y |
解压,进入相应目录1
2
3
4cd /tmp
tar -zxvf tomcat-native-1.2.19-src.tar.gz
cd tomcat-native-1.2.19-src/native
mkdir ../output
configure1
2
3
4./configure --with-apr=/usr/bin/apr-1-config \
--with-java-home=/usr/jdk1.8.0_192/ \
--with-ssl=yes \
--prefix=/tmp/tomcat-native-1.2.19-src/output
其中–with-java-home后面指定JDK的路径。理论上所有JDK都可以,但建议使用与Tomcat一起使用的JVM相同的JVM版本。
–prefix指定编译后生成的文件的位置
编译安装1
make && make install
编译完成后生成文件的目录结构大概是这样的:
我们只需要把libtcnative-1.a libtcnative-1.la libtcnative-1.so libtcnative-1.so.0 libtcnative-1.so.0.2.19这几个文件拷到/usr/lib64就可以了
1 | cd /tmp/tomcat-native-1.2.19-src/output/lib |
再次启动,可以看到springboot成功的加载了最新版本的tomcat-native
浏览器端也能正常访问了
附:
springboot配置HTTPS:
1 | #pem生成jks |
fullchain.pem和privkey.pem,正常配置apache的HTTPS会用到的2个文件,一个私钥文件和一个证书文件,可以在letsencrypt免费申请
在application.properties中配置:1
2
3
4
5
6
7
8
9
10
11
12
13security.require-ssl = true
server.ssl.key-store=/root/test.jks
server.ssl.key-store-password=test
server.ssl.key-store-type=jks
server.ssl.key-alias:test
```
也可以直接用第一步生成的pkcs12文件
```bash
security.require-ssl = true
server.ssl.key-store=/root/fullchain_and_key.p12
server.ssl.key-store-password=test
server.ssl.key-store-type=PKCS12
server.ssl.key-alias:test
小技巧:
vim 可以直接修改修改jar包的文本文件
需要在Linux下安装zip,unzip
1 | yum install -y unzip zip |
就像这样:
这样就可以在服务器里直接修改jar包里的一些配置文件或者是静态资源,省的本地再重新打包上传了,很方便啊有木有?