pac*_*nbw 1 c# authentication iis x509certificate visual-studio
我已经看过这些问题及其答案:
尝试加载证书的私钥时出现“指定的提供程序类型无效”CryptographicException
如何创建客户端证书以通过 SSL 进行双向身份验证的本地测试?
第二个问题引用的这个博客。
我怀疑证书颁发者有问题,但我可能是错的。
前言
我是身份验证的新手(你可以把它读成白痴)。当前项目是将用 Visual Studio 2013 .Net 4.5.1 编写的现有网站和 Web 应用程序升级到 Visual Studio 2017 2017 .Net 版本 4.6.1,以满足新消息代理的要求。
环境
Windows 10
Visual Studio 2017 (15.8.1)
IIS 10
Microsoft SQL Server 2017
问题描述
用C#编写的web服务器在认证过程中抛出这个错误
{"IDX10614: AsymmetricSecurityKey.GetSignatureFormater( 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256' ) threw an exception.
Key:
'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'\nSignatureAlgorithm: 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', check to make sure the SignatureAlgorithm is supported.\nException:'System.Security.Cryptography.CryptographicException: Invalid provider type specified.
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)\r\n at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.get_PrivateKey()\r\n at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetSignatureFormatter(String algorithm)
at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)'.
If you only need to verify signatures the parameter 'willBeUseForSigning' should be false if the private key is not be available."}
Run Code Online (Sandbox Code Playgroud)
采取的步骤
最初没有要检查的证书,因此产生了不同的错误。
在以管理员身份运行的 PowerShell 中
New-SelfSignedCertificate -Subject "CN= XxxxxxxXXCA" -DnsName "localhost" -FriendlyName "XxxxxxxXXCA" -KeyUsage DigitalSignature -KeyUsageProperty ALL -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My"
启动 MMC
将创建的证书复制到本地机器个人
将证书复制到本地机器受信任的根证书颁发机构
将证书复制到本地机器受信任的发布者
在 IIS 中启动网站
在 Visual Studio 2017 中运行 Web 服务器
使用高级 REST 客户端 (ARC) 从客户端向服务器发送登录请求。
在下面的代码中演练 Visual Studio 2017 调试器中的身份验证代码:
在 return 语句中抛出异常。
public string GenerateToken(string email)
{
X509Store store = new X509Store(StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates;
X509Certificate2 signingCert =
certs.Cast<X509Certificate2>().FirstOrDefault(cert => cert.FriendlyName == "XxxxxxxXXCA");
SigningCredentials signingCredentials = new X509SigningCredentials(signingCert);
var tokenHandler = new JwtSecurityTokenHandler();
var now = DateTime.UtcNow;
var customer = _customerService.GetCustomerByEmail(email);
var emailClaim = new Claim(ClaimTypes.Email, customer.Email, ClaimValueTypes.String);
var userIdClaim = new Claim(ClaimTypes.NameIdentifier, customer.Id.ToString(), ClaimValueTypes.Integer);
var roleClaim = new Claim(ClaimTypes.Role, "customer", ClaimValueTypes.String);
var claimsList = new List<Claim> { emailClaim, userIdClaim, roleClaim };
var tokenDescriptor = new SecurityTokenDescriptor()
{
AppliesToAddress = "http://localhost/api",
SigningCredentials = signingCredentials,
TokenIssuerName = "http://localhost",
Lifetime = new Lifetime(now, now.AddDays(30)),
//Lifetime = new Lifetime(now, now.AddDays(1)),
Subject = new ClaimsIdentity(claimsList)
};
store.Close();
return tokenHandler.WriteToken(tokenHandler.CreateToken(tokenDescriptor));
}
Run Code Online (Sandbox Code Playgroud)
New-SelfSignedCertificate默认情况下,cmdlet 使用密钥存储提供程序。大多数 .NET Framework(X509Certificate2特别是)不支持 CNG 密钥。其结果是,当您创建X509Certificate2从存储在CNG私钥证书情况下,get在访问PrivateKey属性抛出异常:
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
Run Code Online (Sandbox Code Playgroud)
我相信,您不拥有调用 getter on 的代码PrivateKey,因此,您需要通过-Provider在New-SelfSignedCertificatecmdlet 调用的参数中显式提供旧提供程序名称来重新创建您的证书。例如,您可以使用microsoft enhanced rsa and aes cryptographic providerprovider 作为参数值。
| 归档时间: |
|
| 查看次数: |
5730 次 |
| 最近记录: |