使用 Lets-encrypt 為 Tomcat 配置 https

PreferMa發表於2019-07-13

Let's Encrypt 由網際網路安全研究小組(縮寫 ISRG )提供服務。主要贊助商包括電子前哨基金會、Mozilla 基金會、Akamai 以及思科。2015年4月9日,ISRG 與 Linux 基金會宣佈合作。
用以實現新的數字證照認證機構的協議被稱為自動證照管理環境(ACME)。GitHub 上有這一規範的草案,且提案的一個版本已作為一個 Internet 草案發布。Let's Encrypt 宣稱這一過程將十分簡單、自動化並且免費

Certbot 為 Let’s Encrypt 專案釋出了一個官方的客戶端 Certbot ,利用它可以完全自動化的獲取、部署和更新安全證照,並且 Certbot 是支援所有 Unix 核心的作業系統。

最近打算給公司所有的域名都配置上 https 服務,開始配置了幾個 nginx 服務的都比較順利,嗯,Certbot 真好用。直到遇到一臺 Centos6 + Tomcat7 + openjdk1.7 的環境(這環境絕了),真香(當然,這與 Certbot 無關)。

按照 Certbot 官網操作下載 Certbot 客戶端:

$ wget https://dl.eff.org/certbot-auto
$ sudo mv certbot-auto /usr/local/bin/certbot-auto
$ sudo chown root /usr/local/bin/certbot-auto
$ sudo chmod 0755 /usr/local/bin/certbot-auto

只要網路沒有問題,這一步完全沒有問題。接下來 Cerbot 提供了兩種使用方式

  1. webroot 方式: certbot 會利用既有的 web server,在其 web root 目錄下建立隱藏檔案,Let’s Encrypt 服務端會透過域名來訪問這些隱藏檔案,以確認你的確擁有對應域名的控制權。
  2. standalone 方式: Certbot 會自己執行一個 web server 來進行驗證。如果我們自己的伺服器上已經有 web server 正在執行 (比如 Nginx 或 Tomcat ,主要是看你的 80 埠有沒有被佔用),用 standalone 方式的話需要先關掉它,以免衝突

這裡我採用了 webroot 方式

$ sudo /usr/local/bin/certbot-auto certonly --webroot

災難從這裡開始。執行該命令提示需要安裝epel-release,OK ,小問題。我一個 yum intall 命令下去.....,提示找不到這個包,不慌 yum不行我們換 rpm。順利使用 rpm 安裝 epel-release 包,開心。再次執行 webroot 命令,再次報錯需要 Python 版本大於 2.7。穩住,檢視一下當前系統Python 版本 ,好吧,當前Pyrhon版本為空,這都是小問題,我一個yum install 命令下去......,WTK ,yum 命令不存在。沒關係,我們搜尋一下,萬能的網際網路。這裡有一個需要注意的地方,網上給出的 rpm 包的版本可能不是最新的版本,會導致下載不成功。具體的版本以映象庫實際版本為準。

先安裝 Python ,rpm包不要一個一個安裝,安裝包之間有順序依賴。使用 rpm -ivh python-*一次性安裝沒有問題

$ mkdir /usr/local/src/python

$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/python-2.6.6-66.el6_8.x86_64.rpm
$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm
$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/rpm-python-4.8.0-59.el6.x86_64.rpm
$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/python-devel-2.6.6-66.el6_8.x86_64.rpm
$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/python-pycurl-7.19.0-9.el6.x86_64.rpm`
$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/python-urlgrabber-3.9.1-11.el6.noarch.rpm
$ wget  http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/python-libs-2.6.6-66.el6_8.x86_64.rpm

$ rpm -ivh python-*   

安裝 rpm-python 包時,可能會安裝不成功。請使用下面的程式碼,強制安裝,沒有問題

$ rpm -i --force --nodeps rpm-python-4.8.0-59.el6.x86_64.rpm

再安裝 yum

$ mkdir /usr/local/src/yum
$ wget http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/yum-3.2.29-81.el6.centos.noarch.rpm
$ wget http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
$ wget http://mirrors.aliyun.com/centos/6/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm
$ rpm -ivh yum-*

好的,此時我們的 yum 回來了,執行一下 Pyhton 命令。沒錯,還是可恥的 2.6 版本。沒關係我們再來安裝 Python2.7

  1. 安裝 Development Tools
    $ yum groupinstall "Development tools"
  2. 安裝 Python 依賴包
    $ yum  install -y  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel tcl-devel tk-devel
  3. 下載及安裝 Python 2.7.12
    $ cd /opt
    $ wget --no-check-certificate https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz
    $ tar xf Python-2.7.12.tar.xz
    $ cd Python-2.7.12
    $ ./configure --prefix=/usr/local
    $ make && make install
  4. 將 Python 命令指向 Python 2.7.12
    ln -s /usr/local/bin/python2.7 /usr/local/bin/python

    5 檢查 Python 版本

    $ pyhton --version
    Python 2.7.12

    6 由於 yum 依賴於 Python 2.6,指定 yum 的 Python 版本依賴

    $ whereis  yum
    yum: /usr/bin/yum /etc/yum.conf
    $ vim  /usr/bin/yum

    修改檔案第一行為:

    #!/usr/bin/python2.6.6

    至此,環境恢復完畢。
    重新安裝 epel-release 環境依賴。

    $ yum install -y epel-release

    使用 webroot 方式生成指定域名證照

    $ cd /usr/local/bin
    $ sudo ./certbot-auto certonly --webroot 

    命令執行成功,會提示你輸入需要生成證照的域名(必填)和專案部署的目錄(必填)以及郵箱資訊(可選Certbot 證照有效期 90 天,到期後向你設定的郵箱傳送郵件),輸入完資訊會生成證照檔案。
    生成證照中會建立 /etc/letsencrypt 資料夾, 證照檔案預設存放在 /etc/letsencrypt/live/example.com 資料夾中, 其中 example.com 取自第一個域名,在 example.com 資料夾中包含 4 個檔案,
    cert.pem 域名證照,
    chain.pem 根證照及中間證照,
    fullchain.pem 由 cert.pem 和 chain.pem 合併而成,
    privkey.pem 證照私鑰。

建立一個 2048 位的 Diffie-Hellman 檔案 (nginx 預設使用 1024 位的 Diffie–Hellman 進行金鑰交換, 安全性太低)

openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048

Tomcat 需要使用 .jks 格式的證照檔案,進入證照所在目錄使用 keytool 工具生成 .jks 證照

$ cd /etc/letsencrypt/live/example.com
$  openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out fullchain_and_key.p12 -name tomcat

這裡要求設定密碼 yourPassword,下面生成證照時會用到。

$ keytool -importkeystore -deststorepass 'yourPassword' -destkeypass 'yourPassword' -destkeystore MyDSKeyStore.jks -srckeystore fullchain_and_key.p12 srcstoretype PKCS12 -srcstorepass 'yourPassword' -alias tomcat

把生成的 MyDSKeyStore.jks 證照檔案 複製到 Tomcat 配置目錄下。

$ cp  MyDSKeyStore.jks /usr/local/tomcat7/conf

修改或增加 Tomcat 配置

<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" 
URIEncoding="UTF-8" maxThreads="150" SSLEnabled="true" 
scheme="https" secure="true" clientAuth="false" 
sslProtocol="TLS" 
keystoreFile="/usr/local/tomcat7/conf/MyDSKeyStore.jks" 
keystorePass="yourPassword" 
keyAlias="tomcat" 
keyPass="yourPassword"/>

重啟 Tomcat 服務,即可訪問 https://example.com

本作品採用《CC 協議》,轉載必須註明作者和本文連結
JAVA、PHP、Python、Rust、Go、 沒有一樣玩的熟。·

相關文章