<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 代理
相关文章:
<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全
原因:Chrome 不信任 ssc 证书 使启用了 HTTPS,即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA,Certificate Authority】签发的)。浏览器 Chrome 默认不信任自签名证书,也会报 NET::ERR_…...
通过huggingface-cli下载Hugging Face上的公开数据集或模型至本地
1. 获取 Access Tokens 在使用huggingface-cli命令下载之前需要先去官网获取 Access Tokens: 获取tokens的官网链接:https://huggingface.co/settings/tokens点击新增 token: 然后选择 write 权限: 最后,这个 Access…...
论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)
一.基本信息 论文名称:Intrusion detection systems using longshort‑term memory (LSTM) 中文翻译:基于长短期记忆(LSTM)的入侵检测系统 DOI:10.1186/s40537-021-00448-4 作者:FatimaEzzahra Laghrissi1* , Samira Douzi2*, Kha…...
SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划
SparkSQL的执行过程可以分为以下几个阶段:从用户的SQL语句到最终生成的RDD执行,涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析: 1. 解析阶段(Parsing) SQL语句解析:Spark 使用 Catalyst 引…...
Leetcode打卡:新增道路查询后的最短距离II
执行结果:通过 题目:3244 新增道路查询后的最短距离II 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市,编号从 0 到 n - 1。初始时,每个城市 i 都有一条单向道路通往城市 i 1( 0 < i < n - 1&…...
Spring Web入门练习
加法计算器 约定前后端交互接⼝ 约定 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API(Application Programming Interface), 我们⼀般讲到接⼝或者 API,指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…...
计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)
1,绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理汽车资讯网站的相关信息成为必然…...
stm32下的ADC转换(江科协 HAL版)
十二. ADC采样 文章目录 十二. ADC采样12.1 ADC的采样原理12.2 STM32的采样基本过程1.引脚与GPIO端口的对应关系2.ADC规则组的四种转换模式(**)2.2 关于转换模式与配置之间的关系 12.3 ADC的时钟12.4 代码实现(ADC单通道 & ADC多通道)1. 单通道采样2. 多通道采样 19.ADC模数…...
解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL,可以先做检查连接:...
react 如何修改弹出的modal的标题
原来标题的样子: 修改为: 实现方式: <Modal title<span>股价趋势/{this.state.pccode}</span> visible{this.state.isPriceModalOpen} style{{ top: 20 }} width{1320} height{400} footer{null} onCancel{()>this.hideMo…...
C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合
在C#编程中,二维数组(或矩阵)是一种重要的数据结构,它不仅能够高效地存储和组织数据,还能通过其行、列和交叉点(备注:此处相交处通常称为“元素”或“单元格”,代表二维数组中的一个…...
HTML5拖拽API学习 托拽排序和可托拽课程表
文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子🌰 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API,简化了拖放操作的实现。以下是拖拽API的基本使用指南: 拖拽…...
内容补充页(相关公式解释)
from 学习日记_20241117_聚类方法(高斯混合模型) 学习日记_20241117_聚类方法(高斯混合模型) 公式 P ( Z k ) π k P(Zk) \pi_k P(Zk)πk 在高斯混合模型 (GMM) 中,公式 P ( Z k ) π k P(Zk) \pi_k P(Zk…...
vue中动态渲染静态图片资源
不报错且f12查看元素的时候,显示的src说明已经渲染到html的src上,但是就是不显示在页面上 原因 在vue上,动态渲染静态图片资源(比如从assets文件夹加载的图片)需要注意打包工具对静态资源的解析方式 由于vue2的脚手…...
管伊佳ERP,原名华夏ERP,一个简约易上手的国产ERP系统
JSH_ERP(管伊佳ERP)是一款开源、模块化的企业资源计划系统,旨在为中小企业提供高效的管理工具。它基于SpringBoot框架和SaaS模式,支持进销存、财务、生产等业务模块,包括零售、采购、销售、仓库和报表管理。 核心特点…...
学习虚幻C++开发日志——委托(持续更新中)
委托 官方文档:Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说,委托就像是一个“函数指针”,但它更加安全和灵活。它允许程序在运行时动态地调用不…...
开窗函数 - first_value/last_value
1、开窗函数是什么? 开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用 GROUP BY 子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 2、…...
「一」HarmonyOS端云一体化概要
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...
nodejs21: 快速构建自定义设计样式Tailwind CSS
Tailwind CSS 是一个功能强大的低级 CSS 框架,只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站。 1. 安装 Tailwind CSS React 项目中安装 Tailwind CSS: 1.1 安装 Tailwind CSS 和相关依赖 安装 Tailwind CSS: npm…...
从JSON数据提取嵌套字段并转换为独立列的简洁方法
从JSON数据提取嵌套字段并转换为独立列的简洁方法 在数据处理和数据分析的日常工作中,我们经常遇到复杂的嵌套数据结构,特别是嵌入在JSON字段中的数据。这些数据往往需要解析并展开成独立的列,以便后续分析和建模。本文将详细介绍如何在Pyth…...
湘潭大学软件工程算法设计与分析考试复习笔记(四)
回顾 湘潭大学软件工程算法设计与分析考试复习笔记(一)湘潭大学软件工程算法设计与分析考试复习笔记(二)湘潭大学软件工程算法设计与分析考试复习笔记(三) 前言 现在是晚上十一点,我平时是十…...
特征交叉-DeepCross Network学习
一 tensorflow官方实现 tensorflow的官方实现已经是V2版本 class Cross(tf.keras.layers.Layer):"""Cross Layer in Deep & Cross Network to learn explicit feature interactions.Args:projection_dim: int,低秩矩阵的维度,应该小…...
stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...
Go语言中的Defer机制详解与示例
在Go语言中,defer是一个关键字,用于确保资源的清理和释放,特别是在函数中创建的资源。defer语句会将其后的函数调用推迟到包含它的函数即将返回时执行。这使得defer成为处理文件关闭、数据库连接释放、解锁等资源清理操作的理想选择。 Defer…...
H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解
随着技术的不断进步和5G网络的推广,中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长,并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁,推动数字媒体产业的创新和发展。 EasyPla…...
ms-hot目录
1. ms-hot1...
vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册
目录 一、启动环境,访问页面,ip:端口号/index.php?madmin,进入后台管理页面,账号密码都是adminadmin 二、进入之后,根据图片所示,地址后追加一下代码,保存修改 三、新开标签页访问:①ip:端…...
AI Large Language Model
AI 的 Large Language model LLM , 大语言模型: 是AI的模型,专门设计用来处理自然语言相关任务。它们通过深度学习和庞大的训练数据集,在理解和生成自然语言文本方面表现出色。常见的 LLM 包括 OpenAI 的 GPT 系列、Google 的 PaLM 和 Meta…...
React Native的`react-native-reanimated`库中的`useAnimatedStyle`钩子来创建一个动画样式
React Native的react-native-reanimated库中的useAnimatedStyle钩子来创建一个动画样式,用于一个滑动视图的每个项目(SliderItem)。useAnimatedStyle钩子允许你根据动画值(在这个例子中是scrollX)来动态地设置组件的样…...
FastJson反序列化漏洞(CVE-2017-18349)
漏洞原理 原理就不多说了,可以去看我这篇文章,已经写得很详细了。 Java安全—log4j日志&FastJson序列化&JNDI注入-CSDN博客 影响版本 FastJson<1.2.24 复现过程 这里我是用vulfocus.cn这个漏洞平台去复现的,比较方便&#x…...
网页图片设置/seo优化专家
对于刚装完java的环境,在运行jar包时可能会遇到证书问题: javax.net.ssl.SSLHandshakeException sun.security.validator.ValidatorException sun.security.provider.certpath.SunCertPathBuilderException 可以尝试以下办法: 以windows为例&…...
wordpress加密视频播放器/站长工具ping检测
这两个工具类都是基于之前介绍的注解来完成的第一个工具类是ExcelImportUtil Excel导入工具类两个方法1.从本地导入2.流导入参数基本上一直,导入文件,导如对应的实体,导入参数第二中方法相对来说我们用的比较多,我们从前天传输的获取流,然后返回一个list对象第二个类 导出类Exc…...
网站建设网站建设 网站制作/新闻发稿平台有哪些?
在Excel VBA 操作文件(夹)神器——FSO对象中,我们讲解了FSO(FileSystemObject)对象,今天我们将通过一个具体的实例来加深我们对FSO对象的理解。既然FSO对象是操作文件(夹)神器,那么今天我们就用VBA编程来实现将指定文件夹内的所有文件名提取到…...
wordpress 红酒/百度广告费
【前言】“养兰一点通,浇水三年功”。养兰可是个细心的活,要认真呵护管理,仔细养护。有个花友养了几盆墨兰、蕙兰和春兰等,经常和我进行交流,相互探讨养殖兰花的一些经验和教训。今天,又和我探讨࿱…...
做运营的网站/百度一下你就知道百度官网
2019独角兽企业重金招聘Python工程师标准>>> STRUTS2框架内部流程 1. 客户端发送请求的tomcat服务器。服务器接受,将HttpServletRequest传进来。 2. 请求经过一系列过滤器(如:ActionContextCleanUp、SimeMesh等) 3. FilterDispatcher被调用。…...
网站建设服务定制/免费私人网站建设平台
尝试用Python实现一些简单的算法和数据结构 之前的算法和数据结构基本都是用Swift写的,现在尝试用Python实现一些简单的算法和数据结构。 update 20160704 准备加入《剑指offer》的习题python实现,以及机器学习过程中的一些算法 update 20160717 加入leetcode部分 #…...