当前位置: 亿品元素 >资讯 > wordpress全站开启https访问及自动申请免费ssl证书教程

wordpress全站开启https访问及自动申请免费ssl证书教程

更新时间:2018-08-08 09:18:04    浏览次数:710+次

网站开启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访问,这时候就要区别对待了,大家可以参考下面的代码修改。

http 和 https 全局共存

server {
listen 80;
#新增监听443端口,并指定443为ssl:
listen 443 ssl;
server_name yourdomain.com;
#新增ssl配置---开始:
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;
#新增ssl配置---结束:
location / {
#其他规则保持不变
}
}

全局强制 https(多段 server 写法)

server{
listen 80;
server_name yourdomain.com;
root/path/for/yourdomain.com;
location / {
rewrite (.*) https://yourdomain.com$1 permanent;
}
}

server {
listen 443;
server_name yourdomain.com;
ssl on;
ssl_certificate /usr/local/nginx/ssl/yourdomain_bundle.crt; #证书公钥文件路径
ssl_certificate_key/usr/local/nginx/ssl/yourdomain.key;#证书私钥文件路径
ssl_session_timeout5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers??HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
location / {
#其他规则维持不变
}
}

部分强制 https,部分强制 http

#监听httpserver
server
{
listen 80;
server_name zhangge.net m.zhangge.net;
index index.html index.htm index.php default.html default.htm default.php;
root/home/web/zhangge.net;
include zhangge.conf;
location ~ /uploads/.*\.(php|php5)?$ {
deny all;
}
#若是匹配到wp-login.php登陆,则跳到https
location ~ /(wp-login\.php(.*)$) {
rewrite ^(.*)$ https://zhangge.net$1 permanent;
break;
}
#wordpress后台强制跳到https
location /wp-admin {
rewrite ^(.*)$ https://zhangge.net$1 permanent;
}

location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass??unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires30d;
}

location ~ .*\.(js|css)?$
{
expires30d;
}
access_log/home/logs/zhangge.net.logaccess;

}
#监听https
server
{
listen 443;
server_name zhangge.net m.zhangge.net;
ssl on;
ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
ssl_certificate_key/usr/local/nginx/ssl/zhangge.net.key;
ssl_session_timeout5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers??HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
index index.html index.htm index.php default.html default.htm default.php;
root/home/web/zhangge.net;

#有偿服务付款页面使用https访问
location /wp-content/plugins/alipay {
try_files $uri $uri/ /index.php?$args;
}

#若没有匹配到wp-admin或wp-includes,则跳到http访问(反向逻辑:即只允许指定页面开启https)
location / {
if ($request_uri !~* "wp-admin|wp-includes") {
rewrite (.*) http://zhangge.net$1 permanent;
}
}

location ~ /uploads/.*\.(php|php5)?$ {
deny all;
}
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass??unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires30d;
}

location ~ .*\.(js|css)?$
{
expires30d;
}
access_log/home/wwwlogs/zhangge.net.logaccess;

}

全站启用SSL之后,如何兼容不支持https抓取的搜索引擎?

以下为例子,其实现在很多引擎已经支持https抓取了。

http 和 https 不在同一个 server 模块的写法:

server
{
listen 80;
server_name xxx.com;
root /data/xxx.com;

#在此新增如下规则:
#若UA不匹配百度、360、神马,则跳转到https(若需要加入更多,请以分隔符隔开)
if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
rewrite ^(.*)$ https://$host$1 permanent;
}
#其他略...
}

#监听443的server无需改动
server {
listen 443 ssl;
ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
ssl_certificate_key /usr/local/nginx/ssl/zhangge.net.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
server_name zhangge.net;
#在此新增如下规则:
#若UA匹配到百度、360、神马、XP系统等不支持请求,则跳转到http(若需要加入更多,请以分隔符隔开)
if ($http_user_agent ~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
rewrite ^(.*)$ http://$host$1 permanent;
}
#其他略

http 和 https 在同一个 server 模块的做法(注意修改实际域名):

server
{
listen 80;
listen 443 ssl;
ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
ssl_certificate_key/usr/local/nginx/ssl/zhangge.net.key;
ssl_session_timeout5m;
ssl_protocols?? SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers? HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
server_name zhangge.net;
#在此新增如下规则:
#如UA不匹配百度、360、神马,则设置变量为y(若需要加入更多,请以分隔符隔开)
if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
set $ssl "y";
}
#若请求协议是http,则继续将变量增量赋值es
if ($scheme = 'http' ) {
set $ssl "${ssl}es";
}
#若变量值为yes,即命中上述2个条件,则跳转到https
if ( $ssl = "yes" ) {
rewrite ^(.*)$ https://$host$1 permanent;
}
# ==================== 以下为新增内容 =======================
#若UA匹配到不支持https的请求,则设置变量为n:
if ($http_user_agent ~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
set $ssl "n";
}
if ($scheme = 'https' ) {
set $ssl "${ssl}o";
}
#若变量值为no,即命中上述2个条件,则跳转到http
if ( $ssl = "no" ) {
rewrite ^(.*)$ http://$host$1 permanent;
}
#以下略...

该部分内容来自https://zhangge.net/5079.html

相关合集