再談網站HTTPS升級

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。

很簡單,一條命令達成:

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

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

openssl req

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

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

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC56baFxDkWV/QL  
pkAjbE6rO38SRtOInhG+Pq/I5y6IFbLi/MnbM8PC+27UsUV6P2STgBsAEuW3p8MS  
rd0+OhX2qDW6T9apErK36ORpCvLdewkOAEwOdKNl0x0F0QJ75fH+b+GaaUmSXR0X  
1hCA715ph9ISv8COIQ4LDqzpH4eIoZipthpIdfUyUJMLzWlf43t8fr/z2OAn1TdL  
yRIF1NydYB49lNTsEZnxwXFhCrZS2TJdyjFRkddOeZDFLQPUj99oILRFUjovAeXP  
4ZYyVOT7Z+1RAKV0djgs4YZYrFthcJBdbgh+nlclS/CFFflfKnlGky3MDdVpba2N  
BBRhk9QJAgMBAAECggEAEz9YDzdGdcK7WG1o3IH9DwtE156PjehXi+uvhUwx7BLb  
B1cGivQsA0bGrayAtexUPFUZ9oL+V2o97vQjIKsg1P2LOnPDlJOD/zhUVW+1vypa  
wKFVPnXi6MrXiV+fMzaWPDJXGAZogIe1WF9oLAEcNC7El/5UMCLJ8mkdi7Eg9gsf  
dptoqRCCq2mO+q65yiT2IpBYvTJmsdRMZ5rAlLdFYTdN27/awuvbaxts57Slr++7  
jG/3UIpHV2OvD00QzYnFJJgvuuPH+oAqUaPBkgw18mBSsjxQH9otHQYTO/r59c8l  
71C6i4f1JFcp7/OA+Q0MH/twG57B3ckuek2g/YYhlQKBgQDyma2Zb0IgkFCKuEhC  
4kvpcOoTEzqFwVQWpOGSFDt792JpzHcuntf3ERBeOfQkwETwmbhTq888o66amJAS  
Tt9+by/5doI2I8jebrkGww4CpA7owV9QOcohqz+xgnJhfapREf6ZXpBCutfQZFx/  
omEtFpFiqpR2mVRbcSApsR0kzwKBgQDELnyDjBNHhkJ/ns2cx6qAJCmpKMqTveNU  
peExG4XntFcpGhU3a7nBZyFvZfa1nuat5P0pRxKPIlvxMccCQG6qJ8n37ZTIwkjh  
4grSJjOaq1M+CnrL9c2X/Tq+FVdeyeMohpvsYUWOPFXuSCLSRP3supGxgnvXmtJq  
Y5LmFJhfpwKBgC0mZsWojDENSsAWffRcs24VwqqcKIceLO0t8IFEXLG8n8c6829s  
xprHxTkUJhj045+3rDN+RUpu2B8Th7Swky2vucj+wksbK9Yh2zOj96aMK+4rlvaS  
WskbWvZJZco5HgqKg8y9abHRnjq9gu2KJfXDPnmTb6AG90kxa5/2w4rHAoGAe+3B  
ynfaVfyCVYxD5x5ansg5aRrTnbD+wqJnN1ZjqJNL3DMV5ASxO3Ois3R9/Q18O63E  
Hyc+mhziZ+NCDDIXtnWcKHp02r2gvNDGdSqcvsArva1xFRcZ4UGesiVZJA/058zh  
AtoPzmJfBj+bf6kFn13cW35KLVEoSvzL93xbJVECgYEAquQ44/FicqsU0bMVxOXL  
mukBOQOfRzEoXOokrpvM7XdMMBo6491iEkLgVBdrWC1eMKobMFjO+FVKh7tYwdMp  
uCCZbPP8Xy5W0w/eTlxNybxuTZyCIXks25q5BoU7M7RTpLYGjUQOwfLHlW0xr+Ja  
3CFUQBllXhbBVF95wJQwxpM=  
-----END PRIVATE KEY-----

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

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

二、申請憑證

1. 填寫表單

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

2. 驗證域名所有權

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

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

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

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

3. 下載憑證

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

三、安裝憑證

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

NGINX安裝及設定SSL

使用命令行cat your_domain_name.crt CAROOT.crt >> bundle.crt或者用記事本將申請來的域名憑證(通常以申請域名為文件名)與根憑證串聯成一個文件。

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

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

server {  
        listen 443 ssl;
        server_name          your.domain.name;
        ssl_certificate      /var/ssl/your_domain_name.crt;
        ssl_certificate_key  /var/ssl/your_domain_name.key;
        root /your_www_document;
        index index.php index.html index.htm;
        ...  ...
}

APACHE安裝及設定SSL

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

...
<IfModule mod_ssl.c>  
        <VirtualHost _default_:443>
                DocumentRoot /var/www/html/public

                <Directory />
                        Options FollowSymLinks
                        AllowOverride All
                </Directory>
                <Directory /var/www/public>
                        Options Indexes FollowSymLinks
                        AllowOverride All
                        Require all granted
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on
                SSLCertificateFile    /var/ssl/your_domain_name.crt
                SSLCertificateKeyFile /var/ssl/your_domain_name.key
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>  
...

奇怪的DOMLINUX管理界面安裝及設定SSL

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

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

<IfModule mod_rewrite.c>  
    RewriteEngine On

    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

</IfModule>  

以上。

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