我使用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签名权限"
客户端证书快照:" CN = Bala客户端"
客户证书有一个ThumbPrint:"83021C2C20096FFD8415A353E471FF1BD39ECA4E"
请查看快照:
我在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;
响应对象的快照:
执行代码后,我收到错误状态代码的响应:response.Error ="Forbidden"
我按照上一个问题response.Error "Forbidden" in IdentityServer3 Flows.ClientCredentials
中提到的所有请求设置进行了跟踪请帮助我使用 Self Signed Certificate
对应用程序进行身份验证。
答案 0 :(得分:2)
经过长时间的努力,我找到了解决这个问题的解决方案(自签名证书)。有一种方法可以使用Identity Server中的自签名证书,根据客户端证书对用户进行身份验证。
在Identity Server中,我们使用证书生成令牌(默认情况下我们使用idsrv3test.pfx
),在客户端应用程序中,我们使用证书Client.pfx
(默认情况下)。我研究了这背后的逻辑,我发现解决方案这两个证书有一个共同的发行人&#34; DevRoot &#34;。仅当DevRoot位于受信任的根证书颁发机构时,Identity Server才会根据客户端证书返回令牌,否则 IIS不应允许该请求并返回状态码403 Forbidden
场景#1 :
场景#2 :
我遵循相同的逻辑,我创建了根CA证书。此外,我创建了服务器和客户端证书,并使用根CA证书(即Parent)映射了这些证书。证书应具有以下目的
注意:有关预期用途的更多信息,请参阅 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
文件(确保一次)
上述命令将创建所有必需的Identity Server证书
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