1. 程式人生 > >Tomcat在Apr模式下的Https雙向認證

Tomcat在Apr模式下的Https雙向認證

當tomcat使用Apr模式的時候,如果按照老方法配置https:

控制檯會出現如下錯誤

Connector attribute SSLCertificateFile must be defined when using SSL with APR

直接Google,很多答案都是不啟用APR,但這樣做將失去APR庫的價值,Tomcat效能必然下降。

讓我們開啟Tomcat的文件webapps/docs/apr.html,其中講到

 <Connector port="443" maxHttpHeaderSize="8192"
                 maxThreads="150"
                 enableLookups="false" disableUploadTimeout="true"
                 acceptCount="100" scheme="https" secure="true"
                 SSLEnabled="true"
                 SSLCertificateFile="${catalina.base}/conf/localhost.crt"
                 SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" />

SSLCertificateFile屬性好理解,是指證書檔案,就是用keytool匯出的那個。

而SSLCertificateKeyFile應該是指私鑰,這個東西從哪裡來呢,繼續找資料。

關鍵是這一段:

keytool -importkeystore -srckeystore keystore.jks \
    -destkeystore intermediate.p12 -deststoretype PKCS12

Next, use OpenSSL to do the extraction to PEM:

openssl pkcs12 -in intermediate.p12 -out extracted.pem -nodes

先把keystore轉換為pkcs12格式,然後使用openssl工具匯出私鑰即可。

PS:上面描述的可能不是很清楚。

這裡給出完整的流程:

1、配置自簽名證書

然後tomcat的server.xml是這樣配置的

tomcat7配置如下:(tomcat8/9有所不同)
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
               keystoreFile="server.p12" keystorePass="changeit" keystoreType="PKCS12" 
               truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS"/>

2、更改為Apr模式

然後tomcat的server.xml

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
              SSLCertificateFile="server-cert.pem"
                 SSLCertificateKeyFile="server-key.pem" />

就可以了,https+apr配置完成

3、配置了Apr的同時,如果需要以非ROOT方式啟動tomcat需注意:

  • 如果配置了Apr模式,注意在上一步中建立tomcat使用者時useradd tomcat -M -d / -s /usr/sbin/nologin,不能設定為notlogin,初步猜測是因為安裝APR時更改了/etc/profile系統環境變數,未登入的user讀取不了,所以啟動tomcat會提示找不到apr,解決方案是tomcat使用者設為可登入,或者直接修改daemon.sh,把環境變數新增到最上邊,環境變數是:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib