JwtSecurityTokenHandler
을 X509Certificate2
과 함께 사용할 수 있도록 관리했습니다. 나는 X509Certificate2
객체로 토큰에 서명 할 수있었습니다. X509Certificate2.RawData
속성을 통해 인증서의 원시 데이터를 사용하여 토큰의 유효성을 검사 할 수도있었습니다. 여기 X509Certificate2 (JwtSecurityTokenHandler)를 사용하여 JWT 보안
class Program
{
static void Main(string[] args)
{
X509Store store = new X509Store("My");
store.Open(OpenFlags.ReadOnly);
X509Certificate2 signingCert = store.Certificates[0];
string token = CreateTokenWithX509SigningCredentials(signingCert);
ClaimsPrincipal principal = ValidateTokenWithX509SecurityToken(
new X509RawDataKeyIdentifierClause(signingCert.RawData), token);
}
static string CreateTokenWithX509SigningCredentials(X509Certificate2 signingCert)
{
var now = DateTime.UtcNow;
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, "Tugberk"),
new Claim(ClaimTypes.Role, "Sales"),
}),
TokenIssuerName = "self",
AppliesToAddress = "http://www.example.com",
Lifetime = new Lifetime(now, now.AddMinutes(2)),
SigningCredentials = new X509SigningCredentials(signingCert)
};
SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
string tokenString = tokenHandler.WriteToken(token);
return tokenString;
}
static ClaimsPrincipal ValidateTokenWithX509SecurityToken(X509RawDataKeyIdentifierClause x509DataClause, string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var x509SecurityToken = new X509SecurityToken(new X509Certificate2(x509DataClause.GetX509RawData()));
var validationParameters = new TokenValidationParameters()
{
AllowedAudience = "http://www.example.com",
SigningToken = x509SecurityToken,
ValidIssuer = "self",
};
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(
new JwtSecurityToken(token), validationParameters);
return claimsPrincipal;
}
}
내 주요 질문은 모두 내 X509Certificate2
에서 세계에 노출해야하는지에 관한 것입니다. X509Certificate2의 어느 부분을 공개해야합니까? 소비자는 JWT 토큰을 확인해야합니다. 그러나 은 동일한 인증서를 사용하여 새 토큰을 만들 수 없습니다?
감사합니다. 나는 X509Certiicate2.RawData를 공개하려고 생각하고 있었고 개인 키가 포함되어 있지 않다고 가정합니다. 내가 맞습니까? 다른 인증서의 RawDate를 전달하여 새 X509Certiicate2 개체를 만들 때 새로운 인증서에 토큰에 서명하는 데 사용되는 개인 키가 있다는 것을 알 수 없습니다. – tugberk
예. 'RawData'는 base64로 인코딩 된 X509 인증서 데이터입니다. 여기에 표시된대로 인증서를 내보내는 것과 동일합니다! [] (http://puu.sh/3SFr4.png). 차이점은 RawData는'---- BEGIN/END CERT ... '헤더와 crlf를 포함하지 않는다는 것입니다. 그런데 사용 사례는 무엇입니까? 크로스 플랫폼에서 작동하는 것을 원한다면 소비자에게 헤더와 crlf를 포함하여 인 코드 된 코드를 제공 할 것을 제안합니다. – woloski