当前位置: 首页 > news >正文

【ROS2】高级:安全-理解安全密钥库

目标:探索位于 ROS 2 安全密钥库中的文件。

 教程级别:高级

 时间:15 分钟

 内容

  •  背景

  • 安全工件位置

    •  公钥材料

    •  私钥材料

    • 域治理政策

    •  安全飞地

  •  参加测验!

 背景 

在继续之前,请确保您已完成设置安全教程。

sros2 包可以用来创建启用 ROS 2 安全性所需的密钥、证书和策略。然而,安全配置非常灵活。对 ROS 2 安全密钥库的基本理解将允许与现有的 PKI(公钥基础设施)集成,并根据组织政策管理敏感密钥材料。

安全工件位置

之前的教程中启用通信安全后,让我们来看看启用安全性时创建的文件。这些文件使加密成为可能。

cxy@cxy-Ubuntu2404:~/sros2_demo$ sudo apt install tree
cxy@cxy-Ubuntu2404:~/sros2_demo$ tree
.
└── demo_keystore├── enclaves│   ├── governance.p7s│   ├── governance.xml│   └── talker_listener│       ├── listener│       │   ├── cert.pem│       │   ├── governance.p7s -> ../../governance.p7s│       │   ├── identity_ca.cert.pem -> ../../../public/identity_ca.cert.pem│       │   ├── key.pem│       │   ├── permissions_ca.cert.pem -> ../../../public/permissions_ca.cert.pem│       │   ├── permissions.p7s│       │   └── permissions.xml│       └── talker│           ├── cert.pem│           ├── governance.p7s -> ../../governance.p7s│           ├── identity_ca.cert.pem -> ../../../public/identity_ca.cert.pem│           ├── key.pem│           ├── permissions_ca.cert.pem -> ../../../public/permissions_ca.cert.pem│           ├── permissions.p7s│           └── permissions.xml├── private│   ├── ca.key.pem│   ├── identity_ca.key.pem -> ca.key.pem│   └── permissions_ca.key.pem -> ca.key.pem└── public├── ca.cert.pem├── identity_ca.cert.pem -> ca.cert.pem└── permissions_ca.cert.pem -> ca.cert.pem8 directories, 22 files

c89ea15f12e7749d4c42da826f1e758b.png

sros2 实用程序 ( ros2 security ... ) 将文件分为公共、私有和飞地密钥材料

ROS 使用由环境变量 ROS_SECURITY_KEYSTORE 定义的目录作为密钥库。在本教程中,我们使用目录 ~/sros2_demo/demo_keystore 。

公钥材料

您将在 ~/sros2_demo/demo_keystore/public 的公共目录中找到三个加密证书;然而,身份和权限证书实际上只是指向证书颁发机构(CA)证书的链接

在公钥基础设施中,证书颁发机构充当信任锚:它验证参与者的身份和权限。对于 ROS,这意味着所有参与 ROS 图的节点(可能扩展到整个单机器人舰队)。通过将证书颁发机构的证书( ca.cert.pem )放置在机器人上的适当位置,所有 ROS 节点都可以使用相同的证书颁发机构与其他节点建立相互信任。

虽然在我们的教程中我们会即时创建证书颁发机构,但在生产系统中,这应该根据预定义的安全计划进行。通常,生产系统的证书颁发机构将离线创建,并在初始设置期间放置在机器人上。它可能是每个机器人独有的,或者在一群机器人之间共享,所有这些机器人都旨在相互信任。

DDS(以及扩展的 ROS)支持身份和权限信任链的分离,因此每个功能都有自己的证书颁发机构。在大多数情况下,ROS 系统安全计划不需要在这些职责之间进行分离,因此安全实用程序生成一个用于身份和权限的单一证书颁发机构。

使用 openssl 查看此 x509 证书并将其显示为文本:

cd ~/sros2_demo/demo_keystore/public
openssl x509 -in ca.cert.pem -text -noout

输出应类似于以下内容: 

3ebc9337025db5a6bdf718aaf160924d.png

Certificate:Data:Version: 3 (0x2)Serial Number:02:8e:9a:24:ea:10:55:cb:e6:ea:e8:7a:c0:5f:58:6d:37:42:78:aaSignature Algorithm: ecdsa-with-SHA256Issuer: CN = sros2CAValidityNot Before: Jun  1 16:57:37 2021 GMTNot After : May 31 16:57:37 2031 GMTSubject: CN = sros2CASubject Public Key Info:Public Key Algorithm: id-ecPublicKeyPublic-Key: (256 bit)pub:04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:dc:ed:39:c5:32ASN1 OID: prime256v1NIST CURVE: P-256X509v3 extensions:X509v3 Basic Constraints: criticalCA:TRUE, pathlen:1Signature Algorithm: ecdsa-with-SHA25630:45:02:21:00:d4:fc:d8:45:ff:a4:51:49:98:4c:f0:c4:3f:e0:e7:33:19:8e:31:3c:d0:43:e7:e9:8f:36:f0:90:18:ed:d7:7d:02:20:30:84:f7:04:33:87:bb:4f:d3:8b:95:61:48:df:83:4b:e5:92:b3:e6:ee:3c:d5:cf:30:43:09:04:71:bd:dd:7c
  • 关于此 CA 证书的一些注意事项:

    • 证书主题名称 sros2CA 是 sros2 实用程序提供的默认名称

    • 此证书自创建之日起有效期为十年

    • 像所有证书一样,这包含用于公私钥加密的公钥

    • 作为根证书颁发机构,这是一个自签名证书 https://en.wikipedia.org/wiki/Self-signed_certificate ;即,它是使用自己的私钥签名的。

由于这是一个公共证书,因此可以根据需要自由复制,以在整个 ROS 系统中建立信任。

私钥材料

私钥材料可以在密钥库目录 ~/sros2_demo/demo_keystore/private 中找到。与 public 目录类似,其中包含一个证书颁发机构密钥 ca.key.pem 及其符号链接,用作身份和权限 CA 私钥。

 警告

保护此私钥并创建其安全备份!

这是与公共证书颁发机构相关的私钥,它作为您 ROS 系统中所有安全性的锚点。您将使用它来修改 ROS 图的加密策略并添加新的 ROS 参与者。根据您的机器人安全需求,可以通过访问权限保护密钥并将其锁定到另一个帐户,或者可以将其完全移出机器人并移到另一个系统或设备上如果文件丢失,您将无法更改访问权限并向系统添加新参与者。同样,任何拥有文件访问权限的用户或进程都可以修改系统策略和参与者。

此文件仅用于配置机器人,但机器人运行时不需要。它可以安全地离线存储在另一个系统或可移动介质中。

sros2 实用程序使用椭圆曲线密码术而不是 RSA,以提高安全性并减少密钥大小。使用以下命令显示有关此椭圆曲线私钥的详细信息:

cd ~/sros2_demo/demo_keystore/private
openssl ec -in ca.key.pem -text -noout

cd85bc8774d27b9cea6a713e9dde6ecf.png

您的输出应类似于以下内容: 

read EC key
Private-Key: (256 bit)
priv:93:da:76:b9:e3:91:ab:e9:42:76:f2:38:f1:9d:94:90:5e:b5:96:7b:7f:71:ee:13:1b:d4:a0:f9:48:fb:ae:77
pub:04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:dc:ed:39:c5:32
ASN1 OID: prime256v1
NIST CURVE: P-256

除了私钥本身,请注意列出了公钥,并且它与证书颁发机构 ca.cert.pem 中列出的公钥匹配。

域治理政策

在密钥库的飞地目录中找到域治理策略, ~/sros2_demo/demo_keystore/enclaves 。 enclave 目录包含 XML 治理策略文档 governance.xml ,以及由权限 CA 签署的文档副本 governance.p7s 。

governance.p7s 文件包含域范围的设置,例如如何处理未经身份验证的参与者、是否加密发现以及访问主题的默认规则。

使用以下命令验证治理文件的 S/MIME 签名:

openssl smime -verify -in governance.p7s -CAfile ../public/permissions_ca.cert.pem

ec6483793bc03fbb09267e7ef48388b1.png

 a32b6cc8e9b8ac0a8e8389272d1b3e55.png

安全飞地

安全进程(通常是 ROS 节点)在安全飞地内运行。在最简单的情况下,所有进程可以合并到同一个飞地中,所有进程将使用相同的安全策略。然而,为了对不同的进程应用不同的策略,可以在启动时使用不同的安全飞地。有关安全飞地的更多详细信息,请参阅设计文档https://design.ros2.org/articles/ros2_security_enclaves.html 。运行节点时,通过使用 ROS 参数 --enclave 来指定安全飞地。

每个安全飞地需要六个文件才能启用安全性。每个文件必须按下文定义的名称命名,并按照 DDS 安全标准中的规定进行命名。为了避免拥有多个相同文件的副本, sros2 实用程序为每个飞地创建到单个治理策略、身份 CA 和权限 CA 的链接。

1e19bbef9da71c20335dce7754626b57.png

请参阅 listener 飞地内的以下六个文件。三个是特定于此飞地的,而三个是此 ROS 系统的通用文件:

  • key.pem ,用于在此飞地内加密和解密的私钥

  • cert.pem ,此飞地的公共证书;此证书已由身份 CA 签署

  • permissions.p7s ,此飞地的权限;此文件已由权限 CA 签名

  • governance.p7s ,此域的已签署安全策略文件的链接

  • identity_ca.cert.pem, 此域的身份 CA 链接

  • permissions_ca.cert.pem ,此域的权限 CA 链接

私钥 key.pem 应根据您的安全计划进行保护。此密钥用于加密、解密和验证此特定飞地内的通信。如果密钥丢失或被盗,请撤销该密钥并为此飞地创建一个新身份。

该目录中还创建了文件 permissions.xml ,可用于重新创建签名的权限文件。但是,由于 DDS 使用的是文件的签名版本,因此不需要此文件来启用安全性。

参加测验!

看看你能否回答这些关于 ROS 安全密钥库的问题。首先,打开一个新的终端会话,并启用在前面的教程中创建的密钥库的安全性

export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforcecd ~/sros2_demo/demo_keystore/enclaves/talker_listener/listener

在开始之前,请先备份 permissions.p7s 

MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="===============1982425736132065620=="This is an S/MIME signed message--===============1982425736132065620==
Content-Type: text/plain<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.omg.org/spec/DDS-SECURITY/20170901/omg_shared_ca_permissions.xsd"><permissions><grant name="/talker_listener/listener"><subject_name>CN=/talker_listener/listener</subject_name><validity><not_before>2024-07-19T03:38:43</not_before><not_after>2034-07-18T03:38:43</not_after></validity><allow_rule><domains><id>0</id></domains><publish><topics><topic>rq/*/_action/cancel_goalRequest</topic><topic>rq/*/_action/get_resultRequest</topic><topic>rq/*/_action/send_goalRequest</topic><topic>rq/*Request</topic><topic>rr/*/_action/cancel_goalReply</topic><topic>rr/*/_action/get_resultReply</topic><topic>rr/*/_action/send_goalReply</topic><topic>rt/*/_action/feedback</topic><topic>rt/*/_action/status</topic><topic>rr/*Reply</topic><topic>rt/*</topic></topics></publish><subscribe><topics><topic>rq/*/_action/cancel_goalRequest</topic><topic>rq/*/_action/get_resultRequest</topic><topic>rq/*/_action/send_goalRequest</topic><topic>rq/*Request</topic><topic>rr/*/_action/cancel_goalReply</topic><topic>rr/*/_action/get_resultReply</topic><topic>rr/*/_action/send_goalReply</topic><topic>rt/*/_action/feedback</topic><topic>rt/*/_action/status</topic><topic>rr/*Reply</topic><topic>rt/*</topic></topics></subscribe></allow_rule><allow_rule><domains><id>0</id></domains><publish><topics><topic>ros_discovery_info</topic></topics></publish><subscribe><topics><topic>ros_discovery_info</topic></topics></subscribe></allow_rule><default>DENY</default></grant></permissions>
</dds>--===============1982425736132065620==
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"MIICsAYJKoZIhvcNAQcCoIICoTCCAp0CAQExDzANBglghkgBZQMEAgEFADALBgkq
hkiG9w0BBwGgggE/MIIBOzCB4qADAgECAhR8Qa0j+Lrcm8xeZkyz9p/bZMWhVzAK
BggqhkjOPQQDAjASMRAwDgYDVQQDDAdzcm9zMkNBMB4XDTI0MDcxOTAzMjQxNFoX
DTM0MDcxODAzMjQxNFowEjEQMA4GA1UEAwwHc3JvczJDQTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABPMaf1j/SYjdKa+wt8L7SPedfo1UR2bEm0MoUKU8Yaiep+AC
1Uwaza61Gsvuq68t+3gy+i75zwwkj76n+77PV8ejFjAUMBIGA1UdEwEB/wQIMAYB
Af8CAQEwCgYIKoZIzj0EAwIDSAAwRQIhALNRE/bqkCIvf1xD3E8s/1HqS1FY4Q31
dX+C9FMYNn+ZAiBHNtYoBAmu8lU6/+Ux+26wBdKEf+PEJs45EtgNd08UDDGCATUw
ggExAgEBMCowEjEQMA4GA1UEAwwHc3JvczJDQQIUfEGtI/i63JvMXmZMs/af22TF
oVcwDQYJYIZIAWUDBAIBBQCggZswGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
BgkqhkiG9w0BCQUxDxcNMjQwNzIwMDMzODQzWjAvBgkqhkiG9w0BCQQxIgQgkeLS
0XqZO+LEtvmMJumjB+dkzkMPosQzWIvdotfJQ5QwMAYJKoZIhvcNAQkPMSMwIQYJ
YIZIAWUDBAEqBglghkgBZQMEARYGCWCGSAFlAwQBAjAKBggqhkjOPQQDAgRHMEUC
IEcVdGZIK9qOIeMkw5tvyMmIt/UBfqcnMiakwXWBxXMZAiEA+nItvq7n5WkgPHrc
mTBX0DlOac3CwCrv4/aJS32PPN0=--===============1982425736132065620==--

这个 permissions.p7s 文件是一个 S/MIME 签名的消息,包含了 ROS2 的权限策略。以下是详细解释:

MIME 头部

  • MIME-Version: 1.0:MIME 版本。

  • Content-Type: multipart/signed; protocol=“application/x-pkcs7-signature”; micalg=“sha-256”; boundary=“===============1982425736132065620==”:表示这是一个多部分签名的消息,使用 SHA-256 算法进行签名,边界字符串用于分隔消息的不同部分。

消息内容

  • This is an S/MIME signed message:说明这是一个 S/MIME 签名的消息。

第一部分:权限策略

  • Content-Type: text/plain:内容类型为纯文本。

权限策略 XML

这个 XML 文件定义了 /talker_listener/listener 节点的权限,包括允许发布和订阅的主题,以及权限的有效期。

第二部分:签名

  • Content-Type: application/x-pkcs7-signature; name=“smime.p7s”:内容类型为 PKCS#7 签名。

  • Content-Transfer-Encoding: base64:内容传输编码为 base64。

  • Content-Disposition: attachment; filename=“smime.p7s”:附件的文件名为 smime.p7s

签名内容

这是一个 base64 编码的签名,用于验证上述权限策略的完整性和真实性。

问题 1 

在文本编辑器中打开 permissions.p7s 。对 XML 内容进行微小的更改(例如,添加一个空格或空行)并保存文件。启动监听节点:

ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

你期望会发生什么?

你能启动 talker 节点吗?

ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

启动监听器和启动说话者之间有什么区别?

答案 1

侦听器无法启动并抛出错误。当 permissions.p7s 文件被修改时——无论多么微小——文件的签名变得无效。当权限文件无效时,节点将无法在启用和强制安全的情况下启动。

326d23390cf17e048812da6ea701027e.png

讲话者将按预期开始。它在不同的飞地中使用 permissions.p7s 文件,并且该文件仍然有效。

 问题 2 

什么命令可以让你检查修改后的 permissions.p7s 文件上的签名是否有效?

答案 2

检查 permissions.p7s 是否已使用 openssl smime 命令由权限 CA 正确签名

openssl smime -verify -in permissions.p7s -CAfile permissions_ca.cert.pem

65ccacd13d2123b0fc0180ba2d998cee.png

3eefee19a01157368b2800470e218716.png

在继续下一个教程之前,请恢复您原始的、正确签名的 permissions.p7s 文件。

相关文章:

【ROS2】高级:安全-理解安全密钥库

目标&#xff1a;探索位于 ROS 2 安全密钥库中的文件。 教程级别&#xff1a;高级 时间&#xff1a;15 分钟 内容 背景安全工件位置 公钥材料 私钥材料域治理政策 安全飞地 参加测验&#xff01; 背景 在继续之前&#xff0c;请确保您已完成设置安全教程。 sros2 包可以用来创…...

C语言 ——— 数组指针的定义 数组指针的使用

目录 前言 数组指针的定义 数组指针的使用 前言 之前有编写过关于 指针数组 的相关知识 C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 指针数组 顾名思义就是 存放指针的数组 那什么是数组指针呢&#xff1f; 数组指针的定义 何为数组指针&#xf…...

opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习

前言 AIS_ManipulatorOwner是OpenCascade中的一个类&#xff0c;主要用于操纵对象的交互控制。AIS_ManipulatorOwner结合AIS_Manipulator类&#xff0c;允许用户通过可视化工具&#xff08;如旋转、平移、缩放等&#xff09;来操纵几何对象。 以下是AIS_ManipulatorOwner的基…...

如何防止用户通过打印功能复制页面文字

简单防白嫖&#xff0c;要让打印出来的页面是空白&#xff0c;通常的做法是在打印时隐藏页面上的所有内容。这可以通过CSS的媒体查询&#xff08;Media Queries&#xff09;来实现&#xff0c;特别是针对media print的查询。 在JavaScript中&#xff0c;你通常不会直接控制打印…...

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …...

基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)

构建监控平台数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示&#xff0c;运维团队可以迅速发现异常&#xff0c;优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…...

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植&#xff0c;并不对sfud的移植再进行过多的讲解了哦&#xff0c;所以如果想了解sfud的移植过程&#xff0c;请参考我的另外一篇文章&#xff1a;传送门 正文开始咯 首先我们需要先准备资料准备好&#xff0c;这里对于fatfs的…...

MySQL之视图和索引实战

1.新建数据库 mysql> create database myudb5_indexstu; Query OK, 1 row affected (0.01 sec) mysql> use myudb5_indexstu; Database changed 2.新建表 1.学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在…...

快速参考:用C# Selenium实现浏览器窗口缩放的步骤

背景介绍 在现代网络环境中&#xff0c;浏览器自动化已成为数据抓取和测试的重要工具。Selenium作为一个强大的浏览器自动化工具&#xff0c;能够与多种编程语言结合使用&#xff0c;其中C#是非常受欢迎的选择之一。在实际应用中&#xff0c;我们常常需要调整浏览器窗口的缩放…...

MyBatis 插件机制、分页插件如何实现的

MyBatis 插件机制允许开发者在 SQL 执行的各个阶段&#xff08;如预处理、执行、结果处理等&#xff09;中插入自定义逻辑&#xff0c;从而实现对 MyBatis 行为的扩展和增强。以下是 MyBatis 插件运行原理的详细介绍&#xff1a; 插件接口 MyBatis 插件通过实现 org.apache.i…...

CentOS6.0安装telnet-server启用telnet服务

CentOS6.0安装telnet-server启用telnet服务 一步到位 fp"/etc/yum.repos.d" ; cp -a ${fp} ${fp}.$(date %0y%0m%0d%0H%0M%0S).bkup echo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.163.com/centos-vault/6.0/os/$basearch/http://mirrors.a…...

H5+CSS+JS工作性价比计算器

工作性价比&#xff1d;平均日新x综合环境系数/35 x(工作时长&#xff0b;通勤时长—0.5 x摸鱼时长) x学历系数 如果代码中的公式不对&#xff0c;请指正 效果图 源代码 <!DOCTYPE html> <html> <head> <style> .calculator { width: 300px; padd…...

Linux:基础命令学习

目录 一、ls命令 实例&#xff1a;-l以长格式显示文件和目录信息 实例&#xff1a;-F根据文件类型在列出的文件名称后加一符号 实例&#xff1a; -R 递归显示目录中的所有文件和子目录。 实例&#xff1a; 组合使用 Home目录和工作目录 二、目录修改和查看命令 三、mkd…...

遇到Websocket就不会测了?别慌,学会这个Jmeter插件轻松解决....

websocket 是一种双向通信协议&#xff0c;在建立连接后&#xff0c;websocket服务端和客户端都能主动向对方发送或者接收数据&#xff0c;而在http协议中&#xff0c;一个request只能有一个response&#xff0c;而且这个response也是被动的&#xff0c;不能主动发起。 websoc…...

高性能 Java 本地缓存 Caffeine 框架介绍及在 SpringBoot 中的使用

在现代应用程序中&#xff0c;缓存是一种重要的性能优化技术&#xff0c;它可以显著减少数据访问延迟&#xff0c;降低服务器负载&#xff0c;提高系统的响应速度。特别是在高并发的场景下&#xff0c;合理地使用缓存能够有效提升系统的稳定性和效率。 Caffeine 是一个高性能的…...

Http 和 Https 的区别(图文详解)

在现代网络通信中&#xff0c;保护数据的安全性和用户的隐私是至关重要的。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是两种常见的网络通信协议&#xff0c;但它们在数据保护方面的能力存在…...

DP学习——外观模式

学而时习之&#xff0c;温故而知新。 外观模式 角色 2个角色&#xff0c;外观类&#xff0c;子系统类。 个人理解 感觉就是对外接口封装&#xff0c;这个是封装一个功能的对外接口&#xff0c;越简单越好&#xff0c;提供给第三方用。 应用场景 封装为对外库时&#xff…...

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …...

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 服务端配置&#xff1a; 客户端测试&#xff1a; 2、搭建一个Web服务器&#xff0c;客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置&#xff1a; 客户端…...

C++的UI框架和开源项目介绍

文章目录 1.QT2.wxWidgets3.Dear ImGui 1.QT QT的开源项目&#xff1a;QGIS&#xff08;地理信息系统&#xff09; https://github.com/qgis/QGIS?tabreadme-ov-file 2.wxWidgets wxWidgets的开源项目&#xff1a;filezilla https://svn.filezilla-project.org/svn/ wxWidg…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...