通过 HTTPS 和令牌加密调用依赖方
Calling relying party over HTTPS and token encryption
我的 Windows Azure ACS 有问题,我不能完全确定它是否应该是这样,或者我的代码是否有错误。
我在 ACS 中配置了多个依赖方,它们都配置了 HTTPS。每个服务都以需要令牌加密的方式配置。为此,我上传了使用 MakeCert.exe.
创建的证书
当客户端与依赖方通信时,我将证书的 public 部分添加为服务证书,并将主题名称添加为 DnsIdentity:
var identity = EndpointIdentity.CreateDnsIdentity( GetClientCertificateSubjectName() );
var serviceEndpointAddress = new EndpointAddress( new Uri( _serviceAddress ), identity );
// Creation of channel factory
if( channelFactory.Credentials != null ) {
channelFactory.Credentials.ServiceCertificate.DefaultCertificate = GetClientCertificate();
channelFactory.Credentials.ClientCertificate.Certificate = GetServiceIdentityCertificate();
}
事情是这样的:当我通过 HTTPS 调用依赖方时,我可以跳过 EndpointIdentity
的创建,然后依赖方会给我一个正确的答案。我也可以跳过设置 ServiceCertificate.DefaultCertificate
属性 或设置一个完全随机的证书,依赖方仍然会给我一个正确的答案。
通过 HTTP 调用时,执行上述任何操作都会导致 ACS 出错,并显示消息表明我没有使用正确的证书。简而言之:通过 HTTP 调用时,我只能使用正确的客户端证书进行通信。我预计 HTTPS 也是如此。
我可以想象 ChannelFactory<T>
或 ACS 足够智能,可以检测到使用了 HTTPS 并跳过配置的加密,支持 SSL 加密。可悲的是,我找不到任何支持这个想法的文档。
我的问题是:通过 HTTPS 调用依赖方时忽略 EndpointIdentity
和证书是否正常?还是我需要额外的配置才能完成这项工作?
提前致谢!
事实证明,我提供的信息量不足以正确回答问题。事实证明,这一切都在我们创建的绑定中。它使用以下代码创建绑定:
public static Binding CreateServiceBinding( string acsCertificateEndpoint, string bindingNameSpace, bool useSsl ) {
var binding = new IssuedTokenWSTrustBinding( CreateAcsCertificateBinding(), new EndpointAddress( acsCertificateEndpoint ) );
if( useSsl ) {
binding.SecurityMode = SecurityMode.TransportWithMessageCredential;
}
if( !string.IsNullOrWhiteSpace( bindingNameSpace ) ) {
binding.Namespace = bindingNameSpace;
}
return binding;
}
public static CertificateWSTrustBinding CreateAcsCertificateBinding() {
return new CertificateWSTrustBinding( SecurityMode.TransportWithMessageCredential );
}
结果如下:
- 如果是http通信,则走MutualCertificate认证模式流程,只应用在消息层。这就是客户必须出示客户证书的原因。此绑定元素创建一个非对称安全绑定元素,该元素配置为需要基于证书的客户端身份验证以及基于证书的服务器身份验证。
- 如果是https通信,则走CertificateOverTransport认证模式流程,只应用于传输层。这就是为什么即使没有提供客户端证书,它也能工作。此绑定元素期望传输提供服务器身份验证以及消息保护(例如 HTTPS)。
有关安全模式的更多信息,请查看以下链接:
https://msdn.microsoft.com/en-us/library/ms733098%28v=vs.110%29.aspx
https://msdn.microsoft.com/en-us/library/ms731074%28v=vs.110%29.aspx
希望这对某人有所帮助!
我的 Windows Azure ACS 有问题,我不能完全确定它是否应该是这样,或者我的代码是否有错误。
我在 ACS 中配置了多个依赖方,它们都配置了 HTTPS。每个服务都以需要令牌加密的方式配置。为此,我上传了使用 MakeCert.exe.
创建的证书当客户端与依赖方通信时,我将证书的 public 部分添加为服务证书,并将主题名称添加为 DnsIdentity:
var identity = EndpointIdentity.CreateDnsIdentity( GetClientCertificateSubjectName() );
var serviceEndpointAddress = new EndpointAddress( new Uri( _serviceAddress ), identity );
// Creation of channel factory
if( channelFactory.Credentials != null ) {
channelFactory.Credentials.ServiceCertificate.DefaultCertificate = GetClientCertificate();
channelFactory.Credentials.ClientCertificate.Certificate = GetServiceIdentityCertificate();
}
事情是这样的:当我通过 HTTPS 调用依赖方时,我可以跳过 EndpointIdentity
的创建,然后依赖方会给我一个正确的答案。我也可以跳过设置 ServiceCertificate.DefaultCertificate
属性 或设置一个完全随机的证书,依赖方仍然会给我一个正确的答案。
通过 HTTP 调用时,执行上述任何操作都会导致 ACS 出错,并显示消息表明我没有使用正确的证书。简而言之:通过 HTTP 调用时,我只能使用正确的客户端证书进行通信。我预计 HTTPS 也是如此。
我可以想象 ChannelFactory<T>
或 ACS 足够智能,可以检测到使用了 HTTPS 并跳过配置的加密,支持 SSL 加密。可悲的是,我找不到任何支持这个想法的文档。
我的问题是:通过 HTTPS 调用依赖方时忽略 EndpointIdentity
和证书是否正常?还是我需要额外的配置才能完成这项工作?
提前致谢!
事实证明,我提供的信息量不足以正确回答问题。事实证明,这一切都在我们创建的绑定中。它使用以下代码创建绑定:
public static Binding CreateServiceBinding( string acsCertificateEndpoint, string bindingNameSpace, bool useSsl ) {
var binding = new IssuedTokenWSTrustBinding( CreateAcsCertificateBinding(), new EndpointAddress( acsCertificateEndpoint ) );
if( useSsl ) {
binding.SecurityMode = SecurityMode.TransportWithMessageCredential;
}
if( !string.IsNullOrWhiteSpace( bindingNameSpace ) ) {
binding.Namespace = bindingNameSpace;
}
return binding;
}
public static CertificateWSTrustBinding CreateAcsCertificateBinding() {
return new CertificateWSTrustBinding( SecurityMode.TransportWithMessageCredential );
}
结果如下:
- 如果是http通信,则走MutualCertificate认证模式流程,只应用在消息层。这就是客户必须出示客户证书的原因。此绑定元素创建一个非对称安全绑定元素,该元素配置为需要基于证书的客户端身份验证以及基于证书的服务器身份验证。
- 如果是https通信,则走CertificateOverTransport认证模式流程,只应用于传输层。这就是为什么即使没有提供客户端证书,它也能工作。此绑定元素期望传输提供服务器身份验证以及消息保护(例如 HTTPS)。
有关安全模式的更多信息,请查看以下链接:
https://msdn.microsoft.com/en-us/library/ms733098%28v=vs.110%29.aspx https://msdn.microsoft.com/en-us/library/ms731074%28v=vs.110%29.aspx
希望这对某人有所帮助!