想在 tomcat 使用自己 signed 的 SSL 憑證:
https://stackoverflow.com/questions/42541356/how-to-create-a-self-signed-ssl-certificate-for-use-with-tomcat
先使用指令, 產生 keystore.jks 檔案:
keytool -genkey -keyalg RSA -noprompt -alias tomcat -dname "CN=localhost, OU=NA, O=NA, L=NA, S=NA, C=NA" -keystore keystore.jks -validity 9999 -storepass changeme -keypass changeme
說明:
- This generates a keystore.jks file with a password of changeme,
- 請把 changeme 修改為你預期的密碼字串.
- using a keyAlias of tomcat that’s valid for 9999 days for localhost.
server.xml 修改後, http 在 8080, https 在 8443, 完整設定值:
<Connector port="8080" protocol="HTTP/1.1"
redirectPort="8443"
disableUploadTimeout="false"/>
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="keystore.jks" keystorePass="<password>"
clientAuth="false" acceptCount="100"/>
但實際執行, 顯示錯誤訊息:
INFO: The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
Tomcat支援三種接收請求的處理方式:BIO、NIO、APR
- BIO由於每個請求都要建立一個執行緒來處理,執行緒開銷比較大,不能再高併發的場景,效能也是最低的。
- NIO是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,比傳統的bio更好的併發效能。
- APR(Apache Portable Run-time libraries)簡單理解,就是從操作系統級別解決非同步IO問題。
確認gcc、apr、apr-devel、apr-util 以及 JDK是否已經安裝過,沒有就需要安裝,請依序執行以下指令:
rpm -qa gcc
sudo yum install gcc
rpm -qa apr
rpm -qa apr-devel
rpm -qa apr-util
which java
java -version
安裝 tomcat-native
官方下載點:
https://archive.apache.org/dist/tomcat/tomcat-connectors/native/2.0.3/source/
cd /usr/local/src/
sudo wget https://archive.apache.org/dist/tomcat/tomcat-connectors/native/2.0.3/source/tomcat-native-2.0.3-src.tar.gz
sudo tar xf tomcat-native-2.0.3-src.tar.gz
cd tomcat-native-2.0.3-src/native/
我是使用這組參數:
sudo ./configure --with-apr=/usr/bin/apr-1-config \
--with-java-home=/usr/lib/jvm/java-19-openjdk-19.0.2.0.7-1.rolling.el8.x86_64 \
--with-ssl=/usr/local/src/openssl-3.0.8 \
--prefix=/opt/tomcat/apache-tomcat-9.0.82
要知道你的 java home path , 很簡單, 先使用 which java 就會看到 java 在 /usr/bin/java , 但這個 path 其實是 symbol link, 去 list 一下就可以找到實際的 java home.
這個 SSL 問題比較多, 如果環境是舊的 OpenSSL 1.1.1k 需要先升級到 OpenSSL 3.0.x 版, 解法:
How to Install the latest OpenSSL version from Source on Linux
https://stackoverflow.max-everyday.com/2023/04/how-to-install-the-latest-openssl-version-from-source-on-linux/
接著.
make
make install
apache-tomcat-9.0.82/bin/catalina.sh ,在 文件最後增加這二行:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/tomcat/apache-tomcat-9.0.82/lib
export LD_LIBRARY_PATH
說明: 你的 tomcat 可能不是在 /opt/tomcat/ 而是在其他路徑下.
說明: 雖然直接把 keystore.jks 放到與 server.xml 同一層, 但實際上 tomcat 在執行時, 又會再被多搬到下一層的 ./conf/ 目錄下.
遇到執行環境的設定錯誤時, 常會出現錯誤訊息:
tomcat keystore file does not exist
或錯誤訊息:
Caused by: java.io.FileNotFoundException: /home/max/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/keystore.jks (No such file or directory)
at
最後, 我的eclipse 的 server.xml 內容如下, 增加了 conf/ 到 keystore.jks 之前:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="conf/keystore.jks" keystorePass="hello-your-passowrd"
clientAuth="false" acceptCount="100"/>
真的滿神奇的…, 加 conf/ 就可以解決.