笔者所在团队须要开发ios的APP,而apptstore应用商店审核须要应用使用https,因此须要配置https证书,笔者将这次配置的过程与遇到的一些问题记录下来,方便本身和读者后续参考。前端
要搭建https服务首先需有SSL证书,证书一般是在第三方申请,在阿里云的安全服务中有SSL证书这一项,能够在里面申请免费的证书;ios
也能够在本身电脑中生成,虽然也能完成加密,可是浏览器是不承认的,所以最好仍是去第三方申请
阿里云提供免费的证书,不须要人工审核,用来作测试是很是不错的选择,申请地址以下URL。nginx
https://common-buy.aliyun.com/?spm=5176.2020520163.cas.1.1aa12b7aWWn20O&commodityCode=cas#/buy
免费型的证书隐藏的比较深,想要申请免费证书须要先选择 1个域名->Symantec->免费型 ,因此读者这里须要注意一下,以下图参考。web
选择以后,一直惦记下一步,即可购买完成,免费购买证书以后笔者须要回到证书控制台,在控制台有一个补全信息的连接地址,须要经过此地址补充申请人的联系信息,参考下图填写ajax
补全我的信息以后,笔者还须要给阿里云验证当前域名是属于本人的,验证方式有两种,第一种是经过dns解析认证,第二种是经过上传验证文件认证,笔者这里采用的是验证文件认证,首先须要下载文件,以下图vim
在下载验证文件完成以后,笔者须要把文件放到服务器中去,这里提供一条复制命令跨域
scp ~/Downloads/fileauth.txt tangqingsong@192.168.43.34:~/
将验证文件复制到服务器以后,笔者还须要将验证文件放到站点对应目录,参考命令以下:浏览器
mkdir -p /website/.well-known/pki-validation && cp fileauth.txt /website/.well-known/pki-validation/
如今笔者要验证文件放置的位置是否正确,笔者经过两种方式进行了验证,分别是手动验证,和阿里云验证。缓存
手动验证的目的是首先确保文件位置放置是否正确,能够经过访问站点的url是否成功进行判断,好比笔者能够访问以下URL,若是返回若是页面可以正常打开,而且能够看到某些值,则表明配置成功。安全
http://www.songboy.net/.well-known/pki-validation/fileauth.txt
在确保文件放置正确以后,关键的是能让阿里云能访问到,阿里云这里提供了一个检查配置的功能,在下载验证文件页面,有一个检测配置的连接,单击以后即可进行检查,以下图。
当点击 检查配置 以后,若是阿里云可以正常访问,则会在左侧给出提示,如今能够返回证书列表,在列表中能够看到当前状态为审核中,以下图
审核由于不须要人为干预,因此很快就能下发证书,笔者下发证书的时间大约是2分钟左右。
证书签发以后,能够在列表中能够看到状态栏中为 已签发 ,同时操做栏能够下载以及查看详情等,以下图所示
点击下载后,会跳转到下载详情页面,在下载详情页能够选择本身相对应的web服务,好比笔者使用nginx,当选择nginx以后,下方还会很贴心的提示如何配置,如今笔者下载nginx配置文件。
下载配置文件以后,笔者须要将其解压,解压以后能够看见里面包含了两个证书文件,以下图所示
接着须要把这两个证书文件给复制到服务器当中去,首先须要在服务器建立对应的文件夹,参考命令以下
cd /usr/local/nginx/conf/ && mkdir cert #此命令在服务器执行
在服务器建立完成对应文件夹以后,执行命令将证书文件复制到服务器中,参考命令以下:
scp ~/Downloads/214905423420461/* tangqingsong@192.168.43.34:/usr/local/nginx/conf/cert
证书复制完成以后,能够对nginx配置文件进行更改,使用vim命令编辑nginx配置文件,参考命令以下:
vim /usr/local/nginx/conf/nginx.conf
在vim界面把以前http的配置部分复制一份,复制以后修改监听的端口(listen)为443,并在其后面添加ssl的信息,参考配置以下:
listen 443; ssl on; ssl_certificate cert/214905423420461.pem; ssl_certificate_key cert/214905423420461.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on;
修改配置文件以后,笔者须要测试nginx配置文件是否正确,参考命令以下:
nginx -t
当nginx若是没有出现error相关信息,基本配置没有问题,下面是个人nginx返回结果:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
nginx配置没有问题以后,笔者须要重启nginx让其生效,参考命令以下
nginx -s reload
如今全部该作的工做都作好了,笔者能够经过浏览器来访问能够正常访问,打开以下URL。
https://www.xxx.com
浏览器地址栏显示以下图所示
若是看到浏览器,展现安全,而且显示绿色就说明大功告成了
到这里,虽然已经成功部署了https,可是依然会产生不少附带的问题,下面是笔者后续所遇到的几个问题,以及解决方案。
在部署https后,笔者很急切让http所有重定向到https上来,这个时候可能会在nginx的配置文件中加入下面的代码
return 301 https://$server_name$request_uri;
这段代码其实是有缺陷的,他只能帮你重定向get请求,若是客户端是以post请求,通过301重定向后会变成get请求,最终致使服务器返回405的问题;
除了405问题之外,还有一个隐患,301重定向是永久重定向,在部署https的时候容易出现坑,若是使用了永久重定向,服务器出现问题须要回滚的状况下,即便服务器回滚了,浏览器依然会跳转到https,由于有重定向缓存,因此不建议使用301重定向,而应该使用302;可是302也很差去处理post请求,因此仍是用307把,配置代码以下:
return 307 https://$server_name$request_uri;
启用https证书后,会发现不少浏览器会存在跨域的问题,下面附带两种解决方法。
在http域下加载https资源浏览器是容许的,可是https加载http的资源,浏览器会阻止,因此在前端页面中的地址最好不要指定协议,能够吧"http://"或者"https://" 使用自适应协议来替换 "//",这样浏览器将会自动调用对应域的资源,而不会出现https站点不能加载http资源问题,而https请求http却出现跨域问题。
http和https并不在同一个做用域,因此当一些ajax请求时,会出现跨域问题,这个时候能够修改nginx配置文件,将其资源的做用域扩大,把如下代码放到http的配置项以下:
须要注意,若是让网站的资源让任意做用域均可以调用,那么会存在一个安全隐患,因此最好是指定几个做用域,而不要所有放开。
add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie,Content-Type, Authorization'; add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS';
在部署https证书的时候,会遇到不少小问题,一开始笔者打算将其一步到位,后来发现小问题不断,好比前面的跨域问题,以及301重定向问题;
这些问题看似不大,可是小问题却比较多,所以我建议你们在上线https的时候,最好分批上线,知足当前需求便可,不要一会儿把全部http都切换过来须要注意https加载http资源被阻止的问题。
做者: 汤青松
微信:songboy8888