为什么要写本文?
今天一个群友在群里问怎么给 Tomcat 配置 SSL, 也就是 HTTPS, 他买的阿里云的服务器, 自带公网 ip, 还找到了免费的 SSL 证书
既然 @我了, 我就帮忙搞一搞呗, 我就要了一个带 sudo 的用户, 开始了踩坑之路
踩到坑的原因还是因为自己对 Linux 不够了解, 所以记下来, 告诫自己戒骄戒躁
安装 Tomcat
演示用 CentOS 7,Tomcat 版本 8.5.50, 需要先安装 JDK, 这里用的 openjdk
下载 Tomcat
- $ cd ~
- $ wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz #下载到家目录
- $ tar zxvf apache-tomcat-8.5.50.tar.gz #解压 tomcat
- $ cd apache-tomcat-8.5.50
- $ bin/startup.sh #启动 tomcat
- $ tail -f logs/catalina.out #查看日志输出
你会发现 Linux 下 tomcat 启动特别慢, 原因在于 Tomcat 获取随机数使用 / dev/./random 在不能产生新的随机数时会阻塞程序, 参考 Linux 中的随机数文件 /dev/random /dev/urandom https://www.linuxidc.com/Linux/2012-05/60476.htm , 知道问题在哪里我们修改一下 bin/catalina.sh, 使其使用非阻塞的 / dev/urandom
VIM bin/catalina.sh
在 256 行附近为 JAVA_OPTS 添加指定默认随机数 - Djava.security.egd=file:/dev/./urandom, 保存退出
重启 tomcat
- $ bin/shutdown.sh
- $ bin/startup.sh
- $ tail -f logs/catalina.out
这次启动就非常快了
访问 < 127.0.0.1:8080 > 或者查看是否正确启动
安装 APR
查看启动日志的时候, 你可能会发现有个库好像没有找到
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
APR 用官网的说法是: Tomcat can use the [Apache Portable Runtime](https://apr.apache.org/) to provide superior scalability, performance, and better integration with native server technologies.
简单来说, APR 是针对操作系统优化, 大幅度提升服务器性能的运行时环境
最简单的解决办法是安装 apr-devel, 更多细节参考 http://tomcat.apache.org/tomcat-8.5-doc/apr.html
$ sudo yum install -y apr-devel
更细致的安装是使用源码, 通过 rpmbuild 打成 rpm 包进行安装, 参考 https://apr.apache.org/compiling_unix.html
修改 Tomcat 端口为 80
http 默认的端口是 80, 当我们只写 ip 或域名时会默认访问 80 端口, 配置一下还挺有用的
$ VIM conf/server.xml
在 69 行左右修改 8080 为 80, 保存退出
重启 tomcat, 命令与上边一致, 不再赘述
如果你和我一样, 使用的也是 sudo 用户, 启动 tomcat 时没加 sudo, 那么此时你也要被坑了,"我访问 127.0.0.1" 怎么没反应啊?
这是因为 Linux 默认非 root 用户可直接使用的端口号要大于 1024! 我今天就坑在这里好久, 之前一直使用 root 用户一点事没有, 这才发现这个问题, 改安全组, 关防火墙, 改配置一把梭没查到问题, 改到怀疑人生, 使用 sudo 解决问题; 不要盲目迷信 root
配置 Https SSL 证书
首先从证书颁发机构网站下载证书文件和密码, 证书文件后缀. pfx, 密码一般是 pfx-password.txt, 有时使用 pfx 配置密码会失败, 这里就使用转化 pfx 为 jks 文件
先复制. pfx 证书与密码到当前目录, 这里放在用户家目录中
转换 pfx 证书为 jks
- $ cd ~
- $ cat pfx-password.txt #查看密码, 这里可以复制一下, 马上会用到
$ keytool -importkeystore -srckeystore 你的证书. pfx -destkeystore domains.jks -srcstoretype PKCS12 -deststoretype JKS #这里的 domains.jks 名称你可以改成别的, 只要以. jsk 结尾就可以
输入 3 次密码, 粘贴刚才复制的密码即可, ls 你会发现 domain.jks 已经生成
配置 Server.xml
- $ cp domains.jks ~/apache-tomcat-8.5.50/conf
- $ cd ~/apache-tomcat-8.5.50
- $ VIM conf/server.xml
在大约 87 行, 修改原来的 8443 为 443, protocol 可以使用其它高版本协议, 详情参考 http://tomcat.apache.org/tomcat-8.5-doc/config/http.html#SSL_Support
如图, keystoreFile 处填写 jks 的绝对路径, keystorePass 填写证书密码 (刚才生成 jks 时填写的与 pfx 相同的密码)
- <!-- 开启 ssl 支持, 请注意其它接口转发应修改 redirectPort 为 443 -->
- <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- keystoreFile="/ 你的目录 / apache-tomcat-8.5.50/conf/domains.jks"
- keystorePass="证书密码"
- clientAuth="false" sslProtocol="TLS"
- connectionTimeout="20000" />
修改默认配置的 8443 为 443, 使其它端口转发到 443 端口拥有加密功能
在 VIM 中输入, 一般应该成功替换 6 处 (含注释)
:1,$s/8443/443/g
保存退出, 重启 Tomcat
后续
一般来说看到这里, 你的 Tomcat 应该已经绑上 Https 证书了
由于这是一次踩坑的记录, 再提几嘴可能碰到的问题:
ECS 服务器由安全组配置入站出站规则, 默认入站全禁, 出站全开, 要注意配置 80 与 443 端口入站放行
某些地区的阿里 ECS 安全组只能使用专用网络, 区别于经典网络的公网与内网可单独配置, 专用网络安全组默认标灰内网为不可修改, 通过查询阿里的文档, 发现专用网络的安全组配置在公网与内网中均会生效
Linux 非 root 用户默认没有 1024 以下端口使用的权力
来源: https://www.cnblogs.com/hellxz/p/12150936.html