Servicio en idioma Dart: nombre de dominio, SSL

Tabla de contenido
  1. 1.
  2. 2. Backend
  3. 2.1. .
  4. 2.2. . SSL ( )
  5. 2.3. .
  6. ...
  7. 3. Web
  8. 3.1. “Under construction”
  9. ...
  10. 4. Mobile
  11. ...




descargo de responsabilidad (según los comentarios al artículo anterior)
  • . .
  • , : .
  • , , , K8s, AWS, GKE . , . , , «», .
  • , : , .
  • . . , .
    • Dependency injection ( boilerplate)
    • ORM. .
    • oAuth2 + JWT . .
    • Deeplinks (Universal links/ App links). web/app
    • (websockets)
    • flutter






Nombre de dominio



La última vez que terminamos con eso en el contenedor de la ventana acoplable, se lanzó un servidor web NGINX, que distribuía el archivo index.html estático. Esta vez ampliaremos la funcionalidad del servidor web agregando cifrado de datos y redireccionamientos forzados de http a https.







Para hacer esto, debe resolver un problema organizacional: el hecho es que el certificado de cifrado se puede obtener solo para un nombre de dominio o un grupo de nombres. Por ello, acudimos a cualquiera de los registradores de nombres de dominio y elegimos un nombre que coincida con la marca (propósito, eslogan, etc.) sin olvidarnos del propósito de los nombres de dominio de primer nivel. En mi caso, dartservice.ru es perfecto . Durante el proceso de registro, debe completar el formulario de información del propietario, incluido el nombre, la dirección postal y el correo electrónico. Luego, debe ir a la gestión de registros DNS en el panel de control del registrador y hacer tres registros:



  • Al menos dos registros NS. Estos son los nombres de los servidores de nombres de dominio del registrador y el registrador proporciona su nombre al comprar un nombre de dominio.
  • Un registro. Este es un registro directo de la relación entre el nombre de dominio y la dirección IP del servidor.


En mi caso, los registros DNS se ven así:







Una vez hecho esto, no debe esperar resultados inmediatos. El intercambio de información entre servidores DNS suele tardar entre 1 y 12 horas en la zona RU. Luego ... agregue otra prueba al proyecto /test/http/client.http







SSL



En general, por supuesto, SSL es un nombre desactualizado. Las nuevas versiones del protocolo se denominan TLS 1.0 ... 1.3, pero el mecanismo sigue siendo el mismo: el cifrado de datos durante la transición entre el protocolo de la capa de aplicación (en nuestro caso HTTP) y el protocolo de la capa de transporte (TCP / IP). De hecho, necesitas:



  • Obtenga un certificado de cifrado de una autoridad de certificación especial, que confirme la propiedad del dominio correspondiente.
  • NGINX.
  • .
  • , http https.


Generalmente se acepta en este momento utilizar certificados gratuitos emitidos automáticamente por el servicio Let's encrypt . Una de las limitaciones de dichos certificados es el período de validez. Solo 90 días. Después de eso, se debe obtener el certificado nuevamente. Para la obtención automática (sin intervención humana) de certificados, se desarrollaron el protocolo ACME y aplicaciones que realizan periódicamente acciones para confirmar la propiedad del dominio. Let's encrypt recomienda usar la aplicación certbot . Está escrito en python y requiere su propio repositorio y la instalación de python3. Por lo tanto, usaremos un contenedor docker con certbot instalado desde el registro de DockerHub . Seleccionemos la última versión estable de certbot / certbot: v1.5.0...



Ahora descubramos el mecanismo para obtener un certificado usando el protocolo ACME:



  • En el primer lanzamiento, Certbot genera una clave pública y privada, luego crea una cuenta de administrador de dominio en el servicio Let's encrypt, pasando la clave pública y la información del dominio.
  • Después de eso, Let's encrypt envía un mensaje, que certbot debe firmar con una clave privada y devolverlo.
  • ertbot debe colocar en el servidor un archivo especial disponible para leer en dartservice.ru/.well-known/acme-challenge para confirmar la propiedad de este dominio.
  • Certbot redacta una solicitud de certificado , la envía a Let's encrypt y, a cambio, recibe un certificado para el dominio.


Agreguemos el contenedor de la aplicación a nuestro script docker-compose.yaml :







Nuevo parámetro aquí comand : aquí está el comando que se ejecutará después de que se inicie el contenedor. En este caso, solo certifique (obtenga un certificado). La obtención de un certificado se realiza en línea, es decir, es necesario responder constantemente a varias preguntas. Pasar banderas después del comando le permite hacer esto sin intervención humana: --webroot (método de confirmación) --webroot-path = / usr / share / nginx / html / letsencrypt (ruta donde se colocarán los archivos de confirmación de propiedad del dominio) --email admin @ email.com (correo del administrador del dominio) --agree-tos(acepte los términos del acuerdo de licencia) --no-eff-email (no informe el correo electrónico a los desarrolladores de certbot) -d dartservice.ru (lista de dominios).



Configuremos el contenedor NGINX: Los







cambios aquí son para abrir el puerto https (443) y montar las carpetas con el certificado SSL y los archivos de confirmación de propiedad del dominio.



Un parámetro importante es la carpeta de claves Diffie-Hellman. En resumen: esta clave es necesaria para intercambiar de forma segura claves de cifrado entre el servidor y el cliente al establecer una conexión. Más detalles aquí .



Generemos dicha clave, pero nos enfrentaremos al siguiente problema: la clave es creada por el programa openssl, es una utilidad de consola de Linux que es poco probable que aparezca en nuestra máquina con Windows. La solución más simple es ejecutar nuestro script, ir a la consola del contenedor web y crear una clave allí, pasando la carpeta de host montada al contenedor en la ruta de salida del archivo:



Ejecute el script:



docker-compose up -d


Solicitamos una lista de contenedores en ejecución:



docker-compose ps






Abra la consola del contenedor:



docker exec -it srv_web_1 bash


Comenzamos generando la clave en la carpeta de configuración de NGINX (que, como recordamos, se monta desde el host):



openssl dhparam -out /etc/nginx/conf.d/dhparams.pem 2048






Mueva la clave a ./dhparams/dhparam-2048.pem



Salga de la consola del contenedor Ctrl-D , detenga el script:



docker-compose down


Ahora cambiemos la configuración de NGINX ./conf.d/defaulf.conf :







Agregue una nueva ubicación ^ ~ /.well-known/acme-challenge para servir archivos estáticos desde la carpeta / usr / share / nginx / html / letsencrypt . Aquí es donde se colocarán los archivos de confirmación de certbot. Configuremos una redirección para todas las demás solicitudes a https.



Todo está listo para el primer certificado SSL. Copiemos



nuestro proyecto al VPS en una nueva carpeta / opt / srv_1 / con el comando:



scp -r ./* root@91.230.60.120:/opt/srv_1/


Conectemos de VScode a través de SSH a VPS.



Vayamos a la carpeta del servidor en ejecución:



cd /opt/srv_0/


y detener el script:



docker-compose down


Ahora vaya a la nueva carpeta del servidor cd / opt / srv_1 / y ejecute el script:



docker-compose up






En la consola, vemos que certbot creó un archivo de confirmación zeS4O87S6AfRQ3Kj4MaBlBFZx3AIiWdPn61DwogDMK4 y lo informó al servicio Let's encrypt, el cual, a su vez, solicitó este archivo de cuatro direcciones IP diferentes y luego emitió un certificado. El certificado en forma de cadena completa y una clave privada se guardaron en la carpeta correspondiente. El certificado es válido por 90 días (hasta el 05.10.2020).



Es hora de crear una segunda ubicación para una conexión segura en la configuración de NGINX en el servidor ./conf.d/defaulf.conf :







Reinicie el script
docker-compose restart


Veamos cómo reacciona el navegador a nuestro certificado:







Google Chrome está satisfecho con nuestro certificado. Ahora la tarea es más difícil: probaremos la seguridad y la disponibilidad para diferentes navegadores de nuestra conexión SSL https://www.ssllabs.com/ssltest/ . Ingresamos la dirección y obtenemos el resultado:







todo está bien con el certificado y el intercambio de claves (gracias a Diffie-Hellman), pero el robot de prueba ha bajado la calificación ("B" es "4" en nuestra opinión) para admitir los protocolos TLS1.0 y TLS1.1 obsoletos ... Deshabilitarlos en la configuración de NGINX no es difícil, sin embargo, mirando más a fondo el informe de prueba, vemos que, por ejemplo, los navegadores de algunos dispositivos móviles en este caso no podrán conectarse:











aún quedan varias tareas de servicio por realizar.



El número de intentos para obtener un certificado para un dominio no debe exceder de 5 en 7 días. Después de eso, el servicio Let's encrypt puede bloquearnos. Sin embargo, ejecutar el script durante el desarrollo cada vez que certbot intentará hacer esto, por lo que en el script docker-compose.dev.yaml, cambie el parámetro de comando del contenedor certbot :







El indicador --dry-run es una ejecución de prueba sin obtener un certificado.



Escribamos una prueba:







Código fuente github .



Conclusión



Entonces, en este paso, aseguramos las comunicaciones entre el servidor y las aplicaciones del cliente y enseñamos a los navegadores a "confiar" en nuestro dominio.



En el próximo artículo, escribiremos una página web flotante con una cuenta regresiva para el lanzamiento de nuestro servicio, la recopilaremos y la colocaremos en nuestro servidor.



All Articles