关于https基础知识,可以参考我的另外一篇文章,讲的很详细和基础,推荐阅读扫盲!
< 给Nginx配置一个自签名的SSL证书 >
一、实验环境
宿主机操作系统:CentOS Linux release 7.3.1611 (Core)
wordpress运行环境:docker容器(debian:9.3 + php:7.2-apache + WordPress版本:4.9.4 )
mysql运行环境:docker容器(debian:8.10 + mysql:8.0 )
二、申请免费SSL证书
由于我的服务器是腾讯云的,就申请了腾讯家的SSL证书,可以免费一年,下面就拿腾讯的SSL证书的进行演示,当然还有其他SSL证书提供机构,比如Let’s Encrypt,据说是永久免费的,也可以试一下!
第1步:登录腾讯云后台,云产品 –>域名与网站 –>SSL证书管理
第2步:点击‘申请证书’,申请免费一年的SSL证书
第3步:根据提示,填写证书申请信息
-
通用名称就是你的域名
-
申请邮箱填写你的常用邮箱
-
证书备注名:填写一个易记的就行
-
私钥密码:可不填写
-
所属项目:默认项目即可
第4步:进行验证,这里选择‘文件验证’方式
第5步:根据详细说明的指示,在指定文件目录创建指定文件名、填写指定文件内容
进到wordpress的根目录,创建.well-known/pki-validation目录,新增fileauth.txt文件,文件内容为:201608241742072yvt8bxp9jv0ycginrnnebwgy1nvwgvxtssucy39w7b20nelfa
[root@jimmy html]#cd /data/wordpress/html/ [root@jimmy html]#mkdir -p .well-known/pki-validation && cd .well-known/pki-validatio [root@jimmy html]#touch fileauth.txt [root@jimmy html]#echo 201608241742072yvt8bxp9jv0ycginrnnebwgy1nvwgvxtssucy39w7b20nelfa > fileauth.txt
如果申请文件验证的域名是www.xjimmy.com,那么进行验证访问的链接地址是
http://www.xjimmy.com/.well-known/pki-validation/fileauth.txt 或者
https://www.xjimmy.com/.well-known/pki-validation/fileauth.txt
第6步:验证成功后,就可以等待审核
建立完成文件后,请耐心等待CA机构扫描审核。证书颁发完成后,文件和目录即可清除。
第7步:完成验证后,就可以下载证书了
进入SSL证书列表,将所申请的域名SSL证书下载到本地。
三、配置SSL证书
第1步:重新启动wordpress容器,追加443端口映射
因为之前启动wordpress容器的时候,只映射了80端口,而现在要开启https,需要追加443端口映射,而放到第一步来完成,是因为我们知道docker容器一旦启动后,是无法更改启动参数的,只有删除容器,重新启动一个新的docker容器,才能指定新的启动参数。
而我们下面的操作会修改到docker容器内的文件,如果修改完再来重新启动容器,那么所有的配置将会重置,当然如果你把docker容器的配置目录映射到宿主机也是可以的,但是我们是直接修改容器里面的文件内容。
[root@jimmy html]# docker stop wordpress [root@jimmy html]# docker rm wordpress [root@jimmy html]# docker run -d --name wordpress -v /data/wordpress/html:/var/www/html \ -p 80:80 -p 443:443 --link wp_mysql:mysql -e WORDPRESS_DB_PASSWORD='mysql_password' \ wordpress
第2步:把证书放到docker容器里面的apache配置目录
请选择对应web服务器的证书文件,由于docker官方的wordpress镜像跑的是apache2,所以将下载的Apache目录的3个证书相关文件放到对应目录下。
[root@jimmy html]#docker cp 3_www.xjimmy.com.key wordpress:/etc/apache2/ssl/ [root@jimmy html]#docker cp 2_www.xjimmy.com.crt wordpress:/etc/apache2/ssl/ [root@jimmy html]#docker cp 1_root_bundle.crt wordpress:/etc/apache2/ssl/
第3步:进入wordpress容器,加载OpenSSL模块
在终端或者xshell中输入openssl,查看是否安装ssl,如果出现下面图情况说明已经安装过了。
[root@jimmy html]# docker exec -it wordpress bash root@02576082531c:/var/www/html# openssl
第4步:加载Apache的SSL模块
输入命令:a2enmod ssl,我是已经加载过的,见下图所示,第一次时候,会提示重启Apache。
root@02576082531c:/var/www/html# a2enmod ssl
第5步:给wordpress容器安装常用工具
由于默认的docker容器是最小化安装,所以这里没有vim编辑工具,以及常用的网络工具,我们这里需要先下载一些常用的工具。
通过docker官网可以知道,wordpress容器的dockerfile中定义的base镜像是php:7.2-apache,而php:7.2-apache的base镜像又是debian系统,所以我们的wordpress的操作系统是debian的,我们这里通过apt-get进行更新和下载。
root@02576082531c:/var/www/html#apt-get update root@02576082531c:/var/www/html#apt-get install vim root@02576082531c:/var/www/html#apt-get install net-tools
第6步:修改SSL配置文件,绑定证书及打开443端口
Apache加载SSL模块后,会在/etc/apache2/sites-available下生成default-ssl.conf文件,编辑该文件。
root@02576082531c:/var/www/html#vim /etc/apache2/sites-available/default-ssl.conf
修改内容如下:
<VirtualHost *:443> ServerAdmin kzjimmy@qq.com DocumentRoot "/var/www/html" ServerName www.xjimmy.com SSLEngine on SSLCertificateFile /etc/apache2/ssl/2_www.xjimmy.com.crt SSLCertificateKeyFile /etc/apache2/ssl/3_www.xjimmy.com.key SSLCertificateChainFile /etc/apache2/ssl/1_root_bundle.crt </VirtualHost>
配置文件参数说明:
<VirtualHost *:443>:这里配置‘*:433’既可,一开始配置‘域名:443’无法访问
DocumentRoot:网站根目录
ServerName:网站域名
SSLEngine on:启用SSL功能
SSLCertificateFile:证书文件
SSLCertificateKeyFile:私钥文件
SSLCertificateChainFile:证书链文件
第7步:把default-ssl.conf链接至/etc/apache2/sites-enabled文件夹
从apache的配置文件可以看到,apache只会读取/etc/apache2/sites-enabled目录的配置文件,所以需要把/etc/apache2/sites-available下的default-ssl.conf文件链接到/etc/apache2/sites-enabled目录下。
[root@jimmy html]#ln -s /etc/apache2/sites-available/default-ssl.conf \ /etc/apache2/sites-enabled/001-ssl.conf
第8步:重载配置文件,重启apache服务
root@02576082531c:/var/www/html#service apache2 reload root@02576082531c:/var/www/html#service apache2 restart
重启apache服务时,wordpress容器会停止,需要手动启动。
[root@jimmy html]#docker start wordpress
第9步:验证端口监听状态
再次进入docker容器,查看端口监听状态。
root@02576082531c:~# netstat -an
可以看到,443端口已经在监听。
四、wordpres配置修改
这个时候,虽然已经配置SSL证书,并且开启了https协议,但是站点还是无法用https访问的,因为wordpress还需要修改配置,及数据库路径地址修改。
第1步:修改wordpress访问地址
可以直接登陆后台,通过“设置”中“常规”里面把“WordPress 地址(URL)”、“站点地址(URL)”两个地址的 http 修改为 https 并保存。
第2步:修改数据库的绝对路径地址
我们都知道,我们如果使用了 WordPress 的多媒体上传和插入图片附件的时候,附件都被 WordPress 标记为了绝对链接,一般需要修改数据库。
[root@jimmy html]# docker exec -it wp_mysql bash root@e20cb0bc320e:/# mysql -uroot -p'mysql_password'
mysql> use wordpress; UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.xjimmy.com','https://www.xjimmy.com'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'http://www.xjimmy.com','https://www.xjimmy.com'); UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'http://www.xjimmy.com','https://www.xjimmy.com'); UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'http://www.xjimmy.com','https://www.xjimmy.com'); UPDATE wp_termmeta SET meta_value = REPLACE(meta_value, 'http://www.xjimmy.com','https://www.xjimmy.com');
提醒:把代码中的域名改为自己网站的域名再执行,此外操作前一定要对数据库进行备份
至此,正常的话,你的wordpress站点就可以用https访问了。
五、开启强制https访问
细心的你这时候一定会发现,你的网站这时候虽然支持了 HTTPS 访问,但是似乎也可以使用 HTTP 来访问,考虑到搜索引擎目前收录的都是你的 HTTP 链接,那么如果不做点什么的话恐怕这张 SSL 证书将会毫无用处!所以我们可以利用apache的重定向,来跳转客户访问请求,全部指向为https协议的请求。
第1步:开启apache的重定向模块
输入命令:a2enmod rewrite,我是已经加载过的,见下图所示。
root@02576082531c:/var/www/html# a2enmod rewrite
另外,也可以通过将 /etc/apache2/mods-available/rewrite.load 链接到 /etc/apache2/mods-enabled/rewrite.load 来打开 Mod_rewrite 模块。
用指令操作就是:
root@02576082531c:/var/www/html#ln -s /etc/apache2/mods-available/rewrite.load \ /etc/apache2/mods-enabled/rewrite.load
第2步:修改配置文件,实现301重定向
编辑‘/etc/apache2/mods-available/000-default.conf’配置文件,添加如下的配置内容:
root@02576082531c:/etc/apache2# vim mods-available/000-default.conf
RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R=301]
第3步:重载配置文件,重启apache服务
root@02576082531c:/var/www/html#service apache2 reload root@02576082531c:/var/www/html#service apache2 restart
重启apache服务时,wordpress容器会停止,需要手动启动
[root@jimmy html]#docker start wordpress
第4步:浏览器访问https://站点,进行验证
正常的话,应该能正常访问了,并且浏览器会显示绿色的小图标了。
如果发现浏览器的小图标还是灰色,说明还存在http协议的链接,在chrome中按‘F12’看看有没有警报,要确保网站的每个元素(如插件、JS、CSS文件、图片、内容分发网站等)都采用https协议,发现有的话,根据显示的地址信息,在后台找到对应的位置,要手动全部修改成https协议访问。
六、百度分享不支持https的解决方案
站点开启 https 之后 ,站点的百度分享就不能用了!上网搜索了一下,看到已经有大神分享出了解决方案,下面就直接拿来用了。
第1步:下载修改好的分享代码
Github地址:https://github.com/hrwhisper/baiduShare
第2步:static 解压后丢到站点的根目录
-
注意static目录的属主属组
-
这里需要确保要确保“根目录”能被访问到,比如我的wordpress确实就是丢到根目录即可
第3步:修改对应的调用代码
.src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)]; 改为 .src='/static/api/js/share.js?v=89860593.js?cdnversion=' + ~ ( - new Date() / 36e5)];
至此,本次wordpress站点配置ssl证书,开启https,并且实现全站https访问,并解决了https下百度分享功能失效问题,已全部完成,感谢阅读!