億品元素設計資源博客

品味經典包裝設計,版式設計,分享實用設計資源、設計軟件、插件下載及在線書法字體生成
登錄注冊 聯系合作 投稿

億品元素 » 教程技巧 » wordpress全站開啟https訪問及自動申請免費ssl證書教程
wordpress全站開啟https訪問及自動申請免費ssl證書教程

wordpress全站開啟https訪問及自動申請免費ssl證書教程

網站開啟https訪問有什么好處?據說https可以防止網絡運營商劫持、還有就是https更安全、再則谷歌百度等大佬喜歡,所以網站開啟https是種趨勢。今天給大家分享一下wordpress全站開啟https訪問及自動申請免費ssl證書教程,內容經過整理并測試無誤。…

網站開啟https訪問有什么好處?據說https可以防止網絡運營商劫持、還有就是https更安全、再則谷歌百度等大佬喜歡,所以網站開啟https是種趨勢。今天給大家分享一下wordpress全站開啟https訪問及自動申請免費ssl證書教程,內容經過整理并測試無誤。

https

什么是HTTPS

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。

HTTPS和HTTP的區別主要為以下幾點:

  1. http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
  2. http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
  3. http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

要開啟網站https訪問,則首先要申請SSL證書。

SSL證書有免費的,也有收費,如果你是交易型網站,建議購買收費型的SSL證書。

普通網站免費SSL證書即可。知名的有百度云、阿里云、騰訊云、Let's Encrypt都提供免費的SSL證書申請服務。

百度云免費SSL證書申請地址:https://console.bce.baidu.com/cas/#/cas/apply/create

百度云的是賽門鐵克的免費 1 年單域名證書,申請頁面難找!不熟悉的用戶絕對蒙圈!點開購買地址之后,選擇【Symantec】并提交:

ssl3

阿里云SSL證書申請地址https://common-buy.aliyun.com/?commodityCode=cas

阿里云使用的是賽門鐵克的免費 1 年單域名證書,申請頁面也挺難找,而且在購買頁面,略顯麻煩,點開購買地址后選擇【免費 DV SSL】并提交:

ssl2

騰訊云SSL申請地址:https://console.qcloud.com/ssl/apply

申請非常簡單,打開頁面并登陸之后點擊申請證書,填寫要申請的域名之后在解析一個 DNS 記錄用于驗證,十分鐘不到就可以頒發證書了!如果是使用 dnspod 或騰訊云解析的域名,則可以全自動驗證,坐等頒發即可。

ssl1

上述三家提供的都是和賽門鐵克合作的免費證書,已經能夠滿足大部分網站 https 化的需求了,美中不足的就是需要 1 年續期一次。

如果你愛折騰,則還可以考慮Let's Encrypt的免費證書,Let's Encrypt的免費SSL證書是3 個月有效期,配合acme.sh 腳本工具可以實現自動申請、自動續期也算是比較完美了。

Let's Encrypt免費證書

Let's Encrypt 適合有一點命令行基礎或者學習能力比較強的朋友使用,目前最流行的是 acme.sh 這個自動部署、自動續期小腳本。

中文教程地址:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

下面分享一下centos+nginx上使用acme.sh安裝申請免費Let’s Encrypt證書的的步驟。

1、先運行下面的命令安裝acme.sh腳本工具

curl https://get.acme.sh | sh

或者
wget -O -? https://get.acme.sh | sh

或者從 Git 安裝下載項目并安裝:
git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh
./acme.sh –install

上面3種安裝方式,一種不行就嘗試另外一種。

安裝過程包含 3 個動作:

  • 幫你安裝acme.sh到~/.acme.sh/。所有的證書都會放到這個目錄中
  • 創建別名: acme.sh=~/.acme.sh/acme.sh
  • 創建每天的定時任務檢查證書,如果快要到期了會自動更新

定時任務示例:

0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

acme.sh 會保存 API 參數并生成定時任務,用于每天驗證證書是否即將過期,并及時更新。你可以通過 crontab -e 看到的新增的定時任務:

0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

2、acme.sh安裝完成后,檢查一下是否安裝好了

#直接運行

acme.sh

#如報錯請運行如下命令,重載一下.bashrc讓acme.sh生效

source ~/.bashrc

3、用http驗證方式申請SSl證書

acme.sh 支持http 和 dns 驗證協議. 不過個人感覺http 方式比較方便,所以這里以這種方式為例。

采用http方式時,acme.sh 會自動在網站根目錄生成驗證文件, 然后自動完成驗證,最后自動刪除驗證文件。

需要指定域名和域名對應的網站根目錄(下例中/home/wwwroot/mydomain.com/就是www.mydomain.com網站的根目錄,需要根據用戶自己的網站路徑設置):

acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

上面這段命令解釋一下,-d后面帶的是域名,有不同子域名可以寫多個-d,--webroot(也可以直接寫-w)后面帶的是網站根目錄。

上面這條命令運行過程將會往/home/wwwroot/mydomain.com/目錄里創建一個.well-known 的文件夾,同時 Let’ s Encrypt 將會去訪問 https://www.mydomain.com/.well-known/和http://www.mydomain.com/.well-known/ 這個路徑(命令里每個-d 后面的域名都會訪問)。

所以我們需要確保/home/wwwroot/mydomain.com/是在 Nginx的配置文件上是配置成 root 目錄,里面任意文件可以直接域名訪問的。

如果實際使用,請務必換成您自己的域名,還有域名的網站根目錄。

如果上述命令執行無錯,那么就是幫你自動申請好了SSL證書(如果你去.acme.sh文件夾看看,會發現證書已經躺著里面了)

acme.sh問題描述:對 *.baidu.com 申請了通配符域名,但是在訪問 https://baidu.com 是時候出問題。

解決辦法:必須在申請證書時同時指定根域名 baidu.com 和通配符域名 *.baidu.com 兩個域名,這樣生成的證書才是完整的通配符證書。

遇到問題不要慌,通過 --debug 2 選項可以直接在終端上顯示詳細日志:

acme.sh --issue --debug 2 --dns dns_dp -d baidu.com -d *.baidu.com

4、安裝證書

證書申請好后,需要把證書 copy 到真正需要用它的地方。

默認生成的證書都是放在安裝目錄.acme.sh/ 下,但是請不要直接使用。而是使用 --installcert 命令安裝證書。

使用 --installcert 命令安裝證書時,證書文件會被復制到相應的位置:(請把域名換成自己的域名,同時注意那兩個路徑要和你放證書的文件一致)

acme.sh --installcert -d baidu.com -d *.baidu.com \

--keypath /home/ssl/baidu.com/baidu.com.key \

--fullchainpath /home/ssl/baidu.com/fullchain.cer \

--reloadcmd "sudo service nginx force-reload"

其中的路徑以及reloadcmd命令需要根據你的系統以及網站路徑自行修改,WDCP的reloadcmd命令改為--reloadcmd? "service nginxd force-reload"

5、配置nginx,修改你的網站配置文件(注意其中的路徑需要與你的SSL證書路徑一致)

Nginx 的配置 ssl_certificate 使用 fullchain.cer,而非 <domain>.cer,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤。

server {

listen 80;

listen 443 ssl;

server_name? www.baidu.com;

ssl on;

ssl_certificate /home/ssl/baidu.com/fullchain.cer;

ssl_certificate_key /home/ssl/baidu.com/baidu.com.key;

ssl_session_timeout? 5m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers? ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

ssl_prefer_server_ciphers? on;

if ($scheme != 'https') {

# rewrite ^(.*)$? https://$server_name$1 permanent;

return 301 https://$server_name$request_uri;

}

}

到這里,網站的服務器部分就配置好了(注意,改了服務器配置后需要重啟Nginx服務讓設置生效),下面部分就是網站程序部分了。

6、修改 wordpress后臺的https地址

登陸wordpress后臺,將“設置”-“常規”里面的“WordPress 地址(URL)”、“站點地址(URL)”兩個地址的 http 修改為 https 并保存。

https1

7、修改wordpress后臺的多媒體url地址

“設置”-“多媒體”菜單把“文件的完整 URL 地址”也改為 https 協議,如果文件的完整 URL 地址之前是缺省的,那么也就可以不用修改。

8、把以前文章中的圖片地址,鏈接改為https地址。

如果文章太多,手工修改不太現實,這時可以通過數據庫 SQL 查詢執行一條替換命令,代碼如下(注意替換為你自己的網址):

update wp_posts set post_content = replace(post_content, 'http://www.baidu.com','https://www.baidu.com');

如果害怕操作數據庫,則可以用下面的代碼法(復制到functions.php中,3種方式,任選一種)。

//WordPress SSL HTTPS 絕對鏈接替換

add_filter('get_header', 'wp_ssl');

function wp_ssl(){

if( is_ssl() ){

function wp_ssl_main ($content){

$siteurl = get_option('siteurl');

$upload_dir = wp_upload_dir();

$content = str_replace( 'http:'.strstr($siteurl, '//'), 'https:'.strstr($siteurl, '//'), $content);

$content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), 'https:'.strstr($upload_dir['baseurl'], '//'), $content);

return $content;

}

ob_start("wp_ssl_main");

}

}

或者

//WordPress SSL HTTPS 相對鏈接替換

add_filter('get_header', 'wp_ssl');

function wp_ssl(){

if( is_ssl() ){

function wp_ssl_main ($content){

$siteurl = get_option('siteurl');

$upload_dir = wp_upload_dir();

$content = str_replace( 'http:'.strstr($siteurl, '//'), strstr($siteurl, '//'), $content);

$content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), strstr($upload_dir['baseurl'], '//'), $content);

return $content;

}

ob_start("wp_ssl_main");

}

}

或者

//將所有超鏈接改為相對模式
if(!is_admin()){
ob_start("rewrite_urls");
}
function rewrite_urls($buffer){
$buffer= preg_replace('/("|\')http(s|):\/\/([^"\']*?)'.$_SERVER["HTTP_HOST"].'/i','$1//$3'.$_SERVER["HTTP_HOST"],$buffer);
return $buffer;
}

到這里,基本上網站前臺就開啟了https訪問,但是你可能還會遇到如下的情況:

  • 網站CSS樣式丟失,頁面排版錯亂,圖片打不開;
  • wordpress/wp-admin 后臺進不去,“登錄時提示重定向過多”;

9、遇到這樣的情況,那我們還要修改網站根目錄的wp-config.php文件,增加

define('FORCE_SSL_LOGIN', true);

define('FORCE_SSL_ADMIN', true);

增加上面的代碼后,正常情況后臺應該可以打開了,CSS樣式也回來,頁面也不錯亂了。

到這里就完全實現了 WordPress 站點開啟 HTTPS,如果在 360瀏覽器、谷歌瀏覽器等打開地址欄前未顯示綠色小鎖圖標,那么說明你的網站加載了非 SSL 引入的資源,這時候就可以用谷歌瀏覽器打開你的網站,然后按F12慢慢去檢查并修改網站中存在的絕對鏈接了,這是個力氣活…..建議大家仔細排查。

附:將所有流量統一導入 https://www.baidu.com,配置示例如下:

server {

listen 443 ssl;

server_name www.baidu.com;

index index.html;

root /home/baidu/www;

ssl on;

ssl_certificate /etc/nginx/ssl/fullchain.cer;

ssl_certificate_key /etc/nginx/ssl/baidu.key;

ssl_session_timeout 5m;

}

server {

listen?????? 80;

server_name? www.baidu.com;

return 301 https://$host$request_uri;

}

server {

listen? 80;

server_name baidu.com;

return 301 https://www.baidu.com$request_uri;

}

server {

listen? 443 ssl;

server_name baidu.com;

return 301 https://www.baidu.com$request_uri;

}

整站301跳轉

整站如果啟用HTTPS后運行正常,就可以開始考慮進行整站301跳轉了。如果是Apache+nginx雙引擎服務器,可以在.htaccess文件添加如下代碼:

RewriteEngine On

RewriteCond %{SERVER_PORT} 80

RewriteRule ^(.*)$ https://www.baidu.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^baidu.com [NC]

RewriteRule ^(.*)$ https://www.baidu.com/$1 [L,R=301]

如果你還要考慮落后的IE瀏覽器,我們可以把IE8以下的版本都排除在外,讓它們妥妥的滾去訪問 HTTP 吧!

#網站定制化開啟 HTTPS 的301重定向

RewriteCond %{SERVER_PORT} !^443$

RewriteCond %{HTTP_USER_AGENT} !MSIE/[1-8]\. [NC]

RewriteCond %{HTTP_HOST} www.baidu.com

RewriteRule ^.*$ https://www.baidu.com%{REQUEST_URI} [L,R=301]

如果是Nginx服務器,在nginx.conf配置如下代碼(如上文的設置中存在的話就不用添加了):

server {

listen 80;

server_name www.baidu.com;

return 301 https://$server_name$request_uri;

}

關于的Nginx return、rewrite在永久重定向上的區別可以看看這篇

網站https進階配置

上面的 nginx?配置代碼實現了全站https重定向,即使用戶輸入的是http,也會重定向到https地址上。但如果有時候我們有特殊需求,例如某些頁面https訪問,某些頁面又不需要https訪問,這時候就要區別對待了,大家可以參考下面的代碼修改。

打賞

如果本站對您有所幫助,請考慮對本站進行小額捐贈:

捐贈億品
相關內容

發表評論

如何下載本站資源『所有留言都會被審核,請勿發布垃圾評論』

(必填)*

欢乐生肖走势图经网