- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我使用相互证书验证客户端的 WCF 自托管 WebService 中,我设置了 CertificateValidationMode = PeerTrust
但它似乎被忽略了,因为我仍然可以使用我已删除的某些客户端执行这些方法TrustedPeople
服务器存储的相应证书。
这是主机示例:
static void Main()
{
var httpsUri = new Uri("https://192.168.0.57:xxx/HelloServer");
var binding = new WSHttpBinding
{
Security =
{
Mode = SecurityMode.Transport,
Transport = {ClientCredentialType = HttpClientCredentialType.Certificate}
};
var host = new ServiceHost(typeof(HelloWorld), httpsUri);
//This line is not working
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode =X509CertificateValidationMode.PeerTrust;
host.AddServiceEndpoint(typeof(IHelloWorld), binding, string.Empty, httpsUri);
host.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
"server.com");
// Open the service.
host.Open();
Console.WriteLine("Listening on {0}...", httpsUri);
Console.ReadLine();
// Close the service.
host.Close();
}
客户端应用:
static void Main(string[] args)
{
try
{
var c = new HelloWorld.HelloWorldClient();
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, error) => true;
c.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
"client.com");
Console.WriteLine(c.GetIp());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
我使用 RootCA 证书生成 server.com 和 client.com。此 RootCA 证书安装在客户端和服务器的受信任根存储上。问题是,如果我的 client.com 证书不在服务器的 TrustedPeople 存储中,我不应该执行 GetIp()
方法,正确的?但是我执行它没有任何问题。
问题是,在这种情况下,如何验证客户端证书将其公钥放在服务器的 TrustedPeople 上?
附:在this MSDN Transport security with client certificate 的文章中有一句话说 服务器的证书必须被客户端信任,客户端的证书必须被服务器信任。
但是我可以从客户端执行 web 方法,即使客户端证书不在服务器 TrustedPeople 存储中。
最佳答案
我的建议是使用 custom validation .通过这种方式,您可以设置一些断点并观察验证的进行,并查看您可以根据整个验证过程中可用的数据提出哪些其他验证选项。
首先确保您的绑定(bind)需要 消息 客户端凭据的证书。如果您仅使用证书进行传输,则我测试中的客户端未验证。仅此一项就可以解决您的问题。
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType =
MessageCredentialType.Certificate;
要设置自定义验证器,请遵循其余部分。
替换:
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode
=X509CertificateValidationMode.PeerTrust;
与:
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode
=X509CertificateValidationMode.Custom;
host.Credentials.ClientCertificate.Authentication.CustomCertificateValidator =
new IssuerNameCertValidator("CN=client.com");
然后添加此代码以创建自定义验证器并根据需要进行调整(此验证器基于 Issuer):
public class IssuerNameCertValidator : X509CertificateValidator
{
string allowedIssuerName;
public IssuerNameCertValidator(string allowedIssuerName)
{
if (allowedIssuerName == null)
{
throw new ArgumentNullException("allowedIssuerName");
}
this.allowedIssuerName = allowedIssuerName;
}
public override void Validate(X509Certificate2 certificate)
{
// Check that there is a certificate.
if (certificate == null)
{
throw new ArgumentNullException("certificate");
}
// Check that the certificate issuer matches the configured issuer.
if (allowedIssuerName != certificate.IssuerName.Name)
{
throw new SecurityTokenValidationException
("Certificate was not issued by a trusted issuer");
}
}
}
关于c# - 以证书作为 ClientCredentials 的 Wcf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25667501/
我正在尝试使用 WCF 服务: 服务的配置是:
我可以从客户端消息检查器中引用代理客户端实例吗? 原因,我想访问以下属性的值: ClientCredentials.UserName.UserName ClientCredentials.UserN
我可以从客户端消息检查器中引用代理客户端实例吗? 原因,我想访问以下属性的值: ClientCredentials.UserName.UserName ClientCredentials.UserN
我在 SSL 下的本地 IIS 上托管了 WCF 服务。它似乎与 SL 客户端一起工作。但我坚持用户身份验证。我有带有用户名和密码文本框的登录屏幕。一旦用户点击登录按钮,肯定会发生一些事情,但是会发生
我是 WCF 的新手,正在尝试使用自定义用户名和密码创建 WCF 服务。我知道我应该将用户名和密码设置为代理的 ClientCredentials,但出于某种原因,我没有这样的属性... 我认为它与我
在我使用相互证书验证客户端的 WCF 自托管 WebService 中,我设置了 CertificateValidationMode = PeerTrust 但它似乎被忽略了,因为我仍然可以使用我已删
我使用客户端凭据创建 WCF 应用程序。它在内部工作正常,而我从其他项目引用和调用此服务意味着我收到了错误消息。 The username is not provided. Specify usern
我正在 WCF 中创建自定义 channel 以实现自定义安全协议(protocol)。不,不要逃!没那么可怕! 验证服务协议(protocol)相对简单。困难的部分是根据客户端凭据将安全信息添加到请
我正在 Java EE 中实现一个针对 Web 服务的代理,并且我已经从该 Web 服务的 WSDL 生成了 stub 。但是,在 Web 服务的用户手册中,所有示例均采用 C# 编写,并且手册指出您
我的任务是从本地 wsdl 文件创建 WCF 服务。我在这个任务上做了一些研发。我添加了该本地 wsdl 文件的 Web 引用。现在我想为此服务创建一个客户端以便访问该服务。 如何在客户端提供用户名和
是否可以在 App.config 中为 WCF 设置客户端凭据? 我想避免这样做: Using svc As New MyServiceClient svc.ClientCredentials.U
我有一个在服务器 A 上运行的 Web 应用程序调用服务器 B 上的 WCF 服务(K2 工作流),该服务需要模拟/委派才能作为调用用户运行。如果我从服务器 A 运行 Web 应用程序,该应用程序运行
为什么我的 Azure AD 应用程序不允许 oauth client_credentials 授予? 我想使用 Azure Graph API,但首先我需要一个 oauth token 。为了获取
我使用 HTTPS 开发了一个带有自定义 UserNamePasswordValidator 和 basicHttpBinding 的 WCF 服务。它与 .Net 客户端配合得很好,使用 Clien
我想使用 Azure 数据工厂将数据从 Azure Blob 传输到 Azure SQL 数据库。我找到了这个链接:Copy data from Azure Blob to Azure SQL Dat
我想使用 Azure 数据工厂将数据从 Azure Blob 传输到 Azure SQL 数据库。我找到了这个链接:Copy data from Azure Blob to Azure SQL Dat
我已经实现了一个测试客户端/服务器,它通过 WCF 实现了 UserName 消息身份验证。它几乎一切正常,但我在最后一个障碍上倒下了。 我得到一个 InvalidOperationException
我不得不放弃基本的 WCF UserName/Pwd 安全性并实现我自己的自定义客户端凭据,以保存默认情况下提供的更多信息。 我通过了 this MSDN article ,但我错过了一些东西,因为它
我有一个 WCF web 服务托管在 IIS 中。这是相同的配置: 当我尝试在我的 WinForms 客户端中使用此特定服务(作为服务引用添加时)时,它会抛出此异常: The username is
我正在尝试在 Azure Functions 上使用新的 Microsoft Graph 绑定(bind)功能,因此我遵循 this article (使用clientCredentials): Az
我是一名优秀的程序员,十分优秀!