ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows Server 2016搭建OCSP在线证书状态服务,替代CRL实现实时吊销查询

Windows Server 2016搭建OCSP在线证书状态服务,替代CRL实现实时吊销查询 我们这套PKI体系里证书吊销状态查得准不准直接决定了一大批业务系统能不能正常跑。最近一个项目就是在Windows Server 2016环境里把OCSP在线证书状态协议完整搭起来替换掉原来让所有客户端拉取CRL的老方案。项目不难但涉及的东西比较碎所以整理一篇完整的搭建记录。这篇东西适合正在接触PKI、开始负责企业证书服务运维的同学也适合想把手头CRL方案升级成实时吊销查询的同行参考。我会把原理、环境规划、完整配置步骤、验证方法、排错思路都过一遍尽量让你照着做就能落地。1. 先弄清OCSP的定位再动手搭环境1.1 为什么非要在CRL之外加一个OCSP传统的证书吊销状态检查靠的是CA定期发布CRL证书吊销列表客户端下载下来再判断某个证书是否在这个黑名单里。CRL机制本身没问题但在真实网络里痛点很明显列表体积会越来越大尤其当CA签发的证书数以万计时每次拉取都很耗带宽和客户端CPU。时效滞后CRL是按周期发布的比如一天更新一次那么在这24小时窗口内被吊销的证书客户端仍然认为有效。离线环境根本查不了如果客户端在一个无法访问CA/CRL分发点的网络里吊销检查直接失败Windows客户端默认会把这个证书当成可用。OCSP就是解决这些问题的它允许客户端实时查询某一张具体证书的吊销状态而不需要下载全量列表。你可以把它理解成“CRL是贴在大门口的黑名单黑板报OCSP是给派出所打个电话问这个人现在有没有案底”一个是全量加离线一个是单条加实时。1.2 OCSP请求和响应的完整链路OCSP的工作流程其实不复杂。客户端在验证某张证书时会先从证书的AIA证书颁发机构信息访问扩展里取出OCSP服务的URL。然后客户端用证书序列号等信息构造一个OCSP请求发送给这个URL对应的服务器。服务器查询本地保存的吊销数据后返回一个签名的响应响应结果就三种good这张证书当前有效。revoked这张证书已经吊销。unknownOCSP服务器不认识这张证书查不到对应状态。这些响应必须带签名否则任何人都能伪造一个“good”响应给客户端。而给OCSP响应做签名的证书就是我们稍后要配置的“OCSP响应签名证书”。Windows客户端在默认情况下如果证书同时有CRL分发点和OCSP的AIA扩展会优先走OCSP因为速度更快、实时性更好。还有一点要提前说清楚只要证书链里的任何一层吊销状态存疑整条链的验证都可能失败。所以OCSP不一定只针对终端实体证书中间CA证书的吊销状态同样可以被查询。企业里常见的错误是只给终端证书配了OCSP URL结果中间CA证书的AIA没配出事时照样报吊销状态未知。1.3 两种工作模式选哪种Windows Server的“在线响应程序”支持两种吊销配置方式新人上来最容易在这卡住。CA配置也叫“从CA配置检索吊销信息”OCSP服务器直接连接CA的数据库实时查询某一证书是否被吊销。它的优点是状态最准、实时性最好缺点是这个查询会给CA带来额外压力。CRL发布配置OCSP服务器根据设定的轮询周期把CA发布的CRL主动拉回来客户端请求OCSP时数据来自本地缓存的CRL。它的优点是CA压力几乎为零OCSP服务器可以跨地域做分布式部署缺点是它的实时性取决于CRL本身的发布周期不能做到“秒级吊销”。选哪种没有绝对答案。我自己在中小型环境里的做法是证书量不大几千张以内、CA负载不高的场景直接用“CA配置”模式省事且状态准。如果是大规模证书体系或者OCSP服务器和CA之间存在跨地域链路那就用“CRL发布配置”同时把CA的CRL发布周期调短一点比如6小时甚至2小时一期。2. 环境规划与前置条件2.1 系统版本、性能配置与授权要求这次项目使用的就是Windows Server 2016。如果你手头有Standard或Datacenter版本跑OCSP在线响应程序都够用。硬件上别抠现在随便一台物理服务器或者规格稍高的虚拟机都没问题我习惯按4核CPU、8GB内存、50GB系统盘起步因为OCSP服务器虽然轻量但系统本身加补丁、日志、缓存都要占空间。这里多说一句环境里的Windows Server 2016必须要做正版授权并完成激活。网上那些“标准版密钥”来源不明的东西我劝你别碰CS证书服务经常要打补丁、重启、长期跑如果系统处于未激活状态有些角色服务的安装和自动启动会出莫名其妙的问题项目现场最怕这种低级事故。正规渠道的授权哪怕用评估版转正也可以关键是确保系统服务长时间稳定运行。另外装完系统以后记得把补丁打到最新再开始搭证书服务。Windows Server 2016的有些老补丁和后续版本之间存在签名算法、TLS协议方面的兼容差异而这些恰恰会影响证书链验证。2.2 网络架构与域名规划OCSP服务最终是要被客户端访问的所以域名规划很关键。建议给OCSP服务器分配一个独立的、稳定的主机名比如ocsp01.contoso.com并且在DNS里做好正向解析。因为证书的AIA扩展里会把这个域名烧进证书里如果后续再改域名所有已签发的证书都可能失效那代价太大了。端口方面OCSP默认走HTTP的80端口。如果你在OCSP服务器上也装了IIS注意80端口冲突。更稳妥的做法是保持默认80端口内网客户端直接访问如果OCSP服务要暴露给外网或跨分支访问建议在前面加个Nginx反向代理做HTTPS终结这样对外统一用443端口证书链里AIA填的是https://ocsp.contoso.com/ocsp更安全也更好管理。CA服务器和OCSP服务器建议分开至少在物理机或虚拟化层面分开。CA管签发和吊销OCSP管状态查询两者职责不同放在同一台机器上就意味着CA暴露面变大。小型测试环境可以合在一起生产环境真的不要省这个资源。2.3 CA证书体系规划搭建OCSP之前你必须先有一条可用的证书颁发链。常见做法是独立根CA离线只负责给下级CA签发证书平时不联网。企业从属CA在线真正给业务服务器、用户、计算机等签发证书也负责发布CRL。OCSP安装的位置通常是挂在这个企业从属CA旁边负责查询该CA签发的证书状态。如果你的企业里有多个颁发CA理论上每个CA都应该有对应的OCSP配置或多个CA共用一台OCSP服务器通过多个吊销配置来实现。密钥长度方面现在普遍建议RSA 2048起步有条件直接上RSA 4096。哈希算法用SHA256别再为了兼容老旧系统去选SHA1那东西在现在的安全审计里根本过不了。证书有效期建议根CA设10年甚至更长颁发CA设2到5年OCSP响应签名证书不要超过它的签发CA有效期。3. 部署企业CAOCSP的“数据源”3.1 添加证书服务角色在CA服务器上打开“服务器管理器”选择“添加角色和功能”一路下一步到“服务器角色”页面勾选“Active Directory 证书服务”。这里不要手快直接点完成要先展开“角色服务”勾选“证书颁发机构(CA)”如果需要同时装OCSP也可以顺便把“在线响应程序”勾上。但在分离部署模式下我会先在CA服务器上只装CA角色OCSP角色留给另一台机器装。安装完成后服务器管理器左上角会出现一个黄色的感叹号提示“配置目标服务器上的Active Directory证书服务”点进去开始配置。注意这一步配置完成之后CA的“公用名”会作为CA名称一直存在后期改动非常麻烦所以起名时一定要想清楚建议带上单位缩写和用途比如CONTOSO-INTERNAL-CA。3.2 配置根CA或颁发CA的关键参数配置向导里CA类型先选择“企业CA”还是“独立CA”这取决于你的环境是否加入域。如果所有客户端都在同一AD域内选“企业CA”最方便因为证书模板、自动注册、组策略这些都能直接联动。如果是在边缘网络或没有域的环境那就只能选“独立CA”但后续模板管理、吊销查询的配置都要手工做。接着选择“根CA”还是“从属CA”。如果你搭建的是一个新环境通常选“根CA”。如果你已经有上级CA就选“从属CA”并拿到上级CA签发的证书文件。私钥选项我建议保留“RSA”和“Microsoft软件密钥存储提供程序”密钥长度2048或4096。哈希算法选SHA256。有效期上测试环境随意生产环境根CA可以给10年颁发CA给5年以内比较稳妥。CA名称、证书数据库路径保持默认即可只要磁盘空间够用。企业CA配置完成后默认会有一个名为CA名称-CA的CRL分发点以及对应的AIACRL发布位置。这些在后续配置OCSP时还要调整。3.3 准备证书模板CA装好后默认模板列表里很多模板是停用状态。为了后续申请OCSP签名证书我们需要把“OCSP响应签名”模板启用至少要保证OCSP服务器对应的计算机账户具备该模板的“读取”和“注册”权限。操作路径是CA控制台 → 右键“证书模板” → “管理” → 在模板列表里找到“OCSP响应签名”。一般我不直接用默认模板而是复制一份自定义模板因为默认模板的有效期和密钥周期不一定符合你的规划。复制之后在“常规”标签里设置有效期建议2年续订周期适当提前。在“扩展”标签里确认“应用程序策略”中确实包含“OCSP签名”OID 1.3.6.1.5.5.7.3.9。在“安全性”标签里把这些权限授给OCSP服务器的计算机账户或域内的证书注册组。如果你不自定义模板直接用默认的“OCSP响应签名”也可以但要注意默认模板的权限只授给域管理员和企业管理员OCSP服务器如果没有提权申请时会报“拒绝访问”。这是最常见的坑之一。模板准备好之后回到CA控制台右键“证书模板” → “新建” → “要颁发的证书”把刚才自定义的OCSP响应签名模板点进来。至此CA侧的准备就完成了。4. 安装并配置OCSP在线响应程序4.1 添加在线响应程序角色并初始化在OCSP服务器上同样通过“添加角色和功能”找到“Active Directory 证书服务”在角色服务里勾选“在线响应程序”。如果你之前已经在CA服务器上顺带装了那这台机器就可以直接进入配置。装完后从“管理工具”或服务器管理器里打开“在线响应程序”管理单元。刚打开时左侧只有“吊销配置”这一项而且它是空的不要疑惑这是正常状态。我们需要手动新建吊销配置。这里有个细节OCSP服务器本身最好加入域。因为“CA配置”模式下OCSP要连接CA的数据库做查询域内身份会让权限配置简单很多。如果OCSP在独立工作组环境就要手工在CA数据库中给OCSP服务账户授权非常麻烦。4.2 新建吊销配置在“在线响应程序”控制台上右键“吊销配置”选择“新建吊销配置”。向导第一步是输入配置名称可以用CA名称或业务名比如CONTOSO-INTERNAL-CA-Config。第二步选择要配置的CA。这里有两种方式如果CA是企业CA且OCSP服务器已加入域一般可以直接在选择列表中看到该CA。如果看不到可以手工输入CA名称格式是CA计算机名\CA名称。例如我的CA计算机名是ca01CA名称是CONTOSO-INTERNAL-CA就填ca01\CONTOSO-INTERNAL-CA。第三步选择检索方式就是前面讲到的“CA配置”从CA数据库读取或“CRL发布配置”从CRL读取。按我之前说的方法选即可。如果选CRL发布配置向导会要求填CRL的URL一般就是CA属性里配置的CDP地址比如http://ca01.contoso.com/CertData/CONTOSO-INTERNAL-CA.crl。第四步选择签名证书。这里通常选择“使用模板自动选择签名证书”然后从下拉列表里选中我们启用的OCSP响应签名模板。当然前提是这个模板已经在OCSP服务器上申请成功或者OCSP服务器具备该模板的注册权限。如果签名证书还没准备好也可以先跳过创建完吊销配置后再补。创建完成后“吊销配置”节点下会多出一个条目状态显示为“可用”或“不可用”。“可用”意味着服务本身正常“不可用”通常代表签名证书缺失或CA连接失败这时候就要进入排错流程了。4.3 申请并绑定OCSP签名证书OCSP签名证书是OCSP配置过程中最容易翻车的一环。它不是CA自动签发的普通服务器证书必须包含“OCSP签名”这个EKUOID 1.3.6.1.5.5.7.3.9。如果CA只启用了默认模板你在申请模板列表里甚至看不到相关选项。申请方式我推荐手动申请清晰可控。步骤是在OCSP服务器上打开MMC添加“证书”管理单元选择“计算机账户”。展开“个人” → “证书”右键 → “申请新证书”。在“申请新证书”向导里选择“Active Directory 注册策略”然后点击“检测到的模板”旁边的“详细信息”选择我们自定义的OCSP响应签名模板。提交申请等待证书出现在“个人” → “证书”下。证书拿到之后回到“在线响应程序”控制台右键对应的吊销配置 → “属性” → “签名证书”标签页。在这里可以看到当前正在使用的签名证书信息。如果之前是自动选择的现在就应该能看到一张已签发的OCSP响应签名证书如果不是就点击“选择”并手动指定刚申请到的证书。还有一点容易忽略签名证书过期是OCSP服务最经典的隐性故障。因为OCSP响应程序一旦启动即使签名证书过期它也不一定会马上报错而是客户端从“good”变成“revoked/unknown”或者返回无效签名。所以建议把这个证书的有效期做成模板规则同时在监控系统里盯紧它的剩余有效期提前30天预警。4.4 设置CA的AIA/CDP扩展并发布新CRLOCSP服务自己配完还不够关键的一步是让客户端知道“找谁去查”。这个信息是通过证书AIA扩展带给客户端的。所以我们要回到CA服务器上调整CA的属性。打开CA控制台右键CA名称 → “属性” → “扩展”标签在“选择扩展”里改成“证书颁发机构信息访问(AIA)”点击“添加”填http://ocsp01.contoso.com/ocsp并勾选“包括在颁发的证书中”。如果还想同时保留CRL分发点就在“选择扩展”里换成“证书吊销列表(CDP)”确认里面有一条CRL地址且“包括在颁发的证书中”也勾上。注意添加的OCSP URL路径必须是/ocsp这是在线响应程序默认的端点和侦听路径。不要自己随便改否则客户端找不到服务。改完属性后需要重启CA服务certsvc才能生效。然后右键CA → “所有任务” → “发布CRL”发一份新的CRL出来。这样新签发的证书里自然就带上了OCSP地址。对于已经签发的旧证书如果它们在配置AIA之前创建那么证书本身不会包含OCSP URL这种情况下只能靠补发新证书或者手工配置客户端来补齐。5. 客户端验证证书吊销状态能不能查出来5.1 用浏览器验证OCSP服务配置完成后最基本的验证是直接访问OCSP服务地址。打开浏览器输入http://ocsp01.contoso.com/ocsp如果看到类似“OCSP Response Service is running”的信息说明服务本身已经起来了。如果出现404、403或连接超时检查三件事OCSP服务是否启动、80端口是否被IIS或其他进程占用、防火墙是否放行。5.2 申请测试证书并强制吊销服务在跑不代表整个链路是通的我习惯做一次完整的吊销测试。先在CA控制台找一张测试证书可以从模板里申请一张Web服务器证书或者直接用现有的一张闲置测试证书。然后右键该证书 → “吊销”选择一个吊销原因比如“密钥泄露”确定。再回到CA控制台右键CA → “所有任务” → “发布CRL”让吊销信息正式发布出去。接下来在一台客户端上用certutil验证证书状态。打开管理员命令行执行certutil -urlfetch -verify testcert.cer正常情况下输出里能看到OCSP的验证结果如果配置正确被吊销的那张证书应该显示为吊销证书或类似提示而不是证书有效。如果你在输出里看到证书状态: 吊销之类的内容说明OCSP查询链路已经通了。5.3 用certutil直接抓取吊销状态如果还想看得更细可以手动构造OCSP请求来测试OCSP服务器返回的具体状态。更快捷的方法是利用certutil的-urlfetch -verify命令加上-aia相关参数让客户端自己去解析AIA扩展里的OCSP URL。生产环境里我一般直接看两个地方客户端事件日志里有没有“吊销服务器无法访问”“吊销状态未知”的警告。OCSP服务器的事件查看器里应用程序和服务日志→Microsoft→Windows→CertificateServices→OCSP里面每一项成功或失败请求都有详细记录。如果这些日志里能看到来自测试客户端的OCSP请求记录且返回结果状态是0那这条链路就可以放心交给业务使用了。6. 常见问题与排错6.1 问题速查表症状可能原因常见解决办法新建吊销配置报“找不到CA”CA名称格式错误、网络不通、OCSP服务器无权限访问CA用ca主机名\CA名称格式重新填写确认域身份检查防火墙端口吊销配置状态为“不可用”没有可用签名证书、CA数据库不可达、CRL URL无效检查签名证书是否申请成功确认CA服务状态验证CRL地址可访问客户端显示吊销状态“未知”证书AIA扩展里没有OCSP地址客户端无法访问OCSPOCSP配置中选择了错误的CA重新发布证书或在CA属性里补上AIA检查客户端到OCSP的80端口连通性OCSP服务返回404/40380端口被IIS占用路径不是/ocspURL重定向问题停用或改掉IIS绑定端口确认请求路径关闭代理申请OCSP响应签名证书被拒绝模板未启用模板权限未授予OCSP服务器在CA控制台启用模板给计算机账户分配注册权限证书链验证还是走CRL客户端没有解析AIA扩展没有安装最新补丁确认证书更新组策略里设置吊销检查优先级手动更新CRL6.2 两个高频问题的详细排查过程问题一吊销配置一直“不可用”这类问题我遇到最多九成是指名证书或CA连接问题。先打开“在线响应程序”控制台双击对应吊销配置查看“状态”和“错误信息”。如果是签名证书的问题先回到OCSP服务器的“个人”证书存储确认那张OCSP响应签名证书是否存在、是否过期、是否包含正确的EKU。如果证书存在但依然不可用尝试在吊销配置属性里重新手动指定一次签名证书。如果错误信息指向CA连接就先在OCSP服务器上执行certutil -ping ca01\CONTOSO-INTERNAL-CA -config测试能不能连上CA。连不上就用telnet ca01 135之类的命令检查RPC端口。域名解析也要查一遍很多“不可用”其实是DNS指向了错误地址。问题二浏览器能访问OCSP服务但客户端查不到状态浏览器能访问只能证明HTTP端口是通的。客户端查不到状态最可能的原因是证书本身没有AIA扩展。这时候打开客户端证书切到“详细信息”页找到“颁发机构信息访问(AIA)”看里面有没有http://ocsp01.contoso.com/ocsp这一行。没有的话说明这张证书是在配置AIA扩展之前签发的只能重新申请一张新证书。如果AIA存在但客户端依然报“吊销状态未知”就用certutil -urlfetch -verify看一下具体报错。如果URL能解析、80端口通、但返回了“OCSP服务器返回了无效响应”那就要去OCSP服务器的事件日志里查到底哪儿出错了。7. 正式环境里不能忽略的坑证书模板权限不够导致OCSP自动注册失败。很多人到了“申请签名证书”这一步才发现模板列表里根本没有OCSP响应签名或者申请后被拒绝。根治办法就是我在第3.3节说的启用模板后一定要把“读取”和“注册”权限授予OCSP服务器的计算机账户或相应的组。不要贪图方便只给域管理员否则这台OCSP服务器一重启或服务账户变更重新注册证书时又会卡住。CDP和AIA的URL不能写内网地址让外网客户端访问。如果你有远程客户端或分支机构AIA里的OCSP地址必须是他们也能访问的公网或专网地址。很多公司把OCSP URL写成了http://ca01/ocsp这种NetBIOS名或内网IP外网客户端拿到证书后根本访问不了证书状态就会“未知”。域名规划那一步一定要提前想好。CRL周期调长之后又把OCSP切到本地缓存模式。两种模式混着用容易把排错引到错误方向。如果你用的是CRL发布配置CRL发布周期就应该和业务容忍度匹配建议从一天一期缩短到6小时一期这样即使OCSP缓存还没到更新点吊销信息也不会滞后太久。如果你用的是CA配置模式那就别纠结CRL周期它只影响回退路径。和RDS场景的关联我这里顺手提一个真实案例。之前有个环境跑着Windows Server 2016的RDS会话主机补丁重启后总有其他会话主机提示“60分钟后断连”排查到最后发现根因不在RDS本身而在证书吊销状态检查链路不完整客户端和会话主机之间的证书无法实时确认吊销状态导致相互验证时出现不可信状态系统就按保守策略踢掉了会话。把这个环境的OCSP服务搭好、证书AIA扩展配齐、吊销配置切成CA配置模式之后这类提示就基本消失了。所以如果你同时维护RDS和证书服务OCSP不只是“让吊销查询更快”的优化项它可能直接影响业务可用性。我在实际部署中的体会是OCSP环境搭建的难点不在“装个角色、配个服务”而在于CA、OCSP、客户端三条链路都得自洽。CA负责发证和吊销OCSP负责提供查询客户端负责按AIA地址发起请求哪一个环节断掉整个信任链就卡住。你最好在测试环境完整走一遍“申请证书—吊销证书—验证状态”再上生产尤其是老证书的补发和AIA扩展变更规划好时间窗口。最后再分享一个小技巧给OCSP签名证书加个有效期监控告警比任何排错技巧都值钱它能在问题吞掉整个业务之前先提醒你。
返回列表