Azure 托管服务总线:“X.509 证书 CN=servicebus.windows.net 不在受信任的人员存储中。”
Posted
技术标签:
【中文标题】Azure 托管服务总线:“X.509 证书 CN=servicebus.windows.net 不在受信任的人员存储中。”【英文标题】:Azure Hosted Service Bus : "The X.509 certificate CN=servicebus.windows.net is not in the trusted people store." 【发布时间】:2014-08-02 01:00:56 【问题描述】:在我的 vs2013 开发 VM 上使用 Azure SDK 2.3,我可以轻松使用 Azure 中托管的服务总线队列。但是,在 Windows Server 2008 R2 Standard SP1 上,Windows 似乎无法信任所涉及的证书并引发异常。
抛出的线:
// Send the message
await queueclient.SendAsync(message);
异常信息:
X.509 证书 CN=servicebus.windows.net 不在受信任的 人商店。 X.509 证书 CN=servicebus.windows.net 链 建设失败。使用的证书有一个信任链 无法验证。更换证书或更改 证书验证模式。无法将证书链构建到 受信任的根权限。
CAPI2 日志(附在下面)指出了信任问题,因此我比较了两台机器上安装的证书。服务器上没有以下证书:
中级证书颁发机构 > Microsoft Internet Authority (由巴尔的摩 CyberTrust Root 颁发)
中级证书颁发机构 > MSIT Machine Auth CA 2 (由微软互联网管理局颁发)
问题:
-
证书从何而来?
为什么它们从服务器中丢失?
如何解决此问题?
可能的路线(更新):
我试过了:
<appSettings>
<add key="Microsoft.ServiceBus.X509RevocationMode" value="NoCheck"/>
</appSettings>
CAPI2 验证链策略事件:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-CAPI2" Guid="5bbca4a8-b209-48dc-a8c7-b23d3e5216fb" />
<EventID>30</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>30</Task>
<Opcode>0</Opcode>
<Keywords>0x4000000000000001</Keywords>
<TimeCreated SystemTime="2014-06-11T19:57:38.998656000Z" />
<EventRecordID>5642</EventRecordID>
<Correlation />
<Execution ProcessID="5280" ThreadID="8472" />
<Channel>Microsoft-Windows-CAPI2/Operational</Channel>
<Computer>ne-r026-310cn</Computer>
<Security UserID="S-1-5-82-1758914132-2364927631-3137608320-3227192193-3717738432" />
</System>
<UserData>
<CertVerifyCertificateChainPolicy>
<Policy type="CERT_CHAIN_POLICY_BASE" constant="1" />
<Certificate fileRef="3E560462C61B45BE1A59F1286B34A065A878AFA0.cer" subjectName="servicebus.windows.net" />
<CertificateChain chainRef="19B5F58A-FA37-4213-A888-C81C340D019C" />
<Flags value="1000" CERT_CHAIN_POLICY_IGNORE_PEER_TRUST_FLAG="true" />
<Status chainIndex="0" elementIndex="-1" />
<EventAuxInfo ProcessName="w3wp.exe" />
<CorrelationAuxInfo TaskId="F8DE43DD-9E68-461E-8A2B-17215BA87E0C" SeqNumber="1" />
<Result value="800B010A">A certificate chain could not be built to a trusted root authority.</Result>
</CertVerifyCertificateChainPolicy>
</UserData>
</Event>
CAPI2 构建链事件:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-CAPI2" Guid="5bbca4a8-b209-48dc-a8c7-b23d3e5216fb" />
<EventID>11</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>11</Task>
<Opcode>2</Opcode>
<Keywords>0x4000000000000003</Keywords>
<TimeCreated SystemTime="2014-06-11T19:57:38.998656000Z" />
<EventRecordID>5641</EventRecordID>
<Correlation />
<Execution ProcessID="5280" ThreadID="8472" />
<Channel>Microsoft-Windows-CAPI2/Operational</Channel>
<Computer>ne-r026-310cn</Computer>
<Security UserID="S-1-5-82-1758914132-2364927631-3137608320-3227192193-3717738432" />
</System>
<UserData>
<CertGetCertificateChain>
<Certificate fileRef="3E560462C61B45BE1A59F1286B34A065A878AFA0.cer" subjectName="servicebus.windows.net" />
<ValidationTime>2014-06-11T19:57:38.998Z</ValidationTime>
<AdditionalStore />
<ExtendedKeyUsage />
<Flags value="0" />
<ChainEngineInfo context="machine" />
<AdditionalInfo>
<NetworkConnectivityStatus value="1" _SENSAPI_NETWORK_ALIVE_LAN="true" />
</AdditionalInfo>
<CertificateChain chainRef="19B5F58A-FA37-4213-A888-C81C340D019C">
<TrustStatus>
<ErrorStatus value="10000" CERT_TRUST_IS_PARTIAL_CHAIN="true" />
<InfoStatus value="0" />
</TrustStatus>
<ChainElement>
<Certificate fileRef="3E560462C61B45BE1A59F1286B34A065A878AFA0.cer" subjectName="servicebus.windows.net" />
<SignatureAlgorithm oid="1.2.840.113549.1.1.5" hashName="SHA1" publicKeyName="RSA" />
<PublicKeyAlgorithm oid="1.2.840.113549.1.1.1" publicKeyName="RSA" publicKeyLength="2048" />
<TrustStatus>
<ErrorStatus value="0" />
<InfoStatus value="2" CERT_TRUST_HAS_KEY_MATCH_ISSUER="true" />
</TrustStatus>
<ApplicationUsage>
<Usage oid="1.3.6.1.5.5.7.3.2" name="Client Authentication" />
<Usage oid="1.3.6.1.5.5.7.3.1" name="Server Authentication" />
</ApplicationUsage>
<IssuanceUsage />
</ChainElement>
</CertificateChain>
<EventAuxInfo ProcessName="w3wp.exe" />
<CorrelationAuxInfo TaskId="9077AB4E-95E3-449B-AF2F-0BF42E92E6B7" SeqNumber="11" />
<Result value="800B010A">A certificate chain could not be built to a trusted root authority.</Result>
</CertGetCertificateChain>
</UserData>
</Event>
CAPI2 X509 对象事件:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-CAPI2" Guid="5bbca4a8-b209-48dc-a8c7-b23d3e5216fb" />
<EventID>90</EventID>
<Version>0</Version>
<Level>4</Level>
<Task>90</Task>
<Opcode>0</Opcode>
<Keywords>0x4000000000000200</Keywords>
<TimeCreated SystemTime="2014-06-11T19:57:38.998656000Z" />
<EventRecordID>5640</EventRecordID>
<Correlation />
<Execution ProcessID="5280" ThreadID="8472" />
<Channel>Microsoft-Windows-CAPI2/Operational</Channel>
<Computer>ne-r026-310cn</Computer>
<Security UserID="S-1-5-82-1758914132-2364927631-3137608320-3227192193-3717738432" />
</System>
<UserData>
<X509Objects>
<Certificate fileRef="3E560462C61B45BE1A59F1286B34A065A878AFA0.cer" subjectName="servicebus.windows.net">
<Subject>
<CN>servicebus.windows.net</CN>
</Subject>
<SubjectKeyID computed="false" hash="BD41618C22D8DBEE9D172C12A2C549D61711ED75" />
<SignatureAlgorithm oid="1.2.840.113549.1.1.5" hashName="SHA1" publicKeyName="RSA" />
<PublicKeyAlgorithm oid="1.2.840.113549.1.1.1" publicKeyName="RSA" publicKeyLength="2048" />
<Issuer>
<CN>MSIT Machine Auth CA 2</CN>
<DC>redmond</DC>
<DC>corp</DC>
<DC>microsoft</DC>
<DC>com</DC>
</Issuer>
<SerialNumber>70DB015B000100008C58</SerialNumber>
<NotBefore>2013-07-27T03:31:06Z</NotBefore>
<NotAfter>2015-07-27T03:31:06Z</NotAfter>
<Extensions>
<KeyUsage value="B0" CERT_DIGITAL_SIGNATURE_KEY_USAGE="true" CERT_KEY_ENCIPHERMENT_KEY_USAGE="true" CERT_DATA_ENCIPHERMENT_KEY_USAGE="true" />
<ExtendedKeyUsage>
<Usage oid="1.3.6.1.5.5.7.3.2" name="Client Authentication" />
<Usage oid="1.3.6.1.5.5.7.3.1" name="Server Authentication" />
</ExtendedKeyUsage>
<SubjectAltName>
<DNSName>*.servicebus.windows.net</DNSName>
<DNSName>servicebus.windows.net</DNSName>
</SubjectAltName>
<AuthorityKeyIdentifier>
<KeyID hash="EBDB115EF8099ED8D6629CFD629DE3844A28E127" />
</AuthorityKeyIdentifier>
</Extensions>
</Certificate>
<EventAuxInfo ProcessName="w3wp.exe" />
<CorrelationAuxInfo TaskId="9077AB4E-95E3-449B-AF2F-0BF42E92E6B7" SeqNumber="10" />
</X509Objects>
</UserData>
</Event>
【问题讨论】:
这个问题我也得到这个错误非常罕见。但问题是我不使用控制台应用程序。它是 azure 同一资源组中的 web 应用程序和 servicebus 和 web 应用程序。 【参考方案1】:缺少证书是造成异常的原因。
我无法在网上找到证书,我仍然不确定他们是如何自己安装的,但我想我有一个想法..
我们是如何获得证书的? 我们将服务总线消息传递代码隔离到控制台应用程序中,并在生产服务器上以管理员权限执行它。证书在此过程中自动安装。
也许我们的应用程序池在具有有限权限的 ApplicationPoolIdentity 下运行,不允许 Windows 下载或安装证书。
此链接似乎提供了相关信息:http://netsekure.org/2011/04/automatic-ca-root-certificate-updates-on-windows/
更新:可以下载证书链here。
【讨论】:
谢谢。在我们的例子中,应用程序池在 (ApplicationPoolIdentity) 下运行的身份没有足够的访问级别。为其分配具有提升权限的身份修复了它。 @Crwydryn 不错!这确实是一个权限问题。请记住改回 ApplicationPoolIdentity,您不需要提升权限,只需下载一次证书。【参考方案2】:要消除 Windows Server 服务总线的证书信任问题,请使用以下方法:
创建您信任的证书列表:
var trustedCertificates = new HashSet<string>(new[]
"1245…",
"4567…,
"8102…"
, StringComparer.OrdinalIgnoreCase);
相信那些:
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) =>
if (errors == SslPolicyErrors.None)
return true;
var hashString = certificate.GetCertHashString();
var isTrusted = trustedCertificates.Contains(hashString);
if (!isTrusted)
telemetryClient.TrackTrace($"Untrusted: hashString Errors: errors Cert: certificate.ToString()", SeverityLevel.Warning);
return isTrusted;
;
Calm Service Bus 也关闭:
private static void SetCertificateValidator()
var retriableCertificateValidatorType = Type.GetType("Microsoft.ServiceBus.Channels.Security.RetriableCertificateValidator, Microsoft.ServiceBus", true, false);
var instanceProperty = retriableCertificateValidatorType.GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic);
var instance = instanceProperty.GetValue(null);
var peerOrChainTrustNoCheck = retriableCertificateValidatorType.GetField("peerOrChainTrustNoCheck", BindingFlags.Instance | BindingFlags.NonPublic);
peerOrChainTrustNoCheck?.SetValue(instance, new EmptyOpX509CertificateValidator());
private sealed class EmptyOpX509CertificateValidator : X509CertificateValidator
public override void Validate(X509Certificate2 certificate)
【讨论】:
以上是关于Azure 托管服务总线:“X.509 证书 CN=servicebus.windows.net 不在受信任的人员存储中。”的主要内容,如果未能解决你的问题,请参考以下文章
为我的应用服务使用托管标识时,Azure 服务总线的连接字符串的正确格式是啥?
为服务总线中继绑定设置 Azure Service Fabric 侦听器