<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因:Chrome 不信任 ssc 证书

使启用了 HTTPS,即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA,Certificate Authority】签发的)。浏览器 Chrome 默认不信任自签名证书,也会报 NET::ERR_CERT_AUTHORITY_INVALID 错误。

准备环境:

1. 要用到 opkg

(以前的文章也有写,今天想起来,这个是第三方工具,来自 Entware

2. 要用到 vi 编辑器

a. 升级 apt-get

root@15fcc3463ef3:/app# apt-get update
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8789 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2468 B]
Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [204 kB]
Fetched 9250 kB in 4s (2265 kB/s)                    
Reading package lists... Done
root@15fcc3463ef3:/app#

b. 安装 vi (vim)

root@15fcc3463ef3:/app# apt-get install -y vim
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
...
...
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vimdiff (vimdiff) in auto mode
Processing triggers for libc-bin (2.36-9+deb12u9) ...
root@15fcc3463ef3:/app# 

解决方法:这里主要介绍 SSC 

第一个:浏览器信任自签名证书(自用) 主机名

1. 用于实验的 containter : 31859f34dfc0 15fcc3463ef3

2. Container : 31859f34dfc0 15fcc3463ef3 22e555193e03 6eb329c9609b

功能: <Project-23 Navigator Portal> 文章链接:<Project-23 Navigator Portal> Python flask web 网站导航应用 可编辑界面:添加图片、URL、描述、位置移动-CSDN博客

3. 生成 自签名证书

a. 进入 containter 修改 /etc/ssl/openssl.conf

[~] # docker exec -it 22e555193e03/bin/bash
root@22e555193e03:/app#

b. openss.conf 文件参考:

[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext  # 在我的文件里,添加这一行
x509_extensions    = v3_ext   #在我的文件里,添加这一行#在我的文件里,添加以下:
[ req_ext ]
subjectAltName = @alt_names[ v3_ext ]
subjectAltName = @alt_names[ alt_names ]
DNS.1 = localhost
DNS.2 = davens
IP.1 = 127.0.0.1

DNS.2 = davens 使用你自己的名字,或者是 FQDN ,也可以多做几个

c. 生成证书

解释命令:

生成自签名证书 openssl req|x509 证书 | newkey rsa:2048 同时创建一个新的证书并生成 2048 位的 RSA 密钥 | -keyout key.pem 私钥的输出文件名 | out cert.der 证书文件名 | days 365 证书的有效期 | nodes 私钥文件不需要设置密码 | config /etc/ssl/openssl.cnf 指定配置参数文件

root@22e555193e03:/app# openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -config ./ssl/openssl.cnf
.......+......+...+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+......+..+....+.....+...+.+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+...+...+............+......+.+...+...+............+........+.........+...+......+....+......+..+...+.......+.......................+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.+.................+.+..+...+.+...............+...+..+......+..........+..+.+.........+......+......+......+.................+.+..............+...+....+.....+...+......+.+......+...+..+...+................+........+......+...................+..+....+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+.+...+........+.............+..+.......+........+...+.......+........+.......+..+.......+......+.....+...+.+........+...+....+.....+......+...+......+....+......+.....+...+......+.+...+.....+.............+..+......+.+......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+............+........+..........+...+........+.+...+...........+.......+..+.+......+.........+..+....+...+.....+.............+..+............+...+..........+..........................+....+..+.+...+..+.......+..+....+..............+......+......+...............+......+....+...+...+........+.+...+......+..+...+.........+.+..+...............+..................+.......+.........+......+.........+...+..+......+...+......+.+............+.....+................+.........+.....+.+...........+................+..+...+............+...+......................+...+.....+.........+..........+......+.....+..........+...+......+.....+...+.+......+.....+.+..+.......+.....+....+.....+..........+..+....+...+..+.........+.+...+.....+...+...+.......+.........+........+............+......+...+....+...+...+..+.......+..+..................+.+..+....+.........+......+...+..+...................+......+........+...+...+......+......+.......+.....+.......+...+..+......+....+.........+.....+....+...+..+.+.....+..........+......+........+...+.........+................+.....+.......+...........+..........+.....+....+...........+.......+..+............+...+..........+..+.........+.......+..+...+.......+..+.........+.+......+..................+............+..+...+......................+...+...+..+...................+...+........+....+...+...+...+.....+...............+.........+......+....+..+.+........+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Freedome China!
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:davens
Email Address []:dave@mail.com
root@22e555193e03:/app# 

填写的内容随意, 除了 Common Name (e.g. server FQDN or YOUR name) []:davens

c. 证书必须是 PEM 格式 

如果使用了 DER, 要转换

root@15fcc3463ef3:/app# openssl x509 -in cert.der -inform DER -out cert.pem -outform PEM
root@15fcc3463ef3:/app#

原因:Werkzeug 只能使用 PEM 格式。在 Flask 加载时,使用 der 格式会报错。

细心的你会发现: container ID 已经变了,试错时毁掉了 31859f34dfc0 15fcc3463ef3 22e555193e03 等,这个是新的容器 6eb329c9609b 
这个是 container ID 用你自己的来替换 docker ps 可以看到

d. 提前解释一下 CN 与 SAN

 这里,理解为 url 要用的名字(主机名,地址全名FQDN):

Tip:

证书里:SAN 是扩展字段,浏览器会优先验证它。缺少 SAN 是导致浏览器标记自签名证书为 "Not Secure" 的常见问题。您需要确保证书中包含 SAN,并且域名/IP 与实际访问的地址一致。

我花了大都分时间都在不明不白的解决这个问题,直到有文章提到:Chrome 优先验证 SAN,而忽略证书的 Common Name (CN) 字段。 

e. 证书文件:

会在执行 openssl 目录中生成 上面提到的 2个文件:

root@15fcc3463ef3:/app# ls -al
total 48
drwxr-xr-x 1 root root 4096 Nov 17 05:59 .
drwxr-xr-x 1 root root 4096 Nov 17 05:54 ..
-rw-rw-rw- 1 root root 7212 Nov 14 08:05 app.py
-rw-r--r-- 1 root root 1338 Nov 17 05:59 cert.pem
drwxrwxrwx 1 root root 4096 Nov 17 05:54 data
-rw------- 1 root root 1704 Nov 17 05:57 key.pem
-rw-rw-rw- 1 root root   14 Nov 14 09:22 requirements.txt
drwxr-xr-x 1 root root 4096 Nov 17 05:54 static
drwxr-xr-x 2 root root 4096 Nov 17 05:54 templates

4. 挂载到 Flask 容器中

if __name__ == '__main__':init_data_file()#app.run(host='0.0.0.0', port=9999, debug=True)app.run(ssl_context=('cert.pem', 'key.pem'), host='0.0.0.0', port=9999, debug=True)

复制并注释 app.run(host='0.0.0.0', port=9999, debug=True),再修改:
    app.run(ssl_context=('cert.pem', 'key.pem'), host='0.0.0.0', port=9999, debug=True)

5. 重启 container

[~] # docker stop 6eb329c9609b
6eb329c9609b
[~] # docker start 6eb329c9609b
6eb329c9609b
[~] # 

6. 再次访问要使用 https

在点开证书信息后,可以看到 Chrome 已经识别到刚才新生成的证书

7. 把证书 cert.pem 下载到 Windows

[/share/Multimedia/2024-MyProgramFiles/23.Navigator_Portal] # docker cp 15fcc3463ef3:/app/cert.pem .
Successfully copied 2.56kB to /share/Multimedia/2024-MyProgramFiles/23.Navigator_Portal/.
[/share/Multimedia/2024-MyProgramFiles/23.Navigator_Portal] # 

8. 向 Windows 导入自签名证书

a. Chrome 导入

浏览器打开这个url: chrome://certificate-manager/localcerts 如下:

b. 使用 certmgr.msc 证书管理器

 

9. 验证 成功

第二个:certbot 使用 FQDN:davens.myqnapcloud.com

1. 用于实验的 container: 49b23380cba5

2. 这个 container 是我唯一在 Dockerfile 里用了:

# Create non-root user for security
RUN useradd -m appuser && \chown -R appuser:appuser /app
USER appuser

默认不是以 root 进入:

[~] # docker exec -it 49b23380cba5 /bin/bash
appuser@49b23380cba5:/app$ 

以 root 进入需要加入 -u root :

[~] # docker exec -u root -it 49b23380cba5 /bin/bash
root@49b23380cba5:/app#

3. 在容器里 安装 certbot

root@49b23380cba5:/app# pip3 install certbot
Collecting certbotDownloading certbot-3.0.1-py3-none-any.whl.metadata (8.0 kB)
Collecting acme>=3.0.1 (from certbot)Downloading acme-3.0.1-py3-none-any.whl.metadata (1.4 kB)
Collecting ConfigArgParse>=1.5.3 (from certbot)Downloading ConfigArgParse-1.7-py3-none-any.whl.metadata (23 kB)
...
...
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv[notice] A new release of pip is available: 24.0 -> 24.3.1
[notice] To update, run: pip install --upgrade pip
root@49b23380cba5:/app# 

3. 获取证书

[~] # docker exec -u root -it 49b23380cba5 /bin/bash
root@49b23380cba5:/app# certbot certonly --standalone -d davens.example.com

因为, 它也是使用 Let‘s Encrypt 与我的 NAS 发证一家,过程忽略~

后面同第一个方法:

flask加载证书 及以后相同 略

结束语:

还可以使用 Nginx 代理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475369.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【再谈设计模式】适配器模式 ~接口兼容的桥梁

一、引言 在软件开发的复杂世界里,不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时,就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠,能够巧妙…

无人机的激光雷达避障系统阐述!

一、材料 激光二极管基底材料:激光二极管是激光雷达的核心组件之一,其基底材料通常采用硅或砷化镓。硅材料成本低、易于加工,但发光效率相对较低;而砷化镓材料发光效率高,但成本较高。 光学镜片材料:激光…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios?1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

Three.js 相机控制器Controls

在 3D 场景中,摄像机的控制尤为重要,因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器,最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

【新人系列】Python 入门(十一):控制结构

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

SELinux

一、简介 SELinux : 安全强化的Linux;在开启后,会对进程本身部署安全上下文;会对文件部署安全上下文;对法务使用端口进行限制;对程序本身的不安全功能做限制 二、工作原理 1、工作方式 通过MAC的方式来控制管理进程&#xff0…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗,一个程序写了三天写不出来,主要是耗时太多了,老板一直不满意。想在VScode上跑一下,昨晚一直报错。今天来公司重新搞了一下, 主要工作有: 1,读取当前时间用tscns 2,输…

Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon (表)过期数据可以释放存储空间,优化资源利用并提升系统运行效…

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的,只需要在站点里就可以配置好,但是云虚拟主机在管理的时候是没有这个权限的,只提供了简单的域名管理等信息。 此处记录下阿里云(原万网)的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…

BOM的详细讲解

BOM概述 BOM简介 BOM(browser Object)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。 BOM由一系列的对象构成,并且每个对象都提供了很多方法与属性 BOM缺乏标准&#xff…

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记(一)湘潭大学软件工程算法设计与分析考试复习笔记(二)湘潭大学软件工程算法设计与分析考试复习笔记(三) 前言 现在是晚上十一点,我平时是十…

STM32单片机ADC数模转换器

由于最近忘记了,自用。 转换模式 单次转换,非扫描模式 在非扫描模式下,列表中就只有序列1的位置有效,此时可以在序列1的位置指定我们想要转换的通道,然后ADC就会对这个通道进行模数转换。等待一段时间,转…

android 使用MediaPlayer实现音乐播放--获取音乐数据

前面已经添加了权限&#xff0c;有权限后可以去数据库读取音乐文件&#xff0c;一般可以获取全部音乐、专辑、歌手、流派等。 1. 获取全部音乐数据 class MusicHelper {companion object {SuppressLint("Range")fun getMusic(context: Context): MutableList<Mu…

Spring Boot中使用AOP和反射机制设计一个的幂等注解(两种持久化模式),简单易懂教程

该帖子介绍如何设计利用AOP设计幂等注解&#xff0c;且可设置两种持久化模式 1、普通模式&#xff1a;基于redis的幂等注解&#xff0c;持久化程度较低 2、增强模式&#xff1a;基于数据库&#xff08;MySQL&#xff09;的幂等注解&#xff0c;持久化程度高 如果只需要具有re…

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;1&#xff09;开发环境搭建 1.开发环境搭建&#xff08;安装ESP-IDF&#xff09;2.开发环境搭建&#xff08;安装VS Code&#xff09;3.开发环境搭建&#xff08;VSCode中安装ESP-IDF插件及配置&#xff09; 1.开发环境搭建&am…

论文分享 | FuzzLLM:一种用于发现大语言模型中越狱漏洞的通用模糊测试框架

大语言模型是当前人工智能领域的前沿研究方向&#xff0c;在安全性方面大语言模型存在一些挑战和问题。分享一篇发表于2024年ICASSP会议的论文FuzzLLM&#xff0c;它设计了一种模糊测试框架&#xff0c;利用模型的能力去测试模型对越狱攻击的防护水平。 论文摘要 大语言模型中…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用&#xff1a;读取图像文件并将其加载到 Mat 对象中。参数&#xff1a; 第一个参数是文件路径&#xff0c;可以是相对路径或绝对路径。第二个参数是读取标志&#xff0c;比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

用源码编译虚幻引擎,并打包到安卓平台

用源码编译虚幻引擎&#xff0c;并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目&#xff0c;简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定&#xff0c;然后加入 Epic 邀请的组织&#xff0c…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…