Como gerar certificados PKI (SSL/TLS) assinados gratuitamente para o Elipse Alarm Manager

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

  1. Abra o PowerShell

  2. 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

  3. Carregue o ACMESharp para o PowerShell para que você possa executar os comandos abaixo.
    3.1. Import-Module ACMESharp

  4. Inicialize o cofre onde serão armazenados seus certificados e os itens relacionados a eles.
    4.1. Initialize-ACMEVault

  5. 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).

  6. 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. O dns1 serve para identificar este envio nos comandos seguintes.

  7. 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.

  8. 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

  9. 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 estiver valid é porque ocorreu tudo bem, pending é porque está em processo de validação e invalid é porque sua validação falhou, portanto, verifique se você fez o passo 7 corretamente.

  10. 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

  11. 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.

  1. Exportar a private key.
    1.1. Get-ACMECertificate cert1 -ExportKeyPEM "path\to\privkey.pem"
  2. Exportar o CSR.
    2.1. Get-ACMECertificate cert1 -ExportCsrPEM "path\to\cert.csr.pem"
  3. Exportar certificado público assinado pelo Let’s Encrypt.
    3.1. Get-ACMECertificate cert1 -ExportCertificatePEM "path\to\cert.pem" -ExportCertificateDER "path\to\cert.crt"
  4. 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
  5. 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'
  6. Gerar o fullchain.pem que é utilizado por diversos servidores incluindo o Nginx utilizado pelo Elipse Alarm Manager.
    6.1. Crie um arquivo com o nome fullchain.pem no diretório que você estava exportando os outros itens acima.
    6.2. Copie o conteúdo de cert.pem e cole dentro de fullchain.pem.
    6.3. Na linha abaixo do conteúdo de cert.pem dentro de fullchain.pem, copie e cole e conteúdo de chain.pem.
    6.4. Salve o arquivo fullchain.pem.

Ativando sua conexão segura

  1. 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.

  2. Estando na pasta do Elipse Alarm Manager vá até \Bin\Site\conf e abra o arquivo nginx.conf em modo de administrador.

  3. 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