Email:2225994292@qq.com
CNY
网站部署SSL证书时如何兼容CDN服务?
更新时间:2025-11-26 作者:网站部署SSL证书时

SSL证书的 “端到端加密” 特性与CDN的 “中间节点缓存” 机制存在天然的协同需求 —— 若配置不当,可能导致 “证书失效”“HTTPS握手失败”“内容无法缓存” 等问题。本文从技术原理出发,系统解析SSL证书与CDN服务的兼容方案、部署流程、关键配置及常见问题解决,帮助网站实现 “安全加密” 与 “加速分发” 的双重目标。

一、SSL 与CDN的协同原理:为何需要特殊兼容?

要理解兼容的核心需求,需先明确 SSL 加密流程与CDN工作机制的内在关联,以及二者直接结合时的核心矛盾。

1. SSL 加密与CDN的核心工作机制

(1)SSL 加密原理:SSL通过 “客户端 - 服务器” 双向握手,建立加密通信通道,核心是 “证书验证” 与 “会话密钥协商”:

  • 客户端向服务器发起 HTTPS 请求,服务器返回SSL证书(含公钥、域名、有效期等信息);
  • 客户端验证证书合法性(如是否由可信 CA 签发、域名是否匹配、是否在有效期内);
  • 验证通过后,客户端生成会话密钥,用服务器公钥加密后发送给服务器;
  • 服务器用私钥解密会话密钥,后续通信通过该密钥对称加密,确保数据安全。

(2)CDN工作机制:CDN通过在全球部署边缘节点,将网站静态资源(如 HTML、图像、JS)缓存到边缘节点,用户访问时从就近节点获取资源,而非源服务器:

  • 用户发起请求,DNS 将域名解析到CDN边缘节点 IP;
  • 边缘节点检查资源是否缓存,若已缓存则直接返回;
  • 若未缓存,边缘节点向源服务器发起 “回源请求”,获取资源后缓存并返回给用户。

2. 二者兼容的核心矛盾与解决思路

若直接将未适配的SSL证书部署在源服务器,同时启用 CDN,会面临两大核心矛盾:

  • 矛盾 1:加密通道中断:SSL 默认是 “客户端 - 源服务器” 端到端加密,CDN边缘节点作为中间节点,无法解密加密数据,导致无法缓存资源(需明文才能缓存);
  • 矛盾 2:证书验证失败:若CDN边缘节点未配置SSL证书,用户访问时会因 “未收到合法证书” 提示 “不安全”;若边缘节点与源服务器证书不一致,会因 “域名不匹配” 导致验证失败。

解决思路:采用 “CDN边缘节点终止 SSL” 或 “端到端 SSL” 两种方案,让CDN节点参与 SSL 握手过程,既实现加密通信,又不影响资源缓存。具体而言:

  • 边缘节点需配置SSL证书,与客户端完成 SSL 握手,解密数据后缓存资源;
  • 边缘节点与源服务器之间的通信,可选择 “重新加密”(端到端)或 “明文传输”(非敏感场景),确保全链路安全。

二、SSL 与CDN兼容的两种核心部署方案

根据 “边缘节点与源服务器之间的通信是否加密”,SSL 与CDN的兼容方案分为 “SSL 终止(SNI)” 和 “端到端 SSL(Full SSL)”,需根据业务安全需求选择。

方案一:SSL 终止(SNI SSL)—— 轻量兼容,适合非敏感场景

SSL 终止是最常用的兼容方案,核心是 “边缘节点与客户端完成 SSL 握手,解密数据后明文回源”,优势是配置简单、性能损耗低,适合静态资源(如图像、JS)为主的网站。

1. 部署架构与流程

  • 证书部署:将SSL证书部署在CDN边缘节点(而非源服务器),证书域名需与网站访问域名一致(如www.example.com);
  • SSL 握手:用户访问https://www.example.com时,与CDN边缘节点完成 SSL 握手,边缘节点返回自身配置的SSL证书,客户端验证通过后建立加密通道;
  • 数据解密与缓存:边缘节点解密客户端请求数据,检查资源是否缓存,若已缓存则加密后返回给用户;若未缓存,以明文形式向源服务器发起回源请求;
  • 回源与返回:源服务器返回明文资源,边缘节点缓存后,加密返回给用户。

架构示意图:客户端 →(HTTPS 加密)→CDN边缘节点(SSL 终止,解密)→(HTTP 明文)→ 源服务器

2. 核心配置要点

(1)CDN控制台配置SSL证书:

示例(阿里云CDN配置):

  • 登录CDN服务商控制台(如阿里云 CDN、Cloudflare),进入 “SSL证书管理” 模块,选择 “上传证书” 或 “申请免费证书”(多数CDN提供 Let's Encrypt免费证书);
  • 证书类型需支持 SNI,允许同一 IP 部署多个域名的证书(节省CDN节点 IP 资源);
  • 开启 “强制 HTTPS”:配置 HTTP 请求自动跳转至 HTTPS(如 301 重定向),避免用户访问 HTTP 版本。
  • 进入 “域名管理”→ 选择目标域名 → “HTTPS 配置”→ “启用 HTTPS”→ 上传证书(PEM 格式公钥 + 私钥)→ 开启 “HTTP 强制跳转 HTTPS”。

(2)源服务器配置:

  • 源服务器无需部署SSL证书(边缘节点已终止 SSL),仅需开启 HTTP 服务(80 端口),接收CDN边缘节点的明文回源请求;
  • 配置 “回源 IP 白名单”:仅允许CDN边缘节点 IP 访问源服务器,防止直接访问源服务器(增强安全性)。例如 Nginx 配置:
# 允许CDN边缘节点IP访问(替换为实际CDN节点IP段)
allow 106.11.0.0/16;
allow 120.241.0.0/16;
# 拒绝其他IP直接访问
deny all;

3. 适用场景与优缺点

  • 适用场景:静态资源为主的网站(如博客、企业官网)、非敏感数据传输(如公开图像、文档);
  • 优点:配置简单,无需修改源服务器 SSL 设置;边缘节点仅解密一次,性能损耗低;
  • 缺点:边缘节点与源服务器之间为明文传输,若回源链路存在安全风险(如公共网络),可能导致数据泄露。

方案二:端到端 SSL(Full SSL)—— 全链路加密,适合敏感场景

端到端 SSL 是更高安全级别的兼容方案,核心是 “边缘节点与客户端完成 SSL 握手,同时边缘节点与源服务器之间重新加密通信”,实现 “客户端→边缘节点→源服务器” 全链路加密,适合电商、金融等敏感数据传输场景(如用户登录、支付信息)。

1. 部署架构与流程

(1)双证书部署:

  • 边缘节点部署 “用户访问证书”(如www.example.com),用于与客户端握手;
  • 源服务器部署 “回源证书”(可与用户访问证书相同,或专用回源域名证书如origin.example.com),用于与边缘节点握手;

(2)SSL 握手与加密回源:

  • 用户与边缘节点完成 SSL 握手(同方案一),边缘节点解密数据;
  • 边缘节点向源服务器发起 “HTTPS 回源请求”,使用源服务器的回源证书完成二次 SSL 握手,加密传输数据;
  • 源服务器返回加密资源,边缘节点解密后缓存(仅缓存明文),再加密返回给用户。

架构示意图:客户端 →(HTTPS 加密)→CDN边缘节点(解密→加密)→(HTTPS 加密)→ 源服务器

2. 核心配置要点

(1)CDN控制台配置:

示例(Cloudflare 配置):

  • 部署 “用户访问证书”(同方案一),同时在 “回源配置” 中开启 “HTTPS 回源”,指定回源端口(443 端口);
  • 若回源证书是 “自签名证书”(未由可信 CA 签发),需开启 “忽略证书验证”(不推荐,仅测试环境使用);若为 CA 签发证书,需确保CDN节点信任该 CA(主流 CA 如 Let's Encrypt、DigiCert 均被信任)。
  • 进入 “SSL/TLS”→ “边缘证书”→ 部署用户访问证书;
  • 进入 “源服务器”→ “SSL/TLS 模式”→ 选择 “Full”(边缘 HTTPS,源服务器 HTTPS)→ 配置回源域名(如origin.example.com)。

(2)源服务器配置:

  • 部署回源证书(公钥 + 私钥),Nginx 配置示例:
server {
  listen 443 ssl;
  server_name origin.example.com;  # 回源域名,需与CDN回源配置一致
  
  # 配置回源证书
  ssl_certificate /path/to/origin_cert.pem;  # 回源证书公钥
  ssl_certificate_key /path/to/origin_key.pem;  # 回源证书私钥
  
  # SSL优化配置
  ssl_protocols TLSv1.2 TLSv1.3;  # 仅支持安全协议版本
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;  # 安全加密套件
  
  # 仅允许CDN边缘节点回源
  allow 172.16.0.0/12;  # Cloudflare回源IP段示例
  deny all;
  
  # 处理回源请求(静态资源)
  location ~* \.(jpg|png|webp|js|css)$ {
    root /var/www/html;
    expires 30d;  # 缓存控制,与CDN缓存策略协同
  }
}
  • 关闭 HTTP 服务(或仅允许CDNIP 访问),强制边缘节点通过 HTTPS 回源。

3. 适用场景与优缺点

  • 适用场景:电商支付、用户登录、敏感数据传输(如金融网站、政务平台);
  • 优点:全链路加密,无数据泄露风险;源服务器受 IP 白名单保护,安全性更高;
  • 缺点:配置复杂,需维护两套证书(边缘 + 源服务器);边缘节点与源服务器双重 SSL 握手,性能损耗比方案一高 10%-20%。

三、SSL 与CDN兼容的关键配置:证书、缓存与安全优化

无论选择哪种方案,都需关注 “证书有效性”“缓存策略协同”“安全加固” 三大关键配置,避免兼容问题。

1. 证书配置:确保合法性与一致性

证书是 SSL 与CDN兼容的核心,需满足 “域名匹配”“有效期内”“CA 可信” 三大要求,否则会导致客户端验证失败。

(1)证书类型选择与域名匹配

  • 证书类型:优先选择 “通配符证书”(如*.example.com)或 “多域名证书”,适配CDN的多子域名场景(如www.example.com、img.example.com);避免使用 “单域名证书”,需为每个子域名单独部署,增加维护成本。
  • 域名匹配规则:

1)边缘节点证书域名需与用户访问域名完全一致(如用户访问img.example.com,证书域名需包含img.example.com或*.example.com);

2)回源证书域名需与CDN回源配置的域名一致(如回源域名origin.example.com,证书域名需包含该域名);

3)禁止使用 “域名不匹配” 的证书(如用www.example.com证书部署在img.example.com),会触发浏览器 “NET::ERR_CERT_COMMON_NAME_INVALID” 错误。

(2)证书有效期与自动续期

  • 有效期管理:SSL证书默认有效期为 1 年(Let's Encrypt 为 90 天),需在到期前 15-30 天续期,避免证书失效导致网站无法访问;
  • 自动续期配置:

1)若使用CDN服务商提供的免费证书(如阿里云、Cloudflare),通常支持 “自动续期”,需在控制台开启该功能;

2)若使用自定义证书(如企业级证书),需通过脚本(如 Certbot)或监控工具(如 Zabbix)设置到期提醒,手动续期后重新上传至CDN控制台。

(3)证书格式与部署要求

CDN边缘节点通常要求证书为 “PEM 格式”(文本格式,包含-----BEGIN CERTIFICATE-----等标识),需注意:

  • 上传证书时,需区分 “公钥” 和 “私钥”,私钥需无密码保护(CDN节点无法输入密码解密);
  • 若证书包含 “中间证书”,需与公钥合并为一个 PEM 文件(中间证书在前,服务器证书在后),避免 “缺少中间证书” 导致部分浏览器(如 IE)验证失败。

2. 缓存策略协同:避免加密影响缓存

SSL 加密可能导致CDN无法识别资源缓存规则,需通过 “缓存键配置”“缓存控制头” 协同,确保资源正常缓存。

(1)缓存键(Cache Key)配置

CDN通过 “缓存键” 识别不同资源,默认缓存键通常包含 “URL 路径 + 查询参数”,但 SSL 相关的请求头(如User-AgentCookie)可能导致缓存键重复,需优化:

  • 排除无关请求头:在CDN控制台 “缓存键配置” 中,排除与资源无关的请求头(如CookieReferer,静态资源通常无需这些信息),避免 “相同资源因请求头不同而重复缓存”;
  • 保留必要参数:若资源依赖查询参数(如img.example.com/photo.jpg?v=1.0),需保留v参数在缓存键中,确保版本更新时能加载新资源;排除无关参数(如track_id=123),避免缓存膨胀。

(2)缓存控制头(Cache-Control)协同

源服务器需通过Cache-Control响应头,告知CDN边缘节点 “如何缓存资源”,避免 “过度缓存” 或 “不缓存”:

  • 静态资源:设置Cache-Control: public, max-age=86400(缓存 1 天),适合图像、JS、CSS 等长期不变的资源;
  • 动态资源:设置Cache-Control: no-cacheprivate,禁止CDN缓存(如用户登录页、实时数据接口);
  • 避免冲突:CDN控制台的 “缓存过期时间” 配置需与源服务器max-age协同,建议以源服务器配置为准(CDN作为补充),避免 “CDN缓存时间长于源服务器” 导致资源更新不及时。

示例(源服务器 Nginx 配置Cache-Control):

# 静态资源设置1天缓存
location ~* \.(jpg|png|webp|js|css)$ {
  root /var/www/html;
  add_header Cache-Control "public, max-age=86400";
  expires 1d;  # 与max-age协同
}

# 动态资源禁止缓存
location ~* \.(php|jsp|api)$ {
  add_header Cache-Control "private, no-cache";
  expires -1;
}

3. 安全优化:防止 SSL 漏洞与未授权访问

SSL与CDN兼容后,需通过 “协议版本限制”“加密套件选择”“回源保护” 加固安全,避免 SSL 漏洞(如 POODLE、Heartbleed)。

(1)SSL 协议与加密套件优化

  • 禁用不安全协议:在CDN控制台和源服务器,仅启用 TLSv1.2 和 TLSv1.3 协议,禁用 SSLv3、TLSv1.0、TLSv1.1(存在 POODLE、BEAST 漏洞);
  • 选择安全加密套件:优先使用 “ECDHE” 系列加密套件(如 ECDHE-ECDSA-AES128-GCM-SHA256),支持 “前向 secrecy(FS)”,即使私钥泄露,历史通信数据也无法解密;避免使用 “RC4”“3DES” 等弱加密套件。

示例(CDN控制台配置):

  • 阿里云 CDN:进入 “HTTPS 配置”→ “高级配置”→ “SSL 协议版本” 选择 “TLSv1.2,TLSv1.3”→ “加密套件” 选择 “高安全套件”;
  • Cloudflare:进入 “SSL/TLS”→ “边缘加密套件”→ 选择 “Modern TLS”(仅支持 TLSv1.2+,高安全)或 “Intermediate TLS”(兼容老旧设备)。

(2)回源保护:IP 白名单与防盗链

  • IP 白名单:在源服务器配置CDN边缘节点 IP 段白名单,仅允许边缘节点回源,禁止用户直接访问源服务器(避免绕开CDN导致的安全风险);CDN服务商通常会提供公开的回源 IP 段(如阿里云CDNIP 段、Cloudflare IP 段),需定期更新白名单;
  • 防盗链配置:

1)在CDN控制台开启 “Referer 防盗链”,仅允许信任域名(如www.example.com)引用资源,防止他人盗用CDN资源(如直接引用你的图像导致带宽消耗);

2)配置示例(阿里云 CDN):进入 “域名管理”→ “防盗链”→ “Referer 防盗链”→ 选择 “白名单模式”→ 添加信任域名(如www.example.com、*.example.com)。

四、SSL 与CDN兼容的常见问题与解决方案

即使配置正确,也可能因 “证书问题”“回源异常”“缓存冲突” 导致兼容问题,需快速定位并解决。

问题 1:浏览器提示 “不安全” 或 “证书无效”

1. 现象

用户访问网站时,浏览器地址栏显示 “不安全”,控制台报错:

  • NET::ERR_CERT_COMMON_NAME_INVALID(域名不匹配);
  • NET::ERR_CERT_DATE_INVALID(证书过期);
  • NET::ERR_CERT_AUTHORITY_INVALID(CA 不可信)。

2. 解决方案

(1)域名不匹配:

  • 检查边缘节点证书域名是否包含用户访问域名(如访问img.example.com,证书是否有img.example.com或*.example.com);
  • 若使用通配符证书,确保是 “一级通配符”(如*.example.com支持img.example.com,但不支持sub.img.example.com),需使用 “多级通配符证书” 或单独域名证书。

(2)证书过期:

  • 在CDN控制台查看证书有效期,若已过期,重新上传续期后的证书;
  • 开启证书自动续期功能(如 Let's Encrypt 证书通过 Certbot 自动续期)。

(3)CA 不可信:

  • 检查证书是否由可信 CA 签发(如 Let's Encrypt、DigiCert、Symantec),避免使用自签名证书(仅测试环境使用);
  • 若证书包含中间证书,确保已与服务器证书合并上传,避免 “缺少中间证书” 导致部分浏览器不信任。

问题 2:CDN无法缓存资源,频繁回源

1. 现象

CDN控制台显示 “回源率过高”(如超过 50%),源服务器带宽占用大,访问速度未提升,排查发现资源未被CDN缓存。

2. 解决方案

(1)检查 SSL 终止配置:

  • 若使用方案一(SSL 终止),确认边缘节点已正确解密数据,可通过CDN“回源日志” 查看回源请求是否为明文(HTTP),若为加密(HTTPS)则说明 SSL 未终止,需重新配置;
  • 若使用方案二(端到端 SSL),确认边缘节点已解密资源(缓存的是明文),可通过CDN“缓存日志” 查看资源是否标记为 “可缓存”。

(2)检查缓存控制头:

  • 查看源服务器返回的Cache-Control头,若为no-cacheprivate,CDN会拒绝缓存,需改为public, max-age=xxx(静态资源);
  • 若CDN控制台 “缓存过期时间” 设为 “0” 或 “不缓存”,需调整为合理值(如 1 天),与源服务器max-age协同。

(3)检查缓存键配置:

  • 若缓存键包含过多无关参数(如track_idsession_id),会导致 “相同资源不同缓存键”,需在CDN控制台排除这些参数;
  • 若资源 URL 包含动态参数(如/api/data?time=123),需设置 “忽略参数缓存”,避免无法缓存。

问题 3:回源请求失败,提示 “连接超时” 或 “403 Forbidden”

1. 现象

CDN边缘节点向源服务器发起回源请求时,提示 “连接超时”(504 错误)或 “403 Forbidden”,无法获取资源。

2. 解决方案

(1)连接超时(504 错误):

  • 检查源服务器是否开启对应端口(方案一需开启 80 端口,方案二需开启 443 端口),并确保防火墙未拦截CDN边缘节点 IP;
  • 检查源服务器是否正常运行,可通过 “telnet 源服务器 IP 端口” 测试连通性(如telnet 1.2.3.4 443),若无法连通需修复源服务器网络。

(2)403 Forbidden 错误:

  • 检查源服务器 IP 白名单,确认CDN边缘节点 IP 已添加到白名单,未被deny all拦截;
  • 检查回源请求的 “Host” 头是否与源服务器配置一致(如源服务器server_name origin.example.com,回源请求 Host 需为该域名),若不一致需在CDN控制台 “回源配置” 中设置 “自定义 Host”。

问题 4:HTTPS 握手慢,访问延迟高

1. 现象

用户访问 HTTPS 网站时,首次加载延迟超过 1 秒,Chrome 开发者工具 “Network” 面板显示 “SSL 握手时间” 过长(超过 500ms)。

2. 解决方案

(1)优化 SSL 协议与加密套件:

  • 仅启用 TLSv1.2 和 TLSv1.3 协议,禁用老旧协议(TLSv1.0、TLSv1.1),减少握手协商时间;
  • 优先选择 “ECDHE” 系列加密套件(如 ECDHE-ECDSA-AES128-GCM-SHA256),比 “RSA” 套件握手速度快 30%。

(2)启用 SSL 会话复用:

  • 在CDN控制台开启 “SSL 会话复用”(如 Session Ticket 或 Session ID),让用户后续访问时无需重新握手,直接复用之前的会话密钥,握手时间从 500ms 降至 50ms 以内;
  • 源服务器配置示例(Nginx):
ssl_session_cache shared:SSL:10m;  # 共享会话缓存,10MB
ssl_session_timeout 10m;  # 会话超时时间10分钟

(3)选择就近CDN节点:

  • 检查CDN节点覆盖是否合理,确保用户访问时解析到最近的边缘节点(如国内用户解析到国内节点,海外用户解析到海外节点),减少网络延迟;
  • 若使用多区域 CDN(如阿里云全球加速),需配置 “智能 DNS”,根据用户 IP 定位最优节点。

五、SSL 与CDN兼容的部署流程与验证方法

为确保兼容方案落地成功,需遵循 “准备 - 部署 - 验证” 三步流程,避免遗漏关键步骤。

1. 部署前准备:证书与环境检查

(1)证书准备:

  • 生成或获取SSL证书(边缘节点 + 源服务器,方案二需两套),确保格式为 PEM,域名匹配,有效期内;
  • 若使用自定义证书,需将公钥、私钥、中间证书合并为正确格式(中间证书在前,服务器证书在后)。

(2)环境检查:

  • 确认源服务器已开启对应端口(方案一 80 端口,方案二 443 端口),防火墙允许CDN边缘节点 IP 访问;
  • 确认CDN已添加网站域名,且 DNS 已解析到CDN节点(通过nslookup 域名查看,需显示CDN节点 IP)。

2. 分步部署:从边缘到源服务器

以方案二(端到端 SSL)为例,分步部署流程:

(1)CDN边缘节点配置:

  • 登录CDN控制台,添加网站域名(如www.example.com),选择 “HTTPS” 作为访问协议;
  • 上传边缘节点证书(如*.example.com通配符证书),开启 “强制 HTTPS” 和 “SSL 会话复用”;
  • 配置回源信息:回源协议选择 “HTTPS”,回源域名设置为origin.example.com,回源端口 443,开启 “回源 IP 白名单”。

(2)源服务器配置

  • 部署回源证书(origin.example.com),配置 Nginx 的 HTTPS 服务,开启 SSL 会话缓存;
  • 添加CDN边缘节点 IP 段到白名单,禁止其他 IP 访问;
  • 配置Cache-Control头,为静态资源设置合理缓存时间。

(3)DNS 配置:

将网站域名的 DNS 解析记录从源服务器 IP 改为CDN提供的 CNAME 记录(如www.example.com CNAME www.example.com.cdn.com);

等待 DNS 生效(通常 5-30 分钟,可通过nslookup验证)。

3. 部署后验证:确保兼容与安全

部署完成后,需通过 “浏览器验证”“工具检测”“日志分析” 三类方法验证兼容性:

(1)浏览器验证:

  • 用 Chrome、Firefox、Edge 等主流浏览器访问网站,地址栏显示 “小绿锁”,说明 SSL 正常;
  • 点击 “小绿锁”→ “证书”,检查证书域名、有效期、CA 是否正确;
  • 打开 Chrome 开发者工具→ “Network”→ 选择 “All”,查看资源 “Protocol” 列是否为 “h2” 或 “https”,确认 HTTPS 生效。

(2)在线工具检测:

  • 使用 SSL Labs(https://www.ssllabs.com/ssltest/)检测证书等级,需达到 “A” 或 “A+”,无安全漏洞;
  • 使用CDN测速工具(如阿里云CDN测速、Cloudflare Speed Test),检查资源是否从就近节点加载,回源率是否低于 20%。

(3)日志分析:

  • 查看CDN“访问日志”,确认 HTTPS 请求占比 100%(无 HTTP 请求),缓存命中率高于 80%(静态资源);
  • 查看源服务器 “访问日志”,确认仅CDN边缘节点 IP 发起回源请求,无其他 IP 访问,避免安全风险。

SSL证书与CDN服务的兼容,核心是通过 “边缘节点参与 SSL 握手” 实现 “加密通信” 与 “资源缓存” 的平衡。在实际部署中,需根据业务安全需求选择方案:非敏感场景用 “SSL 终止”,兼顾简单与性能;敏感场景用 “端到端 SSL”,确保全链路安全。同时,需关注证书有效性、缓存策略协同、安全加固三大关键配置,避免兼容问题。


Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.189633s