為了推動更安全的HTTPS加密協議普及全網,谷歌Chrome從2017年開始逐步對HTTP網站標記“不安全”警告,并提示“你與此網站之間建立的連接不安全”。在Chrome 68版本中,對所有HTTP網站標記“不安全”,幫助用戶了解與網站之間的連接何時不安全,同時激勵網站所有者提高其網站的安全性。
此外,某些版本的chrome還結合一組互補字符串使用,讓用戶更容易理解安全標識的含義。
- 對于有效HTTPS:顯示“secure” 和“https”,配合綠色安全鎖
- 對于HTTP:顯示“http”和“site not secure”,配合黑色圓圈
- 對于無效HTTPS:顯示“not secure”and “site not secure”,配合紅色三角警告
對于一些個人博客來說,雖然不存在注冊、交易等可能泄露個人隱私信息的情況,但是也建議為網站申請和部署SSL證書(免費的即可),畢竟即使是不安全提示也會嚇退一部分用戶。
本文記錄一下如何在阿里云服務器上部署SSL證書,希望對您有所幫助。
首先訪問阿里云SSL證書-免費證書(證書申請請參考:如何申請阿里云SSL證書?),根據你的web服務器類型,下載對應的證書。我選擇的是Apache服務器,這里需要根據實際情況進行選擇。
證書由3個文件組成,分別為:
- 證書文件:以xxx_public.crt為后綴或文件類型。
- 證書鏈文件:以xxx_chain.crt為后綴或文件類型。
- 密鑰文件:以xxx.key為后綴或文件類型。
證書下載完成之后,就可以開始部署SSL證書了。
開放端口443
由于HTTPS使用443端口,因此首先需要配置一下阿里云安全組的訪問規則,放開443端口。
配置入口:https://ecs.console.aliyun.com/#/server/i-j6cagiqhn4rzss2r6jjj/group/group?regionId=cn-hongkong
最簡單的方法就是復制一下80端口的規則,然后將端口號改為443即可。
安裝mod_ssl
對于centos 7請使用YUM命令安裝mod_ssl模塊,如果系統為CentOS 8/Rockylinux 8/AlmaLinux8等,可以使用dnf命令。
# 安裝mod_ssl模塊yum -y install mod_ssl# 為了使能mod_ssl,需要重新啟動Apachesystemctl restart httpd# 使用httpd或者apachectl檢查是否使能了mod_ssl,如果輸出ssl_module(shared),那么配置成功。httpd -M | grep sslapachectl -M | grep sslssl_module (shared)
輸入httpd -S 可以看到Apache當前的配置信息(當前僅顯示虛擬主機設置)
其中 *:443 localhost (/etc/httpd/conf.d/ssl.conf:40) 表示當前已經在localhost監聽443端口。
# httpd -SVirtualHost configuration:*:80 is a NameVirtualHostdefault Server domain1.com (/etc/httpd/conf.d/domain1.com.conf:1)port 80 namevhost domain1.com (/etc/httpd/conf.d/domain1.com.conf:1)alias www.domain1.comport 80 namevhost domain2.com (/etc/httpd/conf.d/domain1.com.conf:17)alias www.domain2.com*:443 localhost (/etc/httpd/conf.d/ssl.conf:40)Serverroot: "/etc/httpd"Main DocumentRoot: "/var/www/html"Main ErrorLog: "/etc/httpd/logs/error_log"Mutex lua-ivm-shm: using_defaultsMutex ssl-stapling: using_defaultsMutex proxy: using_defaultsMutex authn-socache: using_defaultsMutex ssl-cache: using_defaultsMutex default: dir="/etc/httpd/run/" mechanism=defaultMutex cache-socache: using_defaultsMutex authdigest-opaque: using_defaultsMutex watchdog-callback: using_defaultsMutex proxy-balancer-shm: using_defaultsMutex rewrite-map: using_defaultsMutex ssl-stapling-refresh: using_defaultsMutex authdigest-client: using_defaultsPidFile: "/etc/httpd/run/httpd.pid"Define: DUMP_VHOSTSDefine: DUMP_RUN_CFGUser: name="apache" id=48Group: name="apache" id=48
mod_ssl配置文件位于下面兩個文件中:
/etc/httpd/conf.d/ssl.conf/etc/httpd/conf.modules.d/00-ssl.conf
其中 00-ssl.conf 的內容只有一行,表示加載mod_ssl模塊:
LoadModule ssl_module modules/mod_ssl.so
ssl.conf 則是SSL配置文件
拷貝證書
將證書拷貝到服務器上的Apache安裝目錄中,對于YUM安裝的Apache來說,安裝目錄位于:/etc/http。我們創建一個cert目錄(目錄名稱隨意)專門用來存放證書。
根據[https://serverfault.com/questions/216477/what-should-be-the-permissions-of-apache-ssl-directory-Certificate-and-key]:
- cert目錄和證書文件的屬主應該為root(root)。
- cert目錄的權限應該設置為700,證書文件的權限應該設置為600。
之所以需要寫權限是為了定期更新證書。如果手動更新的話,目錄權限可以設置為500,證書權限可以設置為400。
# chown -R root:root /etc/httpd/cert# mkdir /etc/httpd/cert# chmod 700 /etc/httpd/cert/
配置SSL證書
在 /etc/httpd/conf.modules.d/00-ssl.conf 文件(也可以在/etc/httpd/conf.d/ssl.conf文件或者創建一個新的.conf文件)中添加以下內容:
注意:如果證書包含多個域名,復制...,并將ServerName修改為其它域名。
LoadModule ssl_module modules/mod_ssl.soServerName www.haitaolab.comDocumentRoot /var/www/htmlSSLEngine onSSLProtocol all -SSLv2 -SSLv3SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUMSSLHonorCipherOrder onSSLCertificateFile /etc/httpd/cert/7772727_www.haitaolab.com_public.crtSSLCertificateKeyFile /etc/httpd/cert/7772727_www.haitaolab.com.keySSLCertificateChainFile /etc/httpd/cert/7772727_www.haitaolab.com_chain.crtServerName haitaolab.comDocumentRoot /var/www/htmlSSLEngine onSSLProtocol all -SSLv2 -SSLv3SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUMSSLHonorCipherOrder onSSLCertificateFile /etc/httpd/cert/7772727_www.haitaolab.com_public.crtSSLCertificateKeyFile /etc/httpd/cert/7772727_www.haitaolab.com.keySSLCertificateChainFile /etc/httpd/cert/7772727_www.haitaolab.com_chain.crt
此時如果訪問https://haitaolab.com的話,應該可以正常訪問,并且帶有一把小鎖。
在[https://www.digitalocean.com/community/questions/apache-non-www-to-www-https-secure-and-let-s-encrypt]中還介紹了一種方法,
ServerAdmin admin@domain.co.ukServerName www.domain.co.ukServerAlias domain.co.ukDocumentRoot /var/www/html/domainOptions FollowSymLinksAllowOverride AllRequire all granted# Redirect non-www to wwwRewriteEngine OnRewriteCond %{HTTP_HOST} !^www. [NC]RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]ErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combinedInclude /etc/letsencrypt/options-ssl-apache.confSSLCertificateFile /etc/letsencrypt/live/domain.co.uk/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/domain.co.uk/privkey.pem
下一步就是將http鏈接的訪問永久重定向到https鏈接。
執行301永久重定向
重定向有兩種方法:
- 服務器虛擬主機配置文件
- .htaccess文件
(1)服務器虛擬主機配置文件
老外的大多數教程都使用了下面這種方法,即在主配置文件添加下面的配置
sudo vi /etc/httpd/conf/httpd.confServerName www.example.comRedirect "/" "https://www.example.com/"
不過,我覺得單獨創建一個配置文件更好一些,例如在 httpd/conf.d 目錄中創建一個 haitaolab.conf 配置文件,內容為:
ServerName www.haitaolab.comRedirect permanent "/" "https://www.haitaolab.com/"
注意:permanent 的意思是301永久重定向。
(2).htaccess
也可以通過在.htaccess文件中添加規則進行重定向,這種方法需要 使能/enable 讀取.htaccess文件,Apache默認是禁止的。
這是因為考慮到安全性,強烈建議將根目錄的AllowOverride屬性設置為 Override=None。
# AllowOverride controls what directives may be placed in .htaccess files.# It can be "All", "None", or any combination of the keywords:# Options FileInfo AuthConfig LimitAllowOverride None
如果允許.htaccess文件,那么可以這樣配置重定向
RewriteEngine OnRewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
也有這種寫法
RewriteEngine OnRewriteCond %{HTTPS} !=onRewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Apache配置文件檢測
# 檢查配置文件是否合法apachectl configtest# 重新加載配置文件systemctl reload httpd
更多介紹請參考:https://www.cyberciti.biz/faq/apache-2-reload-httpd-config-file-unix-linux-command/
SSL證書檢測
https://www.ssllabs.com/ssltest/
https://www.thesslstore.com/ssltools/ssl-checker.php#results
參考
- https://help.aliyun.com/document_detail/98727.html
- https://linuxconfig.org/how-to-install-mod-ssl-on-redhat-8
- https://www.ssldragon.com/blog/how-to-install-an-ssl-certificate-on-apache/
- https://www.thesslstore.com/ssltools/ssl-checker.php
- https://hrefgo.com/blog/redirect-http-to-https#%E5%A6%82%E4%BD%95%E5%9C%A8_Apache_%E4%B8%AD%E8%BF%9B%E8%A1%8C_HTTP_%E9%87%8D%E5%AE%9A%E5%90%91
- https://hbayraktar.medium.com/how-to-install-ssl-certificate-on-apache-for-centos-7-38c25b84d8b1
- https://developers.google.com/search/docs/advanced/crawling/301-redirects?hl=zh-cn#permanent-server-side-redirects
- https://www.namecheap.com/support/knowledgebase/article.aspx/10313/33/ssl-certificate-installation-on-httpd-centos/
- https://www.cnblogs.com/kevingrace/p/9565123.html
- https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-apache-for-centos-7