O IdentityServer4 utiliza por padrão o algoritmo RSA256 para assinar JWTs (JSON Web Tokens), empregando criptografia assimétrica. Em ambientes de produção, é crucial empregar um certificado fixo para assinatura e validação, garantindo que os tokens permaneçam válidos mesmo após reinicializações do servidor. Isso evita o uso de certificados temporários, como os gerados localmente e descartados.
A criação de certificados é realizada com a ferramenta OpenSSL. Se você estiver no Windows e tiver o Git instalado, o OpenSSL já está incluído. Basta adicionar o diretório bin do Git à variável de ambiente PATH para utilizá-lo diretamente. Em uma instalação padrão no Windows 7, o caminho pode ser:
C:\Program Files\Git\usr\bin
1. Geração do Arquivo de Chave Privada (private.key)
Utilize o comando abaixo para gerar uma chave privada RSA de 2048 bits:
openssl genrsa -out private.key 2048
2. Criação do Pedido de Assinatura de Certificado (CSR - signrequest.csr)
Este arquivo é submetido a uma Autoridade Certificadora (CA) para que o certificado seja assinado. No caso de autoassinatura, ele contém as informações do solicitante e a chave pública que será usada para gerar o certificado.
openssl req -new -key private.key -out signrequest.csr
Você será solicitado a fornecer informações como País, Estado, Organização, etc.
3. Geração do Certifiacdo Autoassinado (idsrv4.crt)
Com o CSR e a chave privada, crie um certificado autoassinado com validade de 365 dias. Este certificado conterá as informações do titular, a chave pública e a assinatura digital.
openssl x509 -req -days 365 -in signrequest.csr -signkey private.key -out idsrv4.crt
4. Combinação do Certificado e Chave Privada (idsrv4.pfx)
Para fins de segurança e praticidade, combine o certificado público (.crt) e a chave privada (.key) em um único arquivo .pfx. Este formato permite a proteção por senha.
openssl pkcs12 -export -in idsrv4.crt -inkey private.key -out idsrv4.pfx
Durante a execução deste comando, você será solicitado a definir uma senha de exportação para proteger o arquivo .pfx.
Ao final destes passos, você terá quatro arquivos gerados. O arquivo idsrv4.pfx é o que será utiliazdo pela sua aplicação.
Salve o arquivo idsrv4.pfx em um local acessível dentro da estrutura do seu projeto.
Configuração no appsettings.json
Adicione as informações do certificado e sua senha ao arquivo de configuração appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "..."
},
"Certificates": {
"CerPath": "Certificate\\idsrv4.pfx",
"Password": "!1password"
},
// ... outras configurações
}
Registro do Certificado no Startup.cs
No arquivo Startup.cs, configure o IdentityServer4 para utilizar o certificado especiifcado:
using Microsoft.Extensions.Hosting; // Para HostingEnvironment
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.IO;
using IdentityServer4.Services; // Necessário para AddSigningCredential
// ...
public void ConfigureServices(IServiceCollection services)
{
var configuration = services.BuildServiceProvider().GetRequiredService<iconfiguration>();
var hostingEnvironment = services.BuildServiceProvider().GetRequiredService<iwebhostenvironment>();
var cerFilePath = Path.Combine(hostingEnvironment.ContentRootPath, configuration["Certificates:CerPath"]);
services.AddIdentityServer()
.AddSigningCredential(
new X509Certificate2(
cerFilePath,
configuration["Certificates:Password"]
)
);
// ... outros serviços
}
</iwebhostenvironment></iconfiguration>
Testando com Postman
Após iniciar o IdentityServer4 com a configuração do certificado, você pode testar a emissão de tokens utilizando ferramentas como o Postman.
Configure uma requisição POST para o endpoint /connect/token com os parâmetros apropriados:
POST /connect/token HTTP/1.1
Host: localhost:5000
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
client_id=pwdClient&client_secret=superSecretPassword&grant_type=password&scope=smsAPI.send&username=demo@qq.com&password=!1Demo
A resposta conterá um token de acesso:
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjBBODE1Rjg2RENENzJDNjJCOTVDQjkxQkIwNDk1MTY5QTNERTNDQkQiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJDb0ZmaHR6WExHSzVYTGtic0VsUmFhUGVQTDAifQ.eyJuYmYiOjE1NDY1OTM1NzMsImV4cCI6MTU0NjU5NzE3MywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjpbImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9yZXNvdXJjZXMiLCJzbXNBUEkiXSwiY2xpZW50X2lkIjoicHdkQ2xpZW50Iiwic3ViIjoiOTk3ZDI3NWItZTE2ZC00MTlkLThlMTUtOWZiMGY4NjNkYzM4IiwiYXV0aF90aW1lIjoxNTQ2NTkzNTczLCJpZHAiOiJsb2NhbCIsInNjb3BlIjpbInNtc0FQSS5zZW5kIl0sImFtciI6WyJwd2QiXX0.oDSqYCml3s8g6yE8XHbemo0o8ZwJBiF0RFUgR557sM3fEWDN4XLtOab33aVr9e-1bKGRQ0S0SRC1CZUmZZ1amYC4ARFOXCuOSiVBKdvzQPv1Hte0kEaO4NndLKe0p2vu9jBiVaG_sYJXTw2CKwkkSpOhvnwb3_hpoI6lQfjrcI_-CDqvqck4lKNcj3DthBPCFoZwU2QrP5Yxd13NkewN_WuCprScvq79kdfCAp_27z3hPPHMm5NVjz5Z5ViQmX0AhYD8aiQIBoaDhkFEDYC2V5bjWxxhsgBq6gGXz0WRxd0XWmcpLkvofxLM4q4aOKSvKxwRR_KzdXEb66Va5vdeCQ",
"expires_in": 3600,
"token_type": "Bearer"
}
Para validar o token, copie o valor do campo access_token e cole-o em uma ferramenta online como jwt.io. Em seguida, cole o conteúdo do arquivo idsrv4.crt (que contém a chave pública) no campo apropriado para verificação.