--- title: 'Apache SSL 憑證申請安裝' disqus: hackmd --- Apache SSL 憑證申請安裝 === ## Table of Contents [TOC] :::info :bulb: 建立私鑰 RSA 2048 、 產生憑證請求檔(CSR)、完成申請安裝 ::: # 建立私鑰 Server.key ## OpenSSL 工具 ### Download ● Linux: ```command sudo apt-get install openssl ``` ● Windows (Chocolatey): ```command choco install openssl ``` ● Windows (Scoop): ```command scoop install openssl ``` 參考文獻: [Linux](https://ioflood.com/blog/install-openssl-command-linux/#:~:text=In%20most%20Linux%20distributions%2C%20OpenSSL,with%20the%20command%2C%20openssl%20version%20.&text=This%20command%20will%20install%20OpenSSL,the%20tip%20of%20the%20iceberg.) 、 [Windows](https://monovm.com/blog/install-openssl-on-windows/) ### Location & Version 預設下載位置在 /usr/local/ssl/bin ```command find /-name openssl -print #找出工具安裝位置 ``` ● 查詢openssl 版本 ```command openssl version ``` > 建議使用 ver.1.0.2beta之後版本,1.0.1~1.0.2 受到 Heartbleed Bug 影響 ## 建立Server.key 私鑰檔案 ### 1. 產生RSA 私鑰 ```command openssl genrsa -des3 -out server.key 2048 ``` > `genrsa`: 表示產生 RSA 金鑰的操作。\ > `-des3`: 表示使用 3DES 加密演算法對產生的私密金鑰進行加密,並要求使用者輸入密碼來保護私密金鑰。\ > `-out server.key`: 指定產生的私鑰的輸出檔名為 server.key\ > `2048`: 指定產生的RSA 金鑰的長度為 2048 位元。 #國際密碼學規範需使用2048bits以上金鑰 OpenSSL 會產生一個有密碼保護的 RSA 私鑰檔案`server.key`,並使用 3DES 演算法對私鑰進行加密。產生金鑰後會要求輸入密碼(PEM pass phase) ```command Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ``` 以後使用私鑰時都會需要輸入。 ![image](https://hackmd.io/_uploads/H1PWsewpa.png) ### 2. 產生憑證請求檔(CSR) 憑證請求檔(CSR)通常會發送給證書頒發機構(CA) 以獲取相應的數位證書,以便在伺服器上使用 HTTPS 等安全協定。 ```command openssl req -new -key server.key -out certrequest.txt ``` > `openssl`: OpenSSL 工具的命令列工具。\ `req`: 表示產生憑證簽發要求的操作。\ `-new`: 表示建立一個新的憑證要求。\ `-key server.key`: 指定私鑰檔案 server.key 用於產生憑證請求。\ `-out certrequest.txt`: 指定產生的憑證要求的輸出檔案名稱 certrequest.txt。 產出過程中需要進行身分驗證: ``` Country Name (2 letter code) [AU]: 國家名稱 (ex.TW) State or Province Name (full name) [Some-State]: 州或省的名稱 (ex.Taiwan) Locality Name (eg, city) []: 城市名稱 (ex.Taipei) Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織名稱 (ex.Google) Organizational Unit Name (eg, section) []: 部門名稱 (ex.Information) Common Name (e.g. server FQDN or YOUR name) []: 網域名稱 (ex. www.google.com) Email Address []: 電子信箱 (ex. yahoo@gmail.com) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 若不需要按Enter An optional company name []: 若不需要按Enter ``` 3. 查看 RSA 內容 ```command openssl req -noout -text -in certrequest.txt ``` 會列出 ``` Certificate Request: Data: Version: 1 (0x0) Subject: C = TW, ST = Taiwan, L = Taipei, O = Google, OU = Information, CN = www.google.com, emailAddress = yahoo@gmail.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ce:5d:40:84:dc:82:bd:25:43:bb:cf:57:26:3b: d0:67:af:71:0a:cd:54:53:ca:f9:a7:e7:f0:82:78: ~~ 等等 ``` # 將certrequest.txt 送至證書頒發機構(CA) 依照證書頒發機構填寫 個人/公司/法人 資料 如中華電信: ![image](https://hackmd.io/_uploads/BkHRjew6p.png) Reference: https://publicca.hinet.net/documents.htm # 根憑證/中繼憑證 安裝設定 :::info 在取得 CA 認證的 Public CA 簽發憑證後 ::: ## 取得 eCA自簽憑證 (根憑證 ROOTeCA) 中華電信公開金鑰基礎建設: [中華電信自簽憑證](http://epki.com.tw/download/ROOTeCA_64.crt) ![image](https://hackmd.io/_uploads/ry6ECO6pa.png) ## 取得 Public CA 憑證鏈 (中繼CA憑證) 中華電信公開金鑰基礎建設: [中華電信自身通用憑證](http://epki.com.tw/download/PublicCA2_64.crt) ![image](https://hackmd.io/_uploads/H1b4ktpaa.png) ## 匯出 ROOTeCA(根憑證) & Public CA(中繼CA憑證) ### 1. PublicCA2_64 > 詳細資料 > 簽發者 ![image](https://hackmd.io/_uploads/SkIb-taTT.png) > 複製到檔案 ### 2. 憑證匯出精靈 ![image](https://hackmd.io/_uploads/HkAQZtpTa.png) > 下一步(N) ### 3. 匯出格式設定 ![image](https://hackmd.io/_uploads/Bk5a-YTTp.png) > 選擇 :red_circle: 密碼編譯訊息語法標準- PKCS #7 憑證 (.P7B)\ > 勾選 :ballot_box_with_check: 如果可能的話,包含憑證路徑中的所有憑證 ### 4. 另存 .P7B 檔 ![image](https://hackmd.io/_uploads/BJSSXta66.png) > 存檔 ![image](https://hackmd.io/_uploads/SyvImFpTp.png) ### 5. 完成憑證匯出 ![image](https://hackmd.io/_uploads/S1JcQKapT.png) > 已成功匯出並串聯 ROOTeCA(根憑證) & Public CA(中繼CA憑證) ![image](https://hackmd.io/_uploads/ryEpEFTpT.png) ## Apache 憑證匯入 & 設定 ### 1. 將已匯出的 .P7B 匯入Apache 將完成匯出的 .P7B 複製到 Apache Server > :spiral_note_pad: 使用FTP需要以Binary格式傳輸 ### 2. Apache console #### 2.1 格式轉換 原憑證(.P7B檔)為 DER encode,需要轉換成 PEM encode (Base64) ```command openssl pkcs7 -in eCA_PublicCA.p7b -inform DER -print_certs -out eCA_PublicCA.pem ``` > `openssl`: OpenSSL 工具的命令列工具。\ `pkcs7`: 表示 PKCS#7 相關操作。\ `-in eCA_PublicCA.p7b`: 指定輸入的 PKCS#7 檔案名為 eCA_PublicCA.p7A。\ `-inform DER`: 指定輸入檔的格式為DER 格式。PKCS#7 檔案可以以 DER 或 PEM 格式儲存。\ `-print_certs`: 指示輸出列印 PKCS#7 檔案中所包含的憑證。\ `-out eCA_PublicCA.pem`: 指定輸出檔案的檔案名為eCA_PublicCA.pem,並將憑證以 PEM 格式儲存。 ![image](https://hackmd.io/_uploads/SJcadKp6T.png) #### 2.2 將產出的PEM encode 憑證移置/apache/conf/ssl.crt ● Linux: ```command cp eCA_PublicCA.pem C:\xampp\apache\conf\ssl.crt\ca.crt ``` ● Windows: ```command copy eCA_PublicCA.pem C:\xampp\apache\conf\ssl.crt\ca.crt ``` > :diamond_shape_with_a_dot_inside: C:\xampp\apache\conf\ssl.crt 依照自己 Apache 不同環境選擇不同資料夾 ### 3 編輯 ssl.conf 中的 SSLCertificateChainFile 編輯 httpd-ssl.conf 設定檔 ```command vi ~apache/conf/extra/httpd-ssl.conf ``` httpd-ssl 會根據不同環境存在不同的資料夾中 (大多都在 apache\conf 資料夾底下) ```conf=158 # Server Certificate Chain: # Point SSLCertificateChainFile at a file containing the # concatenation of PEM encoded CA certificates which form the # certificate chain for the server certificate. Alternatively # the referenced file can be the same as SSLCertificateFile "conf/ssl.crt/server.crt" # certificate for convenience. SSLCertificateChainFile "/conf/ssl.crt/{your CA.CRT file}" #上步驟申請的ca.crt ``` > 將 SSLCertificateChainFile 取消註解,加入上步驟產出的CA.CRT路徑 # SSL伺服器憑證安裝 ## 1. server.cer格式轉換 :::warning **若收到的 CA 簽發的 cer 檔為 PEM encode,則可忽略此步驟1。**\ 驗證方式: 使用文字編輯器開啟 cer 檔\ 1.顯示亂碼: DER encode\ 2.顯示 BEGIN CERTIFICATE 開頭: PEM encode ::: 原憑證(.cer)為 DER encode,需要轉換成 PEM encode (Base64) ```command openssl x509 -in server.cer -inform DER -out server.pem ``` > `openssl`: OpenSSL 工具的命令列工具。\ `x509`: 表示 X.509 相關操作。\ `-in server.cer`: 指定輸入的 X.509 憑證檔案名稱 server.cer。\ `-inform DER`: 指定輸入檔的格式為DER 編碼。X.509 憑證可以以 DER 或 PEM 格式儲存。\ `-out server.pem`: 指定輸出檔案的檔案名為 server.pem,並將憑證以 PEM 格式儲存。 ## 2. 將產出的.cer/.PEM 憑證移置/apache/conf/ssl.crt ● Linux (.cer): ```command cp server.cer C:\xampp\apache\conf\ssl.crt\server.crt ``` ● Windows (.cer): ```command copy server.cer C:\xampp\apache\conf\ssl.crt\server.crt ``` ● Linux (.pem): ```command cp server.pem C:\xampp\apache\conf\ssl.crt\server.crt ``` ● Windows (.pem): ```command copy server.pem C:\xampp\apache\conf\ssl.crt\server.crt ``` > :diamond_shape_with_a_dot_inside: C:\xampp\apache\conf\ssl.crt 依照自己 Apache 不同環境選擇不同資料夾 ![image](https://hackmd.io/_uploads/rkeXa5TTT.png) ## 3. 編輯 ssl.conf ### 3.1 編輯 ssl.conf 中的 SSLCertificateFile 編輯 httpd-ssl.conf 設定檔 ```command vi ~apache/conf/extra/httpd-ssl.conf ``` httpd-ssl 會根據不同環境存在不同的資料夾中 (大多都在 apache\conf 資料夾底下) ```conf=134 # Server Certificate: # Point SSLCertificateFile "conf/ssl.crt/server.crt" # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. Keep # in mind that if you have both an RSA and a DSA certificate you # can configure both in parallel (to also allow the use of DSA # ciphers, etc.) # Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt) # require an ECC certificate which can also be configured in # parallel. SSLCertificateFile "conf/ssl.crt/{your CRT file}" #上步驟申請的server.crt #SSLCertificateFile "conf/ssl.crt/server.crt" ``` > 將 SSLCertificateFile 編輯成上步驟產出的 SERVER.CRT 路徑 ### 3.1 編輯 ssl.conf 中的 SSLCertificateKeyFile :::info 將步驟 [**1. 產生RSA 私鑰**](#1-%E7%94%A2%E7%94%9FRSA-%E7%A7%81%E9%91%B0) 產生的 server.key 複製到 /apache/conf/ssl.key 下 ::: 編輯 httpd-ssl.conf 設定檔 ```command vi ~apache/conf/extra/httpd-ssl.conf ``` httpd-ssl 會根據不同環境存在不同的資料夾中 (大多都在 apache\conf 資料夾底下) ```conf=148 # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) # ECC keys, when in use, can also be configured in parallel SSLCertificateKeyFile "conf/ssl.key/{your Private key}" #SSLCertificateKeyFile "conf/ssl.key/server.key" #SSLCertificateKeyFile "conf/ssl.key/server.key" ``` > 將 SSLCertificateKeyFile 編輯成匯入的 SERVER.KEY 路徑 :::danger 若伺服器無法重啟遇到以下相關ERROR,無法重啟:\ AH02577: Init: SSLPassPhraseDialog builtin is not supported on Win32 (key file C:/xampp/apache/conf/ssl.key/{your Private key})\ AH02311: Fatal error initialising mod_ssl, exiting. See C:/xampp/apache/logs/error.log for more information\ AH02564: Failed to configure encrypted (?) private key www.example.com:443:0, check C:/xampp/apache/conf/ssl.key/{your Private key}\ SSL Library Error: error:04800068:PEM routines::bad password read -- You entered an incorrect pass phrase!?\ SSL Library Error: error:1E08010C:DECODER routines::unsupported (No supported data to decode. Input type: DER, Input structure: type-specific)\ SSL Library Error: error:068000A8:asn1 encoding routines::wrong tag\ SSL Library Error: error:0688010A:asn1 encoding routines::nested asn1 error\ SSL Library Error: error:0688010A:asn1 encoding routines::nested asn1 error (Field=version, Type=RSAPrivateKey)\ SSL Library Error: error:0688010A:asn1 encoding routines::nested asn1 error (Field=version, Type=PKCS8_PRIV_KEY_INFO)\ SSL Library Error: error:1E08010C:DECODER routines::unsupported (No supported data to decode. Input type: DER, Input structure: type-specific)\ SSL Library Error: error:0688010A:asn1 encoding routines::nested asn1 error (Type=RSAPrivateKey)\ SSL Library Error: error:0688010A:asn1 encoding routines::nested asn1 error (Type=PKCS8_PRIV_KEY_INFO) ::: 可能是 SSL 金鑰格式錯誤。先確保 SSL 金鑰檔案是正確的 PEM 格式,並且密碼 pass phrase 正確。 可使用以下 command,轉換 key 格式 (CER > PEM) ``` openssl rsa -inform DER -outform PEM -in C:/xampp/apache/conf/ssl.key/server.key -out C:/xampp/apache/conf/ssl.key/server.pem ``` # 重啟 Apache (完成安裝) ```command /apache/bin/apachectl stop /apache/bin/apachectl start ``` :ballot_box_with_check: 確認伺服器&防火牆有開啟對應的 HTTPS PORT (443) :::success 重啟後瀏覽伺服器,確認完成SSL安裝 ::: ![image](https://hackmd.io/_uploads/HJSct6pTa.png) >[!Note] > 若憑證過期需更換,請參考: > [Apache SSL 憑證更換](https://hackmd.io/@CHW/BydUIe5Fke) # [Apache SSL 憑證更換](https://hackmd.io/@CHW/BydUIe5Fke) ###### tags: `Apache` `SSL` `TLS`