作者:烨烁
CDN提供了HTTPS的加密传输方式保证在客户端访问CDN的L1节点的链路上对传输数据进行加密避免被恶意查看和篡改。客户通过将自行向证书CA机构申请的SSL证书上传到CDN上,CDN会完成对所有的L1节点的配置同步保证后续所有的L1节点支持HTTPS方式访问。那么在配置CDN的HTTPS协议时有哪些是需要特别注意的呢?本文就阐述HTTPS配置需要注意的内容及常见问题。
一、申请证书。
在配置CDN的HTTPS的第一步当然是需要先为加速域名申请购买对应的SSL证书才可以正确的添加在CDN中的。
市场中有CA机构作为证书颁发者可以提供站点提供者使用。用户可以向CA机构购买对应域名的证书,同时阿里云云盾也联合多家国内外知名 CA 证书厂商直接提供服务器数字证书(证书服务详细请参考:证书服务)。
用户在购买证书时需要特别注意SSL证书根据其适用范围可以分为:通配符域名、单个域名和多个域名。根据其名称即可查看购买的证书分别适用于主域名下某个级别的全部子域名、单个域名或者多个域名。用户是需要保证购买的证书必须适用于加速域名后续才可以添加在CDN中生效。如图1所示的即是添加的SSL证书(适用于主域名和www的子域名两个域名)与CDN加速域名(cdn的子域名)是不相匹配的,因此会抛出NET::ERR_CERT_COMMON_NAME_INVALID的错误。
图1. SSL证书适用范围不匹配导致NET::ERR_CERT_COMMON_NAME_INVALID错误
二、配置证书至CDN。
在按照流程申请得到CA证书后即可将该证书添加在CDN服务中供所有CDN的L1节点使用。CDN添加证书可以通过控制台的方式以及API/SDK的方式添加,但是配置参数是一致的,控制台配置截图如图2所示。主要包括证书名称、公钥和私钥三个参数。
证书名称代表的是用户自己给予该对证书识别名称,用户可根据自己的业务要求定义其证书名称,仅需要保证本账号中不存在同名证书即可。公钥和私钥分别对应CA机构提供的证书内容和私钥内容。证书内容是以-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----开头和结束的证书链组成,而私钥内容是以-----BEGIN RSA PRIVATE KEY-----和 -----END RSA PRIVATE KEY----- 开头和结尾私钥组成。
图2. CDN控制台配置HTTPS证书示意图
配置过程中需要注意以下内容:
1、CA机构提供的证书为了兼容性可能会提供多种形式的证书,CDN支持的证书仅有PEM格式,并且私钥需要RSA格式。如果客户获取得到的是其他格式的证书是需要转换后然后提交到CDN服务中的,常见格式切换格式请参考:[CDN 证书格式说明](https://help.aliyun.com/document_detail/66710.html?spm=a2c6h.12873639.0.0.6cb223fba76KC8,而其中的私钥文件如果是-----BEGIN PRIVATE KEY-----, -----END PRIVATE KEY-----样式的话是需要通过如下命令转换成RSA格式:
openssl rsa -in old_server_key.pem -out new_server_key.pem
2、CDN是不支持设置密码的私钥。如图3所示即是经过加密的私钥,这类私钥文件是需要经过解密后才可以正常使用,因此CDN是无法正常使用的。
图3. 设置密码的私钥示意图
3、证书链需要补全中间证书。对于中级CA机构提供的证书,那么拿到的证书将包括多份证书,而CDN需要添加的是包括中间证书的完整证书链,拼接规则为:服务器证书放第一份,中间证书放第二份,中间不要有空行。
另外有一些中间证书CA机构提供了不同的服务器使用的证书,由于CDN是基于Tengine提供服务的,因此用户是需要使用Nginx对应的证书到视频中心的。如图4所示。
图4. 选择nginx证书示意图
4、CDN的HTTPS技术是基于SNI技术实现的。SNI技术主要是用来在同一台服务器上配置多个证书的需求,而SNI是需要客户端发送请求的时候带有SNI的信息以标识是哪个域名的SSL请求,因此SNI技术对客户端有一定的要求,部分低版本系统中的低版本浏览器不满足该要求。SNI技术对于客户端的限制详细请参考:[SNI对客户端浏览器限制](https://www.ssllabs.com/ssltest/clients.html。
5、生效时间。CDN证书由于需要应用于所有的L1节点上因此会导致配置和更新都是需要一段时间的,设置HTTPS证书后约1小时后生效,更新HTTPS证书后约10分钟后生效。因此请用户提前部署好HTTPS证书后再正式上线业务。
三、强制跳转。
用户对于站点常有以下两种跳转需求:
所有的 HTTP 请求跳转为 HTTPS 请求或者 HTTPS 请求跳转为 HTTP 请求;
部分资源可以将 HTTP 请求跳转到 HTTPS 或者 HTTPS 跳转为 HTTP 请求。
这两种需求对于第一种需求 CDN 是可以直接完成该需求的,可以直接在 HTTPS 的信息中直接添加对应的跳转设置(如图5)。而对于第二种需求 CDN 现在无法实现,需要用户的源站实现对应的 rewrite 功能,而为了保证每次请求都可以触发源站的重定向设置就需要用户针对于特定的资源设置在CDN 上不缓存(可以在 CDN 控制台设置缓存 0 秒或者源站设置 no-cache等禁止 CDN 缓存的头信息)。
图5. CDN配置HTTP与HTTPS跳转示意图
另外,CDN配置HTTPS后常会出现508错误。508 错误是重定向回环的错误,该错误一般是由于用户在 CDN 开启 HTTPS 服务,并且设置回源端口为 80 ;而源站设置了 80 端口强制跳转 HTTPS协议,这样就会导致该请求又重新请求到 CDN 节点上,出现重定向回环,因此建议 HTTP 和 HTTPS 协议之间的跳转功能可以直接在 CDN 控制台进行设置即可。