# 如何透過批次檔批次將 PFX 憑證的私密金鑰匯出並重新打包新的 PFX 檔案

今天有客戶希望我們重新提供給他們一次 PFX 憑證檔案，所以我寫了一支批次檔專門用來匯出先前的 PFX 金鑰，並且再重新將 TWCA 簽發的 `server.cer` 憑證搭配原始金鑰再匯出一份新的 PFX 金鑰與設定強式密碼給他們。這篇文章我就來分享今天撰寫的腳本。

![Image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2d406cdfaaa586d3348d-9151993f-d537-4775-92fd-1b665d79e949.webp)

### 批次檔程式碼分享

以下兩個命令只要設定好密碼後，就可以一次執行到底，不用人工介入輸入密碼：

1.  快速取得 PFX 金鑰檔中的私密金鑰
    
    ```batch
    @ECHO OFF
    
    if not exist "TEMP" mkdir "TEMP"
    cd TEMP
    
    COPY ..\example.com.pfx .
    
    REM 設定 PFX 的匯出密碼
    set PFX_PASS=VeryStrongPassword
    
    REM 將 example.com.pfx 解出 example.com-key.pem 這把私密金鑰
    openssl pkcs12 -in example.com.pfx -nocerts -out example.com-key.pem -nodes -passin env:PFX_PASS
    
    set PFX_PASS=
    ```
    
2.  快速將私密金鑰與憑證合併成新的 PFX 金鑰檔
    
    ```batch
    @ECHO OFF
    
    if not exist "TEMP" mkdir "TEMP"
    cd TEMP
    
    REM https://delinea.com/resources/password-generator-it-tool
    set PFX_PASS=VeryStrongPassword
    
    if exist "example.com.pfx" del /f /q "example.com.pfx"
    if exist "example.com.cer" del /f /q "example.com.cer"
    
    REM 解壓縮 TWCA 提供給我們的壓縮檔（僅含伺服器憑證、中繼憑證、根憑證，不含私密金鑰）
    unzip -o ..\example.com-cert.zip
    
    REM TWCA 提供的金鑰檔案一律為 server.cer
    REN server.cer example.com.cer
    
    REM 匯出新的 PFX 金鑰檔
    openssl pkcs12 -export -inkey example.com-key.pem -in example.com.cer -out example.com.pfx -passout env:PFX_PASS
    
    REM 輸出一個包含 PFX 憑證匯出密碼的文字檔 (透過 powershell 是為了不要輸出斷行字元)
    powershell -NoProfile -Command "Set-Content -LiteralPath '憑證密碼.txt' -Value $env:PFX_PASS -NoNewline"
    
    
    REM 設定一組 7-zip 壓縮檔案時的「解壓密碼」
    set ZIP_PASS=AnotherVeryStrongPassword
    
    7z a -tzip "example.com-pfx-with-pw.zip" *.pfx *.txt -r -p%ZIP_PASS% -y
    
    set PFX_PASS=
    set ZIP_PASS=
    ```
    

然後，分別用不同的管道將「壓縮檔」與「解壓密碼」傳遞給客戶，避免郵件攔截攻擊：

1.  僅包含**強式加密**的「壓縮檔」，內含 PFX 憑證與匯出密碼
2.  僅包含**強式加密**的壓縮檔的「解壓密碼」

### 為什麼要分別寄出兩封分開的郵件給客戶？

我經常會看到銀行業客戶在寄送機密郵件時，會刻意的拆成兩封郵件寄出，一封是郵件本身並且包含一份加密的附件，另一封則是開啟的密碼，這兩封郵件經常是一起寄送的，我第一次看到時還會覺得有點奇怪，這樣真的有比較安全嗎？😅

其實，**加密壓縮檔**與**解壓縮密碼**經常分兩封郵件送出，主要是基於**資安考量**，希望避免單一郵件被攔截後，攻擊者能夠同時取得壓縮檔與密碼。雖然這兩封郵件多半會寄給同一個收件人，但分開寄送是嘗試降低因**單一管道漏洩**所帶來的安全風險。

不過，如果兩封郵件都透過相同的電子郵件系統或路徑送出，一旦該郵件帳號或伺服器被入侵，攻擊者仍可能同時獲得壓縮檔和密碼，因此此作法並非絕對安全，而是提升了攻擊者的攔截難度。更安全的做法是利用第二管道 (例如電話、簡訊或即時通訊工具) 傳送密碼，或採用更完善的加密和傳輸管道保護！👍
