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

时间:2017-03-21 09:37:14

标签: c# openid identityserver3 client-certificates self-signed

我使用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 root签名权限" 具有所有预期用途,并且安装在 Trusted Root Certification Authorities

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

enter image description here

enter image description here

客户端证书快照:" CN = Bala客户端"

enter image description here enter image description here

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

请查看快照:

enter image description here

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

new Client
{
    ClientName = "Client Credentials Flow Client With Certificate",
    Enabled = true,
    ClientId = "cc.WithCertificate",
    Flow = Flows.ClientCredentials,

    ClientSecrets = new List<Secret>
        {
            new Secret
            {
                Value = "83021C2C20096FFD8415A353E471FF1BD39ECA4E",
                Type = Constants.SecretTypes.X509CertificateThumbprint,
                Description = "Client Certificate"
            },
        },

    AllowedScopes = new List<string>
        {
            "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;

响应对象的快照:

enter image description here

执行代码后,我收到错误状态代码的响应:response.Error ="Forbidden"

我按照上一个问题response.Error "Forbidden" in IdentityServer3 Flows.ClientCredentials

中提到的所有请求设置进行了跟踪

请帮助我使用 Self Signed Certificate 对应用程序进行身份验证。

1 个答案:

答案 0 :(得分:2)

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

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

场景#1

enter image description here

场景#2

enter image description here

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

  • 根CA证书=&gt;所有目的或服务器身份验证和客户端身份验证的组合
  • 服务器证书=&gt;仅服务器身份验证目的
  • 客户证书=&gt;只有客户
  

注意:有关预期用途的更多信息,请参阅   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导入受信任的根证书颁发机构证书存储区

导入证书颁发机构&#34; CN=Token Root CA&#34;

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

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

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

enter image description here

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

enter image description here

enter image description here

Identity Server项目: 请使用服务器证书 "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

enter image description here