Compartir a través de

Azure AI Speech SDK:证书吊销列表(CRL)兼容性更新

重要

生效日期: 2026 年 7 月 1 日。 在此日期之前需要执行作,以避免 Linux 和 Android 平台上的服务中断。

1.48.2 之前的 Azure AI Speech SDK 版本中的证书吊销列表(CRL)缓存功能可能会导致 Linux 和 Android 平台上Azure语音服务的连接失败。 这些平台上使用本机 OpenSSL 层的所有 SDK 语言绑定(C#、C++、Java、Python和 Go)都会受到影响。 此问题是由行业范围的 CRL 结构变化引发的。 在 2026 年 7 月 1 日之前需要执行作,以避免服务中断。

受影响的平台: Linux、Android
受影响的 SDK 版本: 1.48.2 之前的所有版本

先决条件

在采取行动之前,请确认此问题是否适用于你:

  • 平台: 在 Linux 或 Android 上运行语音 SDK。
  • SDK 版本: 使用 1.48.2 之前的版本。 检查依赖项管理器中的语音 SDK 包的版本。 例如:
    • Python:pip show azure-cognitiveservices-speech
    • C#/.NET:dotnet list package
    • Java/Maven:mvn dependency:tree | grep speechsdk
    • Go:go list -m all | grep speechsdk
  • CRL 检查: CRL 检查已启用(1.48.1 之前的版本中的默认值)。

确定应用程序是使用仅限云的、混合(云 + 嵌入式)还是仅嵌入式语音,以根据部署类型来确定您的影响。

如果这三个条件全部适用,请按照所需操作中的步骤操作。

根据部署类型确定影响

CRL 分区更改的影响取决于应用程序是否连接到Azure语音云终结点。 使用下表确定方案和所需作。

客户类型 影响 需要采取行动
仅嵌入 (无云连接) 不受影响 无需操作
混合云 (带嵌入式回退的云) 证书续订后,云 STT/TTS 可能会失败 请参阅 必要操作
仅限云 证书续订后,云 STT/TTS 可能会失败 请参阅 必要操作

使用此快速决策指南:

  • 您的应用程序是否连接到 Azure 语音云终结点(STT 或 TTS)?
    • 你仅使用嵌入式语音。 无需执行任何操作。
    • →继续执行步骤 2。
  • 你的应用程序是否还使用嵌入式语音作为备用方案?
    • →你有混合部署。 证书续订后,云功能可能会出现故障,但嵌入式回退仍将正常工作。 云功能需要采取行动
    • 没有 →你拥有仅限云的部署。 证书续订后,语音呼叫可能会失败,且不会回退。 需要采取行动。

仅限嵌入式部署

如果应用程序仅使用嵌入式(设备端)语音识别或合成,并且从不连接到Azure语音云终结点,则不会受到此更改的影响。 无需执行任何操作。

混合部署(具有嵌入式回退机制的云)

当应用程序处于联机状态时,它使用云语音转文本(STT)或文本转语音(TTS)。 这些云连接受 CRL 分区问题的约束。 当没有数据信号时,嵌入式回退仍然有效,但除非你采取措施,否则云功能将无法正常运行。

确定适用于你的缓存方案:

已启用 CRL 磁盘缓存(默认值)

SDK 使用系统临时目录($TMPDIR$TMP) 将 CRL 数据保存到磁盘。 磁盘缓存中的过时 CRL 分区条目可能会导致应用程序重启后出现永久性连接失败。 若要解决此问题:

未启用 CRL 磁盘缓存

如果使用自定义配置或 $TMPDIR/$TMP 环境变量未设置,SDK 仍会在进程生存期内缓存内存中的 CRL。 重启应用程序会清除内存中缓存,但在下一个跨区域连接或证书轮换上再次出现此问题。 根据所需操作选项升级或禁用CRL检查。

小窍门

脱机时回退到嵌入式语音的混合部署继续在嵌入式模式下工作,但依赖云的功能在您应用修复之前无法使用。

仅限云的部署

所有云 STT/TTS 调用都会受到影响。 混合部署中所述的相同两种方案(已启用或未启用 CRL 磁盘缓存)适用于仅限云的部署。

警告

仅限云的部署没有备用方案。 证书续订开始使用分区 CRL 后,如果尚未应用修补程序,语音识别和合成调用可能会失败。 确切的时间取决于区域 TLS 证书的续订时间,但应在 2026 年 7 月 1 日之前采取措施,以避免任何中断风险。

背景

证书颁发机构(CA),包括Microsoft的公钥基础结构(PKI),正在转换为 分区 CRL ,以符合 CA/浏览器论坛基线要求。 这是影响所有公开受信任 CA 的行业范围变更。

以前,每个证书颁发者都维护了一个 CRL。 使用分区 CRL 时,同一颁发者可能有多个 CRL,每个 CRL 涵盖一部分证书。 这可以提高可伸缩性(将 CRL 大小从 10 MB+ 减少到约 1 KB)。

问题

Azure AI Speech SDK(1.48.2 之前的版本)仅使用证书颁发者名称作为缓存密钥在某些平台上缓存 CRL。 使用分区 CRL 时,这会导致缓存不匹配:

  • 连接到一个Azure区域时,SDK 会下载并缓存该区域的 TLS 证书的 CRL
  • 连接到其他区域(或证书轮换后),缓存的 CRL 可能与新证书的分区不匹配
  • OpenSSL 拒绝连接并出现错误: X509_V_ERR_DIFFERENT_CRL_SCOPE (错误代码 44)

这会影响到您,如果:

  • Linux 或 Android 上使用语音 SDK
  • 你已经启用 CRL 检查(这是在受影响版本中的默认设置)。
  • 连接到多个Azure 区域
  • 在您的区域,证书轮换(这一过程是自动进行的,并且可能会分配到不同的分区)

这不会影响:

  • Windows部署
  • iOS 或 Mac 部署
  • SDK 版本 1.48.2 或更高版本

必需的操作

2026 年 7 月 1 日之前执行以下作之一:

SDK 版本 1.48.2 包括用于正确处理已分区 CRL 的修补程序。 默认情况下,语音 SDK 1.48.1 及更高版本禁用 CRL 检查,这也会阻止此问题,但会删除额外的验证层。

下载最新的 SDK:Azure AI Speech SDK 安装程序

升级后,通过监控应用程序日志,验证在连接期间是否没有出现错误 44(X509_V_ERR_DIFFERENT_CRL_SCOPE)。 如果连接到多个Azure区域,请测试跨区域连接以确认问题已解决。

选项 2:禁用CRL检查

如果无法立即升级,请在当前 SDK 版本中禁用 CRL 检查。 请将OPENSSL_DISABLE_CRL_CHECK属性设置为"true",以应用到您的SpeechConfig对象:

config.SetProperty("OPENSSL_DISABLE_CRL_CHECK", "true");

设置属性后,通过确认连接成功验证修复,并且 SDK 日志中未显示任何与 CRL 相关的错误(错误 44 或 WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED)。

小窍门

如果要保留 CRL 检查,但允许下载失败,请改为设置为OPENSSL_CONTINUE_ON_CRL_DOWNLOAD_FAILURE"true"。 此属性允许在 CRL 无法检索时继续连接,同时在 CRL 可用时仍执行 CRL 验证。

有关更多配置选项,请参阅 如何为 Linux 配置 OpenSSL

不采取行动的风险

如果未在 2026 年 7 月 1 日之前升级或禁用 CRL 检查功能:

  • 当证书轮换分配不同的 CRL 分区或跨区域连接时,可能会发生连接失败
  • 失败显示为 WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED 错误
  • 没有提前警告 - 确切的计时取决于区域 TLS 证书续订的时间
  • 服务中断 会持续到 SDK 升级、禁用 CRL 检查或清除 CRL 缓存

如何确定你是否受到影响

错误症状

连接失败并显示如下消息:

Connection failed (no connection to the remote host). Internal error: 1. 
Error details: Failed with error: WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED

SDK 日志指示器

启用 SDK 日志记录以查看详细的 TLS 错误。 查找:

SPX_TRACE_ERROR: AZ_LOG_ERROR: tlsio_openssl.c:1655 Error 44 was unexpected
SPX_TRACE_ERROR: AZ_LOG_ERROR: tlsio_openssl.c:691 error:0A000086:SSL routines::certificate verify failed
SPX_TRACE_ERROR: web_socket.cpp:930 WS open operation failed with result=1(WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED)

(日志消息中的行号可能因 SDK 版本而异)

错误 44X509_V_ERR_DIFFERENT_CRL_SCOPE) 是此 CRL 分区不匹配问题的特定指示器。

确认问题

如果您看到这些错误,并且:

  • 在 Linux 或 Android 上运行
  • 使用 1.48.2 之前的 SDK 版本
  • 连接到多个区域或在一段工作连接后遇到故障

然后,你很可能受到此问题的影响。

临时解决方法:清除 CRL 磁盘缓存

如果无法在截止时间之前升级或禁用 CRL 检查,可以通过 禁用 CRL 磁盘缓存来降低影响持续时间。 这只会将问题限制为内存中缓存,这意味着:

  • 影响持续时间 = 进程生存期
  • 重启应用程序会清除缓存 并还原连接(直到下一个跨区域连接或轮换事件)

如何禁用磁盘缓存

在启动应用程序之前删除或取消设置 TMPDIRTMP 环境变量。 如果没有这些变量,SDK 不会将 CRL 保存到磁盘。

或者,手动清除 CRL 缓存目录:

  • 默认位置:系统临时目录($TMPDIR$TMP
  • 删除缓存 .crl 的文件并重启应用程序

注释

这是一种临时解决方法,而不是解决方案。 仍需要升级到 SDK 1.48.2 或更高版本或禁用 CRL 检查。

日程表

日期 事件
现在 查看部署类型和 SDK 版本
2026 年 2 月 SDK 1.48.2 已发布并修复
2026 年 7 月 1 日 截止时间:升级或禁用 CRL 检查
2026 年 7 月 1 日之后 未修补的部署在续订证书时可能会遇到连接失败

常见问题解答

这是什么原因?

证书颁发机构需要实施分区 CRL,以符合行业标准。 这不是特定于Microsoft - 所有主要 CA 都在做出这种更改。

这是否会影响Windows?

否。 Windows以不同的方式处理证书验证,并且不受影响。

我只使用一个Azure区域。 我是否仍然受到影响?

是的。 证书轮换(自动发生)可能会将区域证书分配给其他分区,从而触发相同的失败。

如果已禁用 CRL 检查,该怎么办?

你不会受到影响。 无需执行任何作,但建议升级到最新的 SDK 进行其他改进和更新。

禁用 CRL 检查是否有安全风险?

CRL 检查提供额外的证书验证层。 对于大多数用例,禁用它的安全影响很小,因为其他验证机制(证书链,过期)保持活动状态。 如果你有特定的合规性要求,请咨询安全团队。

如何启用 SDK 日志记录来诊断问题?

请参阅 SDK 文档,了解如何启用诊断日志功能:语音 SDK 日志记录

我仅使用嵌入式语音,没有云连接。 我是否受到影响?

否。 此问题仅影响与 Azure 语音云终结点的连接。 如果应用程序从未连接到云 STT 或 TTS 服务,则不会受到影响。 有关详细信息,请参阅 确定你的影响(按部署类型)。

支持

如果你有疑问或需要帮助: