recentemente, ao analisar como configurar a autenticação usando provedores de login externos (por exemplo, Google, Facebook) com ASP.NET Core notei que https agora é um requisito para alguns deles.
outra coisa que notei foi o quão difícil era encontrar recursos sobre como habilitar HTTPS em ASP.NET Core.
esta postagem do blog é sobre o processo de criação de um ASP local.Site Net Core em execução com HTTPS sem erros no Chrome (mostrando o cadeado verde na barra de endereços) para o seu horário de desenvolvimento local. E então como você pode usar Nginx ou IIS quando estiver pronto para expô-lo ao mundo.
para usar HTTPS, precisamos de um certificado digital. Se você precisar gerar o seu próprio para usar no momento do desenvolvimento, recomendo usar o OpenSSL para criar certificados. Ele não apenas explica como você pode criar sua própria autoridade de certificação e certificados, mas também como você pode configurar seu navegador (Chrome ou Firefox) para confiar na Autoridade de certificação.
além disso, se você quiser entender qual é o papel dos certificados em HTTPS, dê uma olhada na breve explicação(ish) de como o https funciona.
de agora em diante, estou assumindo que você gerou sua autoridade de certificação, certificado e chave privada correspondente e você tem um .arquivo pfx (troca de informações pessoais).
criar um novo projeto
vou descrever o processo usando Visual Studio Code e Yeoman.
se você não está familiarizado com yeoman, é uma ferramenta de linha de comando que permite criar novos projetos a partir de uma lista de modelos de projeto. O gerador yeoman (esse é o nome do pacote para yeoman que contém os modelos) que usaremos é generator-aspnet. Para instalar yeoman você primeiro precisa npm e então você pode seguir as instruções para instalar yeoman e o ASP.NET modelos principais aqui.
o motivo do uso do Visual Studio Code e do yeoman é que esse processo funciona no Windows, Linux e macOS.
para usar yeoman com o ASP.NET modelos principais execute o seguinte comando:
$ yo aspnet _-----_ ╭──────────────────────────╮ | | │ Welcome to the │ |--(o)--| │ marvellous ASP.NET Core │`---------´ │ generator! │ ( _´U`_ ) ╰──────────────────────────╯ /___A___\ / | ~ | __'.___.'__ ´ ` |° ´ Y ` ? What type of application do you want to create? (Use arrow keys)❯ Empty Web Application Empty Web Application (F#) Console Application Console Application (F#) Web Application Web Application Basic Web Application Basic (F#)
selecione o aplicativo da Web vazio. Um projeto web simples será criado que só tem página com o texto “Hello World”.
se você estiver executando o Windows e tiver a versão completa do Visual Studio, basta fazer o arquivo – > Novo Projeto, selecione. Net Core, ASP.NET Core aplicação Web e, em seguida, selecione vazio.
configurando HTTPS para Kestrel
Kestrel é o servidor web que é usado por padrão com ASP.NET Core.
para adicionar suporte HTTPS ao Kestrel, adicione o pacote Microsoft.AspNetCore.Server.Kestrel.Https
como uma dependência.
se você estiver usando o project.json você pode fazer isso editando o projeto.seção “dependências” do json e adição:
"Microsoft.AspNetCore.Server.Kestrel.Https": "1.1.0"
o número da versão pode ser diferente para você, no entanto, deve ser o mesmo que o usado no Pacote Microsoft.AspNetCore.Server.Kestrel
.
Se você estiver usando .csproj
você pode adicionar a dependência executando:
dotnet add package Microsoft.AspNetCore.Server.Kestrel.Https
configuração do certificado
para configurar o Kestrel para usar nosso .arquivo pfx (certificado e chave privada), nós precisamos editar Program.cs
onde WebHostBuilder
está sendo criado e fazer algumas alterações:
var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel(options => { options.UseHttps("localhost.pfx", "password"); }) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseUrls("https://*:4430") .UseStartup<Startup>() .Build();
As alterações são:
.UseKestrel(options => { options.UseHttps("localhost.pfx", "password");})
Que é onde especificamos o que é .arquivo pfx que queremos usar e sua senha. UseHttps
é um método de extensão, se você receber um erro dizendo que não existe, é porque você não adicionou o pacote nuget Microsoft.AspNetCore.Server.Kestrel.Https
, que é onde ele mora.
também:
.UseUrls("https://*:4430")
que define onde o Kestrel estará ouvindo as conexões de entrada. Alternativamente, você pode usar https://localhost:4430
em vez de *
. Com *
no entanto, você pode usar qualquer nome de domínio, por exemplo, se você tiver este aplicativo da web em myDomain.com
ele ainda funcionaria, enquanto com localhost
, apenas solicitações para localhost
seriam atendidas.
caso você esteja se perguntando Por Que Eu não usei a porta HTTPS padrão, 443, isso é porque você precisa de permissões especiais no Linux para portas abaixo de 1024. No Windows, isso não seria um problema. No entanto, como fazer isso com o Kestrel só é recomendado quando você está no momento do desenvolvimento, não é um grande problema.
se você estiver tentando isso no Linux, macOS ou usando a linha de comando no Windows, você pode ligar para dotnet run
, abra o Chrome e vá para https://localhost:43000
e veja um ícone de cadeado verde.
Se você estiver usando o Visual Studio no Windows o modo de fazer isso é especificar que você deseja executar o aplicativo da web diretamente e não através do IIS Express:
Também selecione o navegador que você quiser experimentá-lo. Se você instalou o teste de certificado de raiz de autoridade de certificação em um navegador específico, utilize o navegador, por exemplo, o google Chrome (se você está confuso por esta declaração, eu recomendo que você leia o Brief(ish) explicação de como funciona o https e Usando o OpenSSL para Criar Certificados):
Finalmente, editar propriedades do projeto(clique com botão direito e selecione propriedades):
E altere a url lançamento:
usando ASP.NET Core com um proxy reverso
embora certamente seja possível servir um aplicativo da web usando ASP.NET Core usando apenas Kestrel, não é recomendado. Isso ocorre porque o Kestrel não é um servidor web com todos os recursos e ainda não possui alguns recursos de segurança.
mesmo que não seja recomendado, você pode apenas querer mostrar algo que você fez para alguém e pular a parte de instalar e configurar um servidor web. Com serviços como DigitalOcean ou Linode, você pode criar um VPS em muito pouco tempo e apenas ter seu ASP.NET núcleo disponível através de lá só tem que instalar. net core.
no entanto, se você quiser algo mais sério (e você provavelmente faz desde que você está aqui por causa de habilitar HTTPS) você deve usar um servidor web completo, como Nginx ou IIS (no Windows), como um proxy reverso para o seu ASP.NET Aplicação principal.
um servidor proxy reverso é um servidor web que aceita solicitações e as envia para outro servidor web que realmente cria as respostas para essas solicitações. As respostas são enviadas de volta para o servidor proxy que as encaminha para os clientes que emitiram as solicitações correspondentes.
Com Nginx atuando como um proxy reverso que seria algo parecido com isto:
Browser <----> Nginx <----> Kestrel
A coisa boa sobre essa configuração é que podemos aproveitar Nginx (ou IIS) é um servidor web completo e ativar HTTPS nele:
Browser <---- HTTPS ---> Nginx <---- HTTP ----> Kestrel
Então, não precisa nem configurar o Kestrel com HTTPS, apenas Nginx.
configurando HTTPS com Nginx
primeiro você precisa instalar o Nginx. Estou usando o Ubuntu 16.04 para isso, no entanto, você pode até instalá-lo no Windows.
se você estiver executando o Ubuntu, abra um terminal e digite
$ sudo apt-get install nginx
a próxima coisa que precisamos fazer é editar a configuração do Nginx. Mas antes de fazermos isso, é útil saber qual é a localização dos arquivos de configuração e como eles se tornam ativados. A pasta onde os arquivos de configuração são geralmente colocados é /etc/nginx/sites-available/
(este local pode ser diferente se você estiver usando uma distribuição Linux diferente).
o arquivo de configuração que está presente quando você instala o Nginx é nomeado default
.
para que uma configuração Nginx seja ativada, ela deve estar localizada na pasta /etc/nginx/sites-enabled
. Então, depois de criar um novo arquivo de configuração (em sites-available
), um link simbólico é criado em sites-enabled
que aponta para o novo arquivo.
Imagine que acabamos de criar um novo arquivo de configuração chamado my-site-https
em sites-available
. Depois disso, você iria para a pasta sites-enabled
e executaria o seguinte comando para criar um link simbólico:
$ ln -s /etc/nginx/sites-available/my-site-htts
para fazer o Nginx ler esta nova configuração, execute o comando:
$ sudo nginx -s reload
agora que sabemos como criar e habilitar configurações do Nginx, vamos criar o arquivo de configuração para configurar o Nginx como um proxy reverso para um ASP.NET aplicativo principal que está sendo executado em http://localhost:5000
.
Primeiro, crie um novo arquivo no /etc/nginx/sites-available
com o nome, por exemplo, aspnetcore
, com o seguinte conteúdo:
server { listen 443 ssl; ssl_certificate PATH_TO_CERTIFICATE/CERTIFICATE_NAME.pem; ssl_certificate_key PATH_TO_PRIVATE_KEY/PRIVATE_KEY.pem; location / { proxy_pass http://localhost:5000; }}
Aqui estamos configurar o Nginx para listen
para a porta 443 usando SSL (443 é o padrão para HTTPS). Seguinte estamos especificando o local onde o certificado (ssl_certificate
) e a chave privada (ssl_certificate_key
) estão localizados e, finalmente, estamos instruindo Nginx para encaminhar todas as solicitações (location /
irá corresponder a todas as solicitações) para http://localhost:5000
.Finalmente, crie o link simbólico para este arquivo em sites-enabled
(você pode excluir o link para o arquivo default
, isso não excluirá o arquivo original, pois é um link simbólico).
/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/aspnetcore
para fazer Nginx carregar esta configuração:
$ sudo nginx -s reload
se você tem o seu ASP.NET aplicativo principal em execução em http://localhost:5000
agora você deve ser capaz de abrir https://localhost
e vê-lo sendo servido por HTTPS.
há um problema comum que pode acontecer quando você recarrega a configuração do Nginx, ou seja, você recebe uma senha. Especificamente para a senha da chave privada. Isso pode não ser prático para você, por isso, se você deseja remover a senha da chave privada, você pode executar o seguinte comando:
$ openssl rsa -in privateKeyWithPassword.pem -out privateKeyWithoutPassword.pem
Outra coisa útil que você pode fazer com Nginx é para que todas as solicitações HTTP de ser redirecionado para HTTPS. Se você quiser habilitar isso, adicione esta configuração extra a você aspnetcore
arquivo de configuração Nginx:
server { listen 80; return 301 https://$host$request_uri;}
configurando Supervisor
uma coisa que devemos nos preocupar é que precisamos manter nosso ASP.NET execução do aplicativo da Web principal.
Existe uma ferramenta chamada supervisor que nos permite configurar que um aplicativo deve ser iniciado no momento da inicialização, e se ele falhar, ele deve ser levado de volta
Primeira coisa que precisa fazer é instalá-lo. Estou usando o Ubuntu 16.04 para isso, e nesta distribuição instalá-lo é muito simples:
$ sudo apt-get install supervisor
a próxima coisa que precisamos fazer é criar um arquivo de configuração do supervisor para nosso aplicativo da web. Vamos chamá-lo de aspnetcore.conf
e adicione-o para /etc/supervisor/conf.d
(você precisará fazer isso usando o sudo):
Coloque isso dentro do arquivo de configuração:
command=/usr/bin/dotnet PATH_TO_YOUR_PUBLISHED_PROJECT/YOURWEBAPP.dlldirectory=PATH_TO_YOUR_PUBLISHED_PROJECTautostart=trueautorestart=truestdout_logfile=/var/log/aspnetcore.out.logstderr_logfile=/var/log/aspnetcore.err.logenvironment=ASPNETCORE_ENVIRONMENT="Production"
A primeira linha define o nome (aspnetcore
), pelo qual podemos nos referir ao aplicativo web no supervisor.
a linha com command
define o comando a ser executado. Nesse caso, é dotnet
seguido pela dll do seu aplicativo da web. Isso é equivalente a executar dotnet run
na raiz do seu projeto.
a próxima linha (directory=
) define o diretório de trabalho como aquele em que seu projeto está localizado.
autostart=true
significa que o aplicativo será iniciado no momento da inicialização.
autorestart=true
significa que o aplicativo será reiniciado se travar ou mesmo se for interrompido (por exemplo, usando kill
). Se você quiser que seu aplicativo seja reiniciado apenas em caso de falha, altere-o para autorestart=unexpected
.
as próximas duas linhas definem para quais arquivos a saída padrão e de erro são gravados, respectivamente.
finalmente environment
nos permite definir variáveis de ambiente, neste caso estamos definindo ASPNETCORE_ENVIRONMENT=Production
.
para habilitar este novo arquivo de configuração, execute os seguintes comandos:
$ sudo supervisorctl reread$ sudo supervisorctl update
Você pode verificar o status dos processos em execução em supervisor executando
$ sudo supervisorctl
deve aparecer algo semelhante a:
aspnetcore EXECUÇÃO pid 18817, tempo de 0:05:29
supervisor>
Há mais diversos comandos que você pode usar para gerenciar os processos em supervisor, digite help
para obter uma lista dos comandos disponíveis. Para sair, basta digitar quit
.
configurando HTTPS com IIS
o primeiro passo para habilitar HTTPS ao usar o IIS é instalar nosso certificado e chave privada (usando um .arquivo pfx que contém ambos).
Abra o Gerenciador do IIS e selecione Certificados de Servidor
Clique em importar certificado:
Selecione o .arquivo pfx e digite a senha correspondente, deixe a loja como pessoal:
Antes de continuar, é importante mencionar que você precisa ter o ASP.NET módulo do núcleo instalado. É muito provável que você já o faça, pois ele está instalado para você ao instalar o.Net Core SDK.
no entanto, caso não seja (você pode verificá-lo no IIS Manager abrindo módulos e verificar se AspNetCoreModule está listado lá), você pode encontrar instruções de instalação aqui e um link direto para o download do ASP.NET pacote de hospedagem de servidor principal aqui.
o que este módulo faz é iniciar o seu ASP.NET site principal e mantê-lo em execução (reiniciando-o se ele falhar). Este módulo também é responsável por encaminhar as solicitações HTTP para o seu aplicativo da web e, em seguida, encaminhar as respostas de volta para o cliente.
uma coisa importante a saber sobre o AspNetCoreModule é que ele é configurado pelo Arquivo web.config
na raiz do seu projeto. Você precisa executar dotnet publish
em seu projeto para obter web.config
configuração corretamente em sua pasta de publicação.
o próximo passo é criar um novo Pool de aplicativos e selecionar nenhum código gerenciado como a versão.net CLR. Normalmente, os sites são executados dentro de um processo de trabalho do IIS, mas no. NET Core eles são executados como um processo separado, portanto, não há necessidade de um tempo de execução. Net no pool de aplicativos:
finalmente, vamos criar um novo site dentro do IIS para o nosso ASP.NET Aplicação principal. Precisamos selecione o pool de aplicativos que acabamos de criar, selecione o Caminho Físico o caminho para o site de publicação, selecione HTTPS como a vinculação e o nosso certificado SSL certificado pendente:
Você deve agora ser capaz de usar https para navegar para a ASP.NET central do aplicativo.