再談網站HTTPS升級

Posted by Y Cheung on Mon, Mar 19, 2018

Y.Cheung 曾於 2016 年時寫過一篇《 Centos 7 使用 certbot 安裝Let’s Encrypt SSL 證書 》,最近因爲幫忙升級了幾個站點,使用了一些免費/收費的SSL憑證服務,特寫此篇記錄一下流程思路送給整天吐槽Y.Cheung沒耐心教人的某只。

申請憑證的準備工作

申請憑證前,首先你要確認是否有域名DNS解析控制的權限,或者服務器檔案上傳的權限,或者能使用域名管理郵箱,以便簽發憑證的組織機構能夠驗證這個域名的所有權,然後準備一個申請(CSR)。

製作一個CSR (Certificate Signing Request)文件

CSR是向Certificate Authority (CA)申請憑證的標準格式,它通過private key加密,内容包含有Country Name (CN)囯碼,Organization Name (O)組織名稱,Organization Unit (OU)部門名稱,Locality (L)所在城市,State or Province Name (ST)所在州或省,Country (C)國家(地區),Email Address,Root Length鑰匙長度,Signature Algorithm簽名算法。

Google關鍵詞 “How to Generate a CSR” 能找到多種環境下產生CSR的方法,你也可以在綫WEB生成CSR,比如https://csrgenerator.com/ 。本文只介紹在Nginx (OpenSSL)環境中如何生成CSR。

很簡單,一條命令達成:

1openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr

然後根據屏幕提示一項項輸入Common Name,Organization Name等。文件名可以隨便起,不重要。 ’extra’ attributes可以按enter鍵略過不輸入。比如這樣:

openssl req

你會看到生成了一個server.keyserver.csr文件。

server.key是私鑰(private key),在服務器上部署SSL的時候會用到。一般private key内容長這樣:

 1-----BEGIN PRIVATE KEY-----
 2MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC56baFxDkWV/QL
 3pkAjbE6rO38SRtOInhG+Pq/I5y6IFbLi/MnbM8PC+27UsUV6P2STgBsAEuW3p8MS
 4rd0+OhX2qDW6T9apErK36ORpCvLdewkOAEwOdKNl0x0F0QJ75fH+b+GaaUmSXR0X
 51hCA715ph9ISv8COIQ4LDqzpH4eIoZipthpIdfUyUJMLzWlf43t8fr/z2OAn1TdL
 6yRIF1NydYB49lNTsEZnxwXFhCrZS2TJdyjFRkddOeZDFLQPUj99oILRFUjovAeXP
 74ZYyVOT7Z+1RAKV0djgs4YZYrFthcJBdbgh+nlclS/CFFflfKnlGky3MDdVpba2N
 8BBRhk9QJAgMBAAECggEAEz9YDzdGdcK7WG1o3IH9DwtE156PjehXi+uvhUwx7BLb
 9B1cGivQsA0bGrayAtexUPFUZ9oL+V2o97vQjIKsg1P2LOnPDlJOD/zhUVW+1vypa
10wKFVPnXi6MrXiV+fMzaWPDJXGAZogIe1WF9oLAEcNC7El/5UMCLJ8mkdi7Eg9gsf
11dptoqRCCq2mO+q65yiT2IpBYvTJmsdRMZ5rAlLdFYTdN27/awuvbaxts57Slr++7
12jG/3UIpHV2OvD00QzYnFJJgvuuPH+oAqUaPBkgw18mBSsjxQH9otHQYTO/r59c8l
1371C6i4f1JFcp7/OA+Q0MH/twG57B3ckuek2g/YYhlQKBgQDyma2Zb0IgkFCKuEhC
144kvpcOoTEzqFwVQWpOGSFDt792JpzHcuntf3ERBeOfQkwETwmbhTq888o66amJAS
15Tt9+by/5doI2I8jebrkGww4CpA7owV9QOcohqz+xgnJhfapREf6ZXpBCutfQZFx/
16omEtFpFiqpR2mVRbcSApsR0kzwKBgQDELnyDjBNHhkJ/ns2cx6qAJCmpKMqTveNU
17peExG4XntFcpGhU3a7nBZyFvZfa1nuat5P0pRxKPIlvxMccCQG6qJ8n37ZTIwkjh
184grSJjOaq1M+CnrL9c2X/Tq+FVdeyeMohpvsYUWOPFXuSCLSRP3supGxgnvXmtJq
19Y5LmFJhfpwKBgC0mZsWojDENSsAWffRcs24VwqqcKIceLO0t8IFEXLG8n8c6829s
20xprHxTkUJhj045+3rDN+RUpu2B8Th7Swky2vucj+wksbK9Yh2zOj96aMK+4rlvaS
21WskbWvZJZco5HgqKg8y9abHRnjq9gu2KJfXDPnmTb6AG90kxa5/2w4rHAoGAe+3B
22ynfaVfyCVYxD5x5ansg5aRrTnbD+wqJnN1ZjqJNL3DMV5ASxO3Ois3R9/Q18O63E
23Hyc+mhziZ+NCDDIXtnWcKHp02r2gvNDGdSqcvsArva1xFRcZ4UGesiVZJA/058zh
24AtoPzmJfBj+bf6kFn13cW35KLVEoSvzL93xbJVECgYEAquQ44/FicqsU0bMVxOXL
25mukBOQOfRzEoXOokrpvM7XdMMBo6491iEkLgVBdrWC1eMKobMFjO+FVKh7tYwdMp
26uCCZbPP8Xy5W0w/eTlxNybxuTZyCIXks25q5BoU7M7RTpLYGjUQOwfLHlW0xr+Ja
273CFUQBllXhbBVF95wJQwxpM=
28-----END PRIVATE KEY-----

server.csr在去CA申請憑證的時候會用到。一般CSR内容像這樣:

 1-----BEGIN CERTIFICATE REQUEST-----
 2MIIC1zCCAb8CAQAwgZExCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTER
 3MA8GA1UEBwwIU2hhbmdoYWkxEjAQBgNVBAoMCVN6ZSBDaGluZzEQMA4GA1UECwwH
 4V2Vic2l0ZTEVMBMGA1UEAwwMc3plY2hpbmcuY29tMR8wHQYJKoZIhvcNAQkBFhBp
 5YW1Ac3plY2hpbmcuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
 6uem2hcQ5Flf0C6ZAI2xOqzt/EkbTiJ4Rvj6vyOcuiBWy4vzJ2zPDwvtu1LFFej9k
 7k4AbABLlt6fDEq3dPjoV9qg1uk/WqRKyt+jkaQry3XsJDgBMDnSjZdMdBdECe+Xx
 8/m/hmmlJkl0dF9YQgO9eaYfSEr/AjiEOCw6s6R+HiKGYqbYaSHX1MlCTC81pX+N7
 9fH6/89jgJ9U3S8kSBdTcnWAePZTU7BGZ8cFxYQq2UtkyXcoxUZHXTnmQxS0D1I/f
10aCC0RVI6LwHlz+GWMlTk+2ftUQCldHY4LOGGWKxbYXCQXW4Ifp5XJUvwhRX5Xyp5
11RpMtzA3VaW2tjQQUYZPUCQIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAKWgpLY/
123Mg0FgCK19vERWz7fCFComHA2l/yW/x3oGnnLhKQShu2VAB/DPo4ibM3VPJy5DG4
139EBhYgh7CsfAXwET9TuhguOoobmCJzkBFFl6oXZYqIpaczx8Qolkb54uyg9LcxOg
14LAnIOLNBC/JRmYPAMtLP1qJojA46QWW38zMt8ckq1dVO0C/5IYAEdTNBH4hSr2w1
154AU6UJP/EnKbOFgCc06OQlSvU2Kt/YWZw74kQPv+1PuJw1MZsYa0D5dggWW8cpFH
16V3bt3xHXksna5vehuTRQWst7/5J8bdWgSWg8X5Z5TrbrhcePkxwkzso0bSgzDTbx
17LbMQ1k2g9S4UIYw=
18-----END CERTIFICATE REQUEST-----

申請憑證

填寫表單

按各CA需求填寫申請憑證表單,在CSR欄位將剛才準備好的CSR文件内容置入。有的CA需要以上傳文件的方式提供,有的則是textarea表單,需要在本地使用記事本(推薦sublime text)之類的工具打開server.csr文件,複製粘貼其全部内容填入表單。

驗證域名所有權

一般有三種方式驗證域名所有權:

  • Email驗證:CA會發送郵件至域名管理郵箱,默認發送[email protected][email protected][email protected][email protected][email protected]或者域名whois中所填寫的郵箱(所以有時候你也需要在申請憑證時暫停你的whois privacy protect讓CA能識別到正確的郵箱地址)

  • 上傳文件認證: CA會提供特別的文件讓你放到該域名可公開HTTP/HTTPS訪問的指定目錄下,一般是放在/.well-known/下。

  • CNAME認證: CA會讓你在所申請的域名DNS記錄中增加一條指定的CNAME記錄來驗證。

下載憑證

通過域名驗證后就能下載你所申請的憑證了,有些CA會寄送至你注冊郵箱中。

安裝憑證

以下簡略介紹一下再部分環境中如何安裝憑證,更詳細的内容可以自行Google。

NGINX安裝及設定SSL

使用命令行cat your_domain_name.crt CAROOT.crt >> bundle.crt或者用記事本將申請來的域名憑證(通常以申請域名為文件名)與根憑證串聯成一個文件。(2020年更新:可以使用諸如https://tools.keycdn.com/certificate-chain 服務來生成信任鏈,複製粘貼Certificate Chain至新建文件*.crt中)

將串聯后的檔案(ca-bundle file)以及製作CSR檔時的private key上傳至服務器,比如放在這裏/var/ssl/

然後在virtual host config文件中作相應的SSL配置,可以參考nginx的説明《Configuring HTTPS servers》,比如這樣

 1server {
 2        listen 443 ssl;
 3        server_name          your.domain.name;
 4        ssl_certificate      /var/ssl/your_domain_name.crt;
 5        ssl_certificate_key  /var/ssl/your_domain_name.key;
 6        root /your_www_document;
 7        index index.php index.html index.htm;
 8
 9        # other configs
10}

APACHE安裝及設定SSL

APACHE安裝SSL的步驟大致同上,virtual host配置參考官方文檔《SSL/TLS Strong Encryption: How-To》,比如這樣:

 1<IfModule mod_ssl.c>
 2        <VirtualHost _default_:443>
 3                DocumentRoot /var/www/html/public
 4
 5                <Directory />
 6                        Options FollowSymLinks
 7                        AllowOverride All
 8                </Directory>
 9                <Directory /var/www/public>
10                        Options Indexes FollowSymLinks
11                        AllowOverride All
12                        Require all granted
13                </Directory>
14                ErrorLog ${APACHE_LOG_DIR}/error.log
15                CustomLog ${APACHE_LOG_DIR}/access.log combined
16
17                SSLEngine on
18                SSLCertificateFile    /var/ssl/your_domain_name.crt
19                SSLCertificateKeyFile /var/ssl/your_domain_name.key
20                <FilesMatch "\.(cgi|shtml|phtml|php)$">
21                                SSLOptions +StdEnvVars
22                </FilesMatch>
23                <Directory /usr/lib/cgi-bin>
24                                SSLOptions +StdEnvVars
25                </Directory>
26
27        </VirtualHost>
28</IfModule>

DOMLINUX管理界面安裝及設定SSL

系統設定/憑證管理中將private key内容粘貼至伺服器金輪欄位,申請來的域名憑證内容粘貼至憑證證書欄位。

其他伺服器/WEB伺服器中編輯所要添加SSL的域名,啓用SSL並將阜號修改為443。如需强制轉址HTTP至HTTPS,可新增一條同名域名記錄,阜號80,不啓用SSL,並在進階手動設置中添加apache rewrite規則,比如:

1<IfModule mod_rewrite.c>
2    RewriteEngine On
3
4    RewriteCond %{HTTPS} off
5    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
6
7</IfModule>

以上。

如有未盡事宜,之後更新或者再寫一篇。