How to create a self signed SSL certificate for use with Tomcat?

Posted in :

想在 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/ 就可以解決.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *