Para proteger a tramitação de dados entre os programas cliente e o servidor do Elipse Alarm Manager, é altamente recomendado o uso de certificados de segurança PKI (SSL/TLS) principalmente quando a comunicação estiver sendo realizada pela Internet.
O Let’s Encrypt é uma CA (Certificate Authority) livre, automatizada e aberta, com patrocinadores (na data de publicação deste post) como Mozilla, Cisco, Facebook, Akamai, EFF, Chrome, entre diversas outros. É uma excelente forma de proteger gratuitamente projetos web.
Existem alguns projetos para a geração e assinatura de certificados pela Let’s Encrypt, mas neste post estaremos falando especificamente do ACMESharp, uma biblioteca e cliente .NET para o protocolo ACME (Automated Certificate Management Environment) que você pode utilizar em ambiente Windows através do PowerShell e sem necessidade do IIS (Internet Information Services).
Passo a passo com ACMESharp
-
Abra o PowerShell
-
Instale o ACMESharp através do PowerShell Gallery com o comando 2.1. ou 2.2. caso ocorra um conflito:
2.1.Install-Module -Name ACMESharp
2.2.Install-Module -Name ACMESharp -AllowClobber
-
Carregue o ACMESharp para o PowerShell para que você possa executar os comandos abaixo.
3.1.Import-Module ACMESharp
-
Inicialize o cofre onde serão armazenados seus certificados e os itens relacionados a eles.
4.1.Initialize-ACMEVault
-
Crie a conta que será notificada pelo Let’s Encrypt para a renovação do certificado.
5.1.New-ACMERegistration -Contacts mailto:seuemail@seudominio.com.br -AcceptTos
5.2. O-AcceptTos
significa que você aceita os Terms-of-Service (TOS). -
Envie o nome de DNS que você deseja tornar seguro com o certificado PKI.
6.1.New-ACMEIdentifier -Dns example.com -Alias dns1
6.2. Odns1
serve para identificar este envio nos comandos seguintes. -
Escolha o método para validar que você é proprietário do domínio. Você pode optar por validar por HTTP ou por DNS.
7.1. Validação por HTTP
7.1.1.Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler manual
7.1.2. O output será uma orientação sobre qual arquivo criar em seu host do http server. Portanto, crie o arquivo e coloque o conteúdo indicado.
7.2. Validação por DNS
7.2.1.Complete-ACMEChallenge dns1 -ChallengeType dns-01 -Handler manual
7.2.2. O output será uma orientação sobre qual registro TXT e respectivo valor você deve adiciona em seu DNS. -
Envie para o servidor a solicitação para que ele revise a sua propriedade do domínio.
8.1. Envio da validação HTTP
8.1.1.Submit-ACMEChallenge dns1 -ChallengeType http-01
8.2. Envio da validação DNS
8.2.1.Submit-ACMEChallenge dns1 -ChallengeType dns-01
-
Verifique se sua solicitação já foi validada.
9.1.(Update-ACMEIdentifier dns1 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}
9.2. Esse comando retorna o status de sua solicitação. Se no campo estivervalid
é porque ocorreu tudo bem,pending
é porque está em processo de validação einvalid
é porque sua validação falhou, portanto, verifique se você fez o passo 7 corretamente. -
Gere a solicitação de assinatura de certificado (CSR).
10.1. Se você for solicitar para um domínio.
10.1.1.New-ACMECertificate dns1 -Generate -Alias cert1
10.2. Se você for solicitar para múltiplos domínios (SAN - Subject Alternative Names).
10.2.New-ACMECertificate dns1 -Generate -AlternativeIdentifierRefs dns2,dns3,dns4 -Alias multiNameCert
-
Envie a CSR.
11.1.Submit-ACMECertificate cert1
Pronto!
Obtendo os arquivos gerados pelo ACMESharp
Para exportar os arquivos e você poder utilizá-los. Utilize os comandos abaixo, mas observe que você não precisa exportar todos os arquivos. Listamos abaixo todos apenas para seu conhecimento, para o EAM utilizamos os arquivos para Nginx que são apenas os arquivos com extensão .pem.
- Exportar a private key.
1.1.Get-ACMECertificate cert1 -ExportKeyPEM "path\to\privkey.pem"
- Exportar o CSR.
2.1.Get-ACMECertificate cert1 -ExportCsrPEM "path\to\cert.csr.pem"
- Exportar certificado público assinado pelo Let’s Encrypt.
3.1.Get-ACMECertificate cert1 -ExportCertificatePEM "path\to\cert.pem" -ExportCertificateDER "path\to\cert.crt"
- Exportar o certificado intermediário da CA.
4.1.Get-ACMECertificate cert1 -ExportIssuerPEM "path\to\chain.pem" -ExportIssuerDER "path\to\chain.crt"
4.2. Caso ocorra o erro “no issuer certificates found”, execute:Update-ACMECertificate cert1
- Exportar o arquivo PKCS#12 (PFX, utilizado pelo Windows e IIS).
5.1.Get-ACMECertificate cert1 -ExportPkcs12 "path\to\cert.pfx"
5.2.Get-ACMECertificate cert1 -ExportPkcs12 "path\to\cert.pfx" -CertificatePassword 'g1Bb3Ri$h'
- Gerar o fullchain.pem que é utilizado por diversos servidores incluindo o Nginx utilizado pelo Elipse Alarm Manager.
6.1. Crie um arquivo com o nomefullchain.pem
no diretório que você estava exportando os outros itens acima.
6.2. Copie o conteúdo decert.pem
e cole dentro defullchain.pem
.
6.3. Na linha abaixo do conteúdo decert.pem
dentro defullchain.pem
, copie e cole e conteúdo dechain.pem
.
6.4. Salve o arquivofullchain.pem
.
Ativando sua conexão segura
-
Navegue até a pasta de instalação do seu Elipse Alarm Manager, geralmente localizada em
C:\Program Files (x86)\Elipse Software\Elipse Alarm Manager Server
. -
Estando na pasta do Elipse Alarm Manager vá até
\Bin\Site\conf
e abra o arquivonginx.conf
em modo de administrador. -
Substitua o conteúdo de
nginx.conf
pelo conteúdo abaixo:user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen 443; server_name example.com; root html; ssl on; ssl_certificate path\to\fullchain.pem; ssl_certificate_key path\to\privkey.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location /api { add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "*"; add_header Access-Control-Allow-Headers "Content-Type"; if ($request_method = OPTIONS) { return 200; } proxy_http_version 1.1; proxy_pass http://localhost:8091; } location / { try_files $uri $uri/ /index.html?$args; } } server { listen 80; server_name example.com; return 301 https://example.com$request_uri; } }
OBSERVAÇÃO: Você deve substituir no conteúdo acima o path\to\
pelo caminho que você havia definido e também deve substituir o example.com
pelo seu domínio do qual você solicitou o certificado.
Referências
- ACMESharp (https://github.com/ebekker/ACMESharp)