处理Identity Server客户端凭据流时在自签名客户端证书中出现问题

我使用MakeCert.exe为我的内部开发目的创建了自签名证书

步骤1 :我使用以下命令创建了根CA.

makecert -n "CN=Bala root signing authority" -cy authority -r -sv root.pvk root.cer 

步骤2 :使用以下命令安装在步骤#1中创建的根CA证书

 certutil -user -addstore Root root.cer 

步骤3 :我使用以下命令创建了客户端证书

 makecert -pe -n "CN=Bala Client" -a sha1 -cy end ^ -sky signature ^ -ic root.cer -iv root1.pvk ^ -sv Bala.pvk Bala.cer 

步骤#4 :我使用以下命令为相应的客户端证书创建了一个.pfx文件

 pvk2pfx -pvk Bala.pvk -spc Bala.cer -pfx Bala.pfx 

根CA即“CN = Bala根签名机构”具有所有预期目的,并且安装在Trusted Root Certification Authorities

根CA证书快照 :“CN = Bala root签名权限”

在此处输入图像描述

在此处输入图像描述

客户端证书快照 :“CN = Bala Client”

在此处输入图像描述 在此处输入图像描述

客户证书有一个ThumbPrint: "83021C2C20096FFD8415A353E471FF1BD39ECA4E"

请看快照:

在此处输入图像描述

我在IdentityServer3中有一个客户端,我使用了相同的指纹"83021C2C20096FFD8415A353E471FF1BD39ECA4E"

 new Client { ClientName = "Client Credentials Flow Client With Certificate", Enabled = true, ClientId = "cc.WithCertificate", Flow = Flows.ClientCredentials, ClientSecrets = new List { new Secret { Value = "83021C2C20096FFD8415A353E471FF1BD39ECA4E", Type = Constants.SecretTypes.X509CertificateThumbprint, Description = "Client Certificate" }, }, AllowedScopes = new List { "read" } } 

客户端控制台应用程序代码是

 var cert = new X509Certificate2(@"Bala.pfx"); var handler = new WebRequestHandler(); handler.ClientCertificates.Add(cert); string tokenEndPoint = ConfigurationManager.AppSettings["TokenEndpoint"]; var client = new TokenClient( tokenEndPoint, "cc.WithCertificate", handler); // Calling the Token Service var response = client.RequestClientCredentialsAsync("read").Result; 

响应对象的快照:

在此处输入图像描述

一旦我执行代码,我就会收到错误状态代码的response.Error ="Forbidden"response.Error ="Forbidden"

我遵循了上一个问题response.Error中的所有per-requesite设置。 在IdentityServer3 Flows.ClientCredentials中出现“Forbidden”错误

请帮助我如何使用Self Signed Certificatevalidation应用程序。

经过长时间的斗争,我找到了这个问题的解决方案(自签名证书)。 有一种方法可以在Identity Server中使用自签名证书,根据客户端证书对用户进行身份validation。

在Identity Server中,我们使用证书生成令牌(默认情况下我们使用的是idsrv3test.pfx ),而在客户端应用程序中,我们使用的是证书Client.pfx (默认情况下)。 我研究了这背后的逻辑,我发现解决方案这两个证书有一个共同的Issuer“ DevRoot ”。 仅当DevRoot位于受信任的根证书颁发机构中时,Identity Server才会根据客户端证书返回令牌,否则IIS不应允许该请求并返回状态码403 Forbidden

场景#1

在此处输入图像描述

场景#2

在此处输入图像描述

我遵循相同的逻辑,我创建了根CA证书。 此外,我创建了服务器和客户端证书,并使用根CA证书(即父级)映射了这些证书。 证书应具有以下目的

  • 根CA证书=>所有目的或服务器身份validation和客户端身份validation的组合
  • 服务器证书=>仅服务器validation目的
  • 客户证书=>仅客户

注意 :有关预期目的的更多信息,请参阅http://www.alvestrand.no/objectid/1.3.6.1.5.5.7.3.html

服务器和客户端证书应为.pfx文件格式 。 让我们看看如何创建所述证书

在执行以下命令之前,请确保系统中存在先决条件工具

步骤1

我们需要创建CA,服务和客户端的证书以及私钥

证书颁发机构

 makecert -r -pe -n "CN=Token Root CA" -sr LocalMachine -a sha1 -sky signature -cy authority -sv "D:\Certificate\IDRootCA.pvk" "D:\Certificate\IDRootCA.cer" 

服务器证书

 makecert -pe -n "CN=Server - Token Identity" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic "D:\Certificate\IDRootCA.cer" -iv "D:\Certificate\IDRootCA.pvk" -sv "D:\Certificate\IDServer.pvk" "D:\Certificate\IDServer.cer" 

客户证书

 makecert -pe -n "CN=Client - Token Identity" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.2 -ic "D:\Certificate\IDRootCA.cer" -iv "D:\Certificate\IDRootCA.pvk" -sv "D:\Certificate\IDClient.pvk" "D:\Certificate\IDClient.cer" 

第2步

我们需要导出PFX的服务和客户端证书文件

服务证书 (PFX格式)

 pvk2pfx -pvk "D:\Certificate\IDServer.pvk" -spc "D:\Certificate\IDServer.cer" -pfx "D:\Certificate\IDServer.pfx" 

客户证书 (PFX格式)

 pvk2pfx -pvk "D:\Certificate\IDClient.pvk" -spc "D:\Certificate\IDClient.cer" -pfx "D:\Certificate\IDClient.pfx" 

步骤:#3

我们需要将CA导入受信任的根证书颁发机构证书存储区

导入证书颁发机构CN=Token Root CA

 certutil -user -addstore Root "D:\Certificate\IDRootCA.cer" 

注意 :这里我只为当前用户“-user”导入证书。 有关更多详细信息,请参阅http://certificate.fyicenter.com/685_Microsoft_CertUtil_Microsoft_certutil_-user_Certificate_St.html

在管理员模式下使用命令提示符执行上述所有命令,并将路径导航到“ C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin ”。 所述路径应包含MakeCert.exe文件(确保一次)

在此处输入图像描述

上述命令将创建所有必需的Identity Server证书

在此处输入图像描述

在此处输入图像描述

Identity Server Project:请使用服务器证书"IDServer.pfx"而不是"idsrv3test.pfx"并在Certificates.cs和Web.config中进行更改。

注意 :此自签名证书不需要私钥

最后是客户端控制台应用程序代码

 var cert = new X509Certificate2(@"IDClient.pfx"); var handler = new WebRequestHandler(); handler.ClientCertificates.Add(cert); string tokenEndPoint = ConfigurationManager.AppSettings["TokenEndpoint"]; var client = new TokenClient( tokenEndPoint, "cc.WithCertificate", handler); // Calling the Token Service var response = client.RequestClientCredentialsAsync("read").Result; 

最后,我成功获得了Access Token

在此处输入图像描述