Dart语言服务:域名,SSL

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




免责声明(根据上一篇文章的评论)
  • . .
  • , : .
  • , , , K8s, AWS, GKE . , . , , «», .
  • , : , .
  • . . , .
    • Dependency injection ( boilerplate)
    • ORM. .
    • oAuth2 + JWT . .
    • Deeplinks (Universal links/ App links). web/app
    • (websockets)
    • flutter






域名



我们最后一次讨论的是,在Docker容器中启动了Web服务器NGINX,分发了静态index.html文件。这次,我们将通过添加数据加密和从http强制重定向到https来扩展Web服务器的功能。







为此,您需要解决一个组织问题:事实是只能为域名或一组名称获得加密证书。因此,我们会去任何一个域名注册机构,并选择一个与品牌相匹配的名称(目的,口号等),而不会忘记顶级域名的目的就我而言,dartservice.ru是完美的在注册过程中,您必须填写所有者信息表,包括姓名,邮政地址和电子邮件。然后,您需要在注册商的控制面板中进行DNS记录的管理,并制作三个记录:



  • 至少两个NS记录。这些是注册商的域名服务器的名称,它们的名称由注册商在购买域名时提供。
  • 一个记录。它直接记录域名和服务器IP地址之间的关系。


就我而言,DNS记录如下所示:







完成此操作后,您不应期望立即获得结果。对于RU区域,DNS服务器之间的信息交换通常需要1到12个小时。然后...将另一个测试添加到项目/test/http/client.http







SSL协议



当然,通常来说,SSL是一个过时的名称。该协议的新版本称为TLS 1.0 ... 1.3,但是该机制保持不变-在应用程序层协议(在我们的情况下为HTTP)和传输层协议(TCP / IP)之间的过渡期间进行数据加密。实际上,您需要:



  • 从专门的证书颁发机构获取加密证书,以确认相应域的所有权。
  • NGINX.
  • .
  • , http https.


目前普遍接受使用由Let's加密服务自动颁发的免费证书。这种证书的局限性之一是有效期。只有90天。之后,必须再次获得证书。为了自动(无需人工干预)获得证书,开发了ACME协议和应用程序它们定期执行操作以确认域所有权。让我们使用certbot应用程序加密建议。它是用python编写的,并且需要安装自己的存储库和python3。因此,我们将使用从DockerHub注册表安装了certbot的docker容器。让我们选择certbot / certbot的最新稳定版本:v1.5.0...



现在,让我们找出使用ACME协议获取证书的机制:



  • 首次启动时,Certbot会生成一个私钥和公钥,然后在“让我们加密”服务中创建一个域管理员帐户,以传输公钥和域信息。
  • 之后,让我们加密发送一条消息,该certbot必须使用私钥签名并将其返回。
  • ertbot必须在服务器上放置一个特殊文件,以供读取,该文件可在dartservice.ru/.well-known/acme-challenge中确认该域的所有权。
  • Certbot组成一个证书请求,将其发送到Let's Encrypt并接收该域的证书作为回报。


让我们的应用程序容器添加到我们的脚本泊坞窗,compose.yaml







这里的新参数COMAND:这里是将容器启动后要执行的命令。在这种情况下,认证(获取证书)。获取证书是在线进行的,也就是说,必须始终回答几个问题。在命令后传递标志使您无需人工干预即可执行此操作:-- webroot(确认方法)-- webroot-path = / usr / share / nginx / html / letsencrypt(将放置域所有权确认文件的路径)-- email admin @ email.com(域管理员邮件)-- agree-tos(接受许可协议的条款)–no-eff-email(不向certbot开发人员报告电子邮件)-d dartservice.ru(域列表)。



让我们配置NGINX容器:







此处更改是打开https端口(443)并使用SSL证书和域所有权确认文件安装文件夹。



一个重要的参数是Diffie-Hellman密钥文件夹。简而言之:建立连接时,为了在服务器和客户端之间安全地交换加密密钥,需要此密钥。更多细节在这里



让我们生成这样的密钥,但是我们将面临以下问题:密钥是由openssl程序创建的,这是一个Linux控制台实用程序,不太可能显示在我们的Windows计算机上。最简单的解决方案是运行脚本,转到Web容器控制台并在其中创建一个密钥,将安装在容器中的主机文件夹传递到文件的输出路径中:



运行脚本:



docker-compose up -d


我们要求一个正在运行的容器的列表:



docker-compose ps






打开容器控制台:



docker exec -it srv_web_1 bash


我们开始在NGINX配置文件夹中生成密钥(据我们所记得,该文件夹是从主机安装的):



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






将密钥移至./dhparams/dhparam-2048.pem



退出容器控制台Ctrl-D,停止脚本:



docker-compose down


现在,让我们改变NGINX配置./conf.d/defaulf.conf







添加一个新的位置^〜/.well-known/acme-challenge满足从静态文件在/ usr /共享/ nginx的/ HTML / letsencrypt文件夹这是将放置certbot确认文件的位置。让我们为所有其他到https的请求设置重定向。



准备好第一个SSL证书。



让我们使用以下命令将项目复制到VPS到新文件夹/ opt / srv_1 /中



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


让我们通过SSH从VScode连接到VPS。



让我们转到正在运行的服务器的文件夹:



cd /opt/srv_0/


并停止脚本:



docker-compose down


现在转到新的服务器文件夹cd / opt / srv_1 /并运行脚本:



docker-compose up






在控制台中,我们看到certbot创建了一个确认文件zeS4O87S6AfRQ3Kj4MaBlBFZx3AIiWdPn61DwogDMK4并将其报告给Let's加密服务,该服务依次从四个不同的IP地址请求此文件,然后颁发证书。完整的链证书和私钥已保存在相应的文件夹中。该证书的有效期为90天(直到2020年10月10日)。



是时候在服务器上的NGINX配置中为安全连接创建第二个位置了。/conf.d/defaulf.conf







重新启动脚本
docker-compose restart


让我们看看浏览器对证书的反应:







Google Chrome对我们的证书感到满意。现在任务变得更加复杂-我们将测试SSL连接https://www.ssllabs.com/ssltest/的不同浏览器的安全性和可用性。输入地址,我们得到结果:







证书和密钥交换一切都很好(感谢Diffie-Hellman),但是测试机器人降低了标记(我们认为“ B”为“ 4”)以支持过时的TLS1.0和TLS1.1协议...在NGINX配置中禁用它们并不难,但是,进一步查看测试报告,我们发现,例如,在这种情况下某些移动设备的浏览器将无法连接:











还有一些服务任务需要执行。



在7天内尝试获取域证书的次数不应超过5。之后,“让我们加密”服务会阻止我们。但是,每次在certbot尝试进行开发时都在开发期间运行脚本,因此在docker-compose.dev.yaml脚本中,更改certbot容器命令参数 -- dry-run标志是未获得证书的测试运行。 让我们编写一个测试: 源代码github























结论



因此,在此步骤中,我们确保了服务器与客户端应用程序之间的通信安全,并教导浏览器“信任”我们的域。



在下一篇文章中,我们将编写一个混乱的网页,其中包含启动服务的倒计时,并将其收集并放置在我们的服务器上。



All Articles