20200512

裝 SSL 憑證

裝自簽憑證成功了
終於啊...
趁著還有記憶的時候
趕快記錄起來

首先參考了這些文章

  1. 如何使用 OpenSSL 建立開發測試用途的自簽憑證 (Self-Signed Certificate)
  2. SSL/TLS Configuration How-To
  3. SSL Support

之前也試著裝過幾次自簽憑證
每次都在莫名其妙的地方卡住
從這次成功經驗來看
之前應該都是我的 config 寫錯了吧

這次裝在 Ubuntu 20.04 + Tomcat 9.0.34 上
如果使用 keytool 產生 key 那麼很輕鬆的就能完成
就只是憑證有效期是 90 天而已

使用 openssl 產生的 key
有效期就隨便寫
我抓了十年了 (反正是開發機)
我的 config 長這樣:

<Connector port="8443"
   protocol="org.apache.coyote.http11.Http11NioProtocol"
   maxThreads="150" SSLEnabled="true" scheme="https" secure="true">
   <SSLHostConfig protocols="TLSv1+TLSv1.1+TLSv1.2">
      <Certificate
         certificateKeyFile="key的位置"
         certificateFile="crt 的位置"
         certificateChainFile="不知道怎麼寫  就一樣寫了 crt 的位置了..."
         type="RSA" />
   </SSLHostConfig>
</Connector>

以前都把一堆屬性直接寫在 Connector 裡面
現在建議寫在 SSLHostConfig 還有 Certificate 裡面
官方文件裡還有一堆屬性可以設定
只是看不懂...
有這次成功經驗後
如果之後辦公室申請了正式憑證
我要安裝起來應該會順利一點了

後來我們去申請了別人發行的憑證
總共拿到 "certificate.crt", "ca_bundle.crt", "private.key" 三個檔案
放到實驗機上

<Certificate
         certificateKeyFile="key的位置"
         certificateFile="certificate 的位置"
         certificateChainFile="這次有 ca_bundle 的位置了"
         type="RSA" />

其他資料都不動
運作起來都很順利
真是太棒了~

有了真正成功的例子後
多了一台新機器 (而且是正式機) 要處理
windows 2008R2 + Tomcat 9.0.36 + jdk-9.0.4
上面沒有 openssl 有夠麻煩的...
原本以為照常把檔案換上去就可以了
結果並沒有...

官方文件還有另外一篇教學中的第一步驟是用 openssl Convert Certificate Files
在正式機上不能亂亂裝東西的情形下
我從自己電腦轉好後上傳
接著照剩下步驟做
馬上在第三步驟卡住

金鑰工具錯誤:java.lang.Exception: 所輸入的不是 X.509 憑證

然後我開始懷疑文件騙人 T_T
也不知道哪裡鬼打牆了
就是一直說我格式不對
Tomcat Document 也只要兩步驟就完成的
結果也不行

keytool -import -alias root -keystore <key 的位置> -trustcacerts -file <ca_bundle 的位置>

結果是:
金鑰工具錯誤:java.security.KeyStoreException: Unrecognized keystore format: null

最後只好認真轉換格式
照這一篇 Converting PEM-format keys to JKS format
雖然不能理解其中的做法 (genkey 後又把 alias 關係拿掉?)
最後配上修改後的 server.xml

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           keystoreFile="最後的 keystore.ks 的位置" keystorePass="key 的密碼"
           clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2,TLSv1.1,TLSv1">

因為對 keytool 不熟
中間搭配了 The Most Common Java Keytool Keystore Commands 來操作
總算安裝完成

20.08.24 系統提醒說要過期了
所以我又要來更新一次
結果照著上次寫的步驟似乎又少了什麼東西
決定再寫清楚一些

我這次的第一步驟是:

openssl pkcs12 -export -in certificate.crt -inkey private.key -out certificate.p12 -name tomcat -CAfile ca_bundle.crt -caname root -chain

剩下再照著流程跑完就好了

21.06.25
這次嘗試裝 Let's Encrypt

sudo certbot certonly --standalone

因為拿回來的檔案都是 .pem 格式
先照前面文件將 .pem 轉成 keystore 再修改 service.xml
竟然還是不行

Protocol handler initialization failed

找到一篇文章 Failed to initialize Tomcat on port 443 - the trustAnchors parameter must be non-empty實在不確定有沒有一樣

可是整個環境被我弄壞了
連 http 都讀不到
最後只能重裝 tomcat, 重新裝一次憑證
這次也重新寫了 SSLHostConfig

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
            maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="keystore.ks 的位置"
                       certificateKeystorePassword="keystore.ks 的密碼"
                       type="RSA" />
    </SSLHostConfig>
</Connector>

21.09.24
上次裝的的憑證在 09.23 到期了
放著一天結果沒有 renew 大概是我哪裡又弄錯了
今天決定手動 renew
然後又碰到 challenge failed 的事
現在又卡住了...
上次 standalone 版本的更新還是不行
只好先把舊的 certificate 砍掉重新來過
這次換了另一種 webroot 方法
(這次也直接拿 .pem 來用就不轉格式了)
最後是先裝上去了
就等三個月後看看

sudo certbot certonly --webroot -w /opt/tomcat/latest/webapps/ROOT

22.12.08
今天又要重新裝一台

sudo certbot certonly --webroot -w /opt/tomcat/latest/webapps/ROOT

現在申請 key 已經沒太大困難了 (問題都卡在 tomcat 設定上...)
首先一定要能連得到 "網域"/.well-known/acme-challenge/
這裡常常會要動 routing table 我就還學不會...
今天還卡在 key 讀不到 permission denied 的問題
這時候就要動權限了
也是我還學不會的地方...

0 comments:

張貼留言