Geração de Certificados Autoassinados para IdentityServer4

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.

Tags: IdentityServer4 .NET Core openssl jwt Certificados

Publicado em 6-6 00:13 por Thomas