接入 SSL 认证配置:满足等保最佳实践
前言
随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安全传输。本文将详细介绍在等保要求下,如何为OpenGauss配置SSL客户端接入认证。
一、配置客户端接入认证
背景信息
如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为pg_hba.conf)存放在数据库的数据目录里。hba(host-based authentication)表示是基于主机的认证。
本产品支持如下三种认证方式,这三种方式都需要配置“pg_hba.conf”文件。
基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。
口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。
SSL加密:使用OpenSSL(开源安全通信库)提供服务器端和客户端安全连接的环境。
“pg_hba.conf”文件的格式是一行写一条信息,表示一个认证规则,空白和注释(以#开头)被忽略。
[omm@worker1 dn1]$ ls
base gswlm_userinfo.cfg pg_errorinfo pg_llog pg_replslot pg_twophase postgresql.conf.lock server.key
cacert.pem mot.conf pg_hba.conf pg_location pg_serial PG_VERSION postmaster.opts server.key.cipher
gaussdb.state pg_clog pg_hba.conf.bak pg_logical pg_snapshots pg_xlog postmaster.pid server.key.rand
global pg_csnlog pg_hba.conf.lock pg_multixact pg_stat_tmp postgresql.conf postmaster.pid.lock undo
gs_gazelle.conf pg_ctl.lock pg_ident.conf pg_notify pg_tblspc postgresql.conf.guc.bak server.crt
[omm@worker1 dn1]$ vim pg_hba.conf
每个认证规则是由若干空格和/,空格和制表符分隔的字段组成。如果字段用引号包围,则它可以包含空白。一条记录不能跨行存在。
1. 以操作系统用户omm登录数据库主节点。
2. 配置客户端认证方式
允许客户端以“jack”用户连接到本机,此处远程连接禁止使用“omm”用户(即数据库初始化用户)。
例如,下面示例中配置允许IP地址为192.0.2.121的客户端访问本机。
gs_guc set -N all -I all -h “host all jack 192.0.2.121/32 sha256”
[omm@worker1 dn1]$ gs_guc set -N all -I all -h "host all jack 192.0.2.121/32 sha256"
The gs_guc run with the following arguments: [gs_guc -N all -I all -h host all jack 192.0.2.121/32 sha256 set ].
Begin to perform the total nodes: 1.
Popen count is 1, Popen success count is 1, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 1, Command success count is 1, Command failure count is 0.
Total instances: 1. Failed instances: 0.
ALL: Success to perform gs_guc!
[omm@worker1 dn1]$
3. 创建“jack”用户
使用“jack”用户前,需先本地连接数据库,并在数据库中使用如下语句建立“jack”用户:
CREATE USER jack PASSWORD ‘Test@123’;
[root@worker1 mnt]# su - omm
Last login: Mon Jun 10 10:04:09 CST 2024 on pts/1
[omm@worker1 ~]$ gsql -d postgres -p 15000
gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=# CREATE USER jack PASSWORD 'Test@123';
CREATE ROLE
openGauss=#
-N all表示openGauss的所有主机。
-I all表示主机的所有实例。
-h表示指定需要在“pg_hba.conf”增加的语句。
all表示允许客户端连接到任意的数据库。
jack表示连接数据库的用户。
192.0.2.121/32表示只允许IP地址为192.0.2.121的主机连接。此处的IP地址不能为openGauss内的IP,在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255。
sha256表示连接时jack用户的密码使用sha256算法加密。
这条命令在数据库主节点实例对应的“pg_hba.conf”文件中添加了一条规则,用于对连接数据库主节点的客户端进行鉴定。
“pg_hba.conf”文件中的每条记录可以是下面四种格式之一,四种格式的参数说明请参见配置文件参考。
[omm@worker1 dn1]$ vim pg_hba.conf
local DATABASE USER METHOD [OPTIONS]
host DATABASE USER ADDRESS METHOD [OPTIONS]
hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
因为认证时系统是为每个连接请求顺序检查“pg_hba.conf”里的记录的,所以这些记录的顺序是非常关键的。
说明:
在配置“pg_hba.conf”文件时,请依据通讯需求按照格式内容从上至下配置记录,优先级高的需求需要配置在前面。openGauss和扩容配置的IP优先级最高,用户手动配置的IP请放在这二者之后,如果已经进行的客户配置和扩容节点的IP在同一网段,请在扩容前删除,扩容成功后再进行配置。
因此对于认证规则的配置建议如下: 靠前的记录有比较严格的连接参数和比较弱的认证方法。靠后的记录有比较宽松的连接参数和比较强的认证方法。
说明:
一个用户要想成功连接到特定的数据库,不仅需要通过pg_hba.conf中的规则检查,还必须要有该数据库上的CONNECT权限。如果希望控制某些用户只能连接到指定数据库,赋予/撤销CONNECT权限通常比在pg_hba.conf中设置规则更为简单。
4. 配置客户端认证示例
对应openGauss外部客户端连接,trust为不安全的认证方式,请将认证方式设置为sha256。
[omm@worker1 dn1]$ vim pg_hba.conf
示例
TYPE DATABASE USER ADDRESS METHOD
“local” is for Unix domain socket connections only
#表示只允许以安装时-U参数指定的用户从服务器本机进行连接。
local all all trust
IPv4 local connections:
#表示允许jack用户从192.0.2.121主机上连接到任意数据库,使用sha256算法对密码进行加密。
host all jack 192.0.2.121/32 sha256
#表示允许任何用户从192.0.2.121/24网段的主机上连接到任意数据库,使用sha256算法对密码进行加密,并且经过SSL加密传输。
hostssl all all 192.0.2.121/24 sha256
#表示禁止任何用户从192.0.2.121/32网段的主机上连接到任意数据库。
host all all 192.0.2.121/32 reject
二、SSL证书管理
openGauss默认配置了通过openssl生成的安全证书、私钥。
1、证书生成
在测试环境下,用户可以用通过以下方式进行数字证书测试。在客户的运行环境中,请使用从CA认证中心申请的数字证书。
2、自认证证书生成过程
2.1 搭建CA环境。
–假设用户为omm已存在,搭建CA的路径为test
–以root用户身份登录Linux环境,切换到用户omm
[root@worker1 ~]# su - omm
Last login: Tue Jun 4 22:05:29 CST 2024 on pts/0
[omm@worker1 ~]$ ls
gaussdb_tmp
[omm@worker1 ~]$ mkdir test
[omm@worker1 ~]$ cd /etc/pki/tls/
[omm@worker1 tls]$ ls
cert.pem certs misc openssl.cnf private
[omm@worker1 tls]$
–copy 配置文件openssl.cnf到test下
[omm@worker1 tls]$ ls
cert.pem certs misc openssl.cnf private
[omm@worker1 tls]$ cp openssl.cnf ~/test
[omm@worker1 tls]$ cd ~/test
[omm@worker1 test]$ ls
openssl.cnf
[omm@worker1 test]$
–到test文件夹下,开始搭建CA环境
–创建文件夹demoCA./demoCA/newcerts./demoCA/private
[omm@worker1 test]$ mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
[omm@worker1 test]$ chmod 700 ./demoCA/private
[omm@worker1 test]$
–创建serial文件,写入01
[omm@worker1 test]$ echo '01'>./demoCA/serial
–创建文件index.txt
[omm@worker1 test]$ touch ./demoCA/index.txt
[omm@worker1 test]$
–修改openssl.cnf配置文件中的参数
[omm@worker1 test]$ ls
demoCA openssl.cnf
[omm@worker1 test]$ vim openssl.cnf
dir = ./demoCA
default_md = sha256
–至此CA环境搭建完成
2.2 生成根私钥。
–生成CA私钥
[omm@worker1 test]$
[omm@worker1 test]$ openssl genrsa -aes256 -out demoCA/private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................+++++
..................+++++
e is 65537 (0x010001)
Enter pass phrase for demoCA/private/cakey.pem:
–设置根私钥的保护密码,假设为Test@123
Enter pass phrase for demoCA/private/cakey.pem:
–再次输入私钥密码 Test@123
Verifying - Enter pass phrase for demoCA/private/cakey.pem:
2.3 生成根证书请求文件。
–生成CA根证书申请文件careq.pem
[omm@worker1 test]$
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem
Enter pass phrase for demoCA/private/cakey.pem:
–输入根私钥密码 Test@123
[omm@worker1 test]$
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem
Enter pass phrase for demoCA/private/cakey.pem:
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) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
Common Name (eg, your name or your server's hostname) []:open
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[omm@worker1 test]$
2.4 生成自签发根证书。
–生成根证书时,需要修改openssl.cnf文件,设置basicConstraints=CA:TRUE
[omm@worker1 test]$ vim openssl.cnf
–生成CA自签发根证书
[omm@worker1 test]$
[omm@worker1 test]$ openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem
Using configuration from openssl.cnf
Enter pass phrase for demoCA/private/cakey.pem:
–输入根私钥密码 Test@123
[omm@worker1 test]$ openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem
Using configuration from openssl.cnf
Enter pass phrase for demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jun 9 06:58:22 2024 GMT
Not After : Jun 9 06:58:22 2025 GMT
Subject:
countryName = CN
stateOrProvinceName = shanxi
organizationName = Abc
organizationalUnitName = hello
commonName = world
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
X509v3 Authority Key Identifier:
keyid:2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
Certificate is to be certified until Jun 9 06:58:22 2025 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[omm@worker1 test]$
–至此CA根证书自签发完成,根证书demoCA/cacert.pem。
2.5 生成服务端证书私钥。
–生成服务端私钥文件server.key
[omm@worker1 test]$ openssl genrsa -aes256 -out server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................+++++
...................................................................................................+++++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
[omm@worker1 test]$
–服务端私钥的保护密码,假设为Test@123
Verifying - Enter pass phrase for server.key:
–再次确认服务端私钥的保护密码,即为Test@123
2.6 生成服务端证书请求文件。
–生成服务端证书请求文件server.req
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key server.key -out server.req
Enter pass phrase for server.key:
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.
-----
–以下填写的信息与创建CA时的信息一致
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
Common Name (eg, your name or your server's hostname) []:world
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[omm@worker1 test]$
2.7 生成服务端证书。
–生成服务端/客户端证书时,修改openssl.cnf文件,设置basicConstraints=CA:FALSE
[omm@worker1 test]$ vim openssl.cnf
–修改demoCA/index.txt.attr中属性为no。
[omm@worker1 test]$ vim demoCA/index.txt.attr
–对生成的服务端证书请求文件进行签发,签发后将生成正式的服务端证书server.crt
[omm@worker1 test]$ openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 -md sha256
Using configuration from openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 2 (0x2)
Validity
Not Before: Jun 9 07:07:00 2024 GMT
Not After : Jun 7 07:07:00 2034 GMT
Subject:
countryName = CN
stateOrProvinceName = shanxi
organizationName = Abc
organizationalUnitName = hello
commonName = world
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
2B:E3:44:16:67:1B:D1:27:C8:8D:9C:F1:02:72:3C:59:D8:26:B0:47
X509v3 Authority Key Identifier:
keyid:2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
Certificate is to be certified until Jun 7 07:07:00 2034 GMT (3650 days)
Sign the certificate? [y/n]:
–选择y对证书进行签发
Sign the certificate? [y/n]:y
–选择y,证书签发结束
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
去掉私钥密码保护,方法如下:
–去掉服务端私钥的密码保护
[omm@worker1 test]$ openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
[omm@worker1 test]$
–如果不去掉服务端私钥的密码保护需要使用gs_guc工具对存储密码进行加密保护
[omm@worker1 test]$ gs_guc encrypt -M server -D ./
The gs_guc run with the following arguments: [gs_guc -M server -D ./ encrypt ].
Password:
gs_guc encrypt -M server
[omm@worker1 test]$
–根据提示输入服务端私钥的密码,加密后会生成server.key.cipher,server.key.rand两个私钥密码保护文件
2.8 客户端证书,私钥的生成。
生成客户端证书和客户端私钥的方法和要求与服务端相同。
–生成客户端私钥
[omm@worker1 test]$ openssl genrsa -aes256 -out client.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
...................................................+++++
e is 65537 (0x010001)
Enter pass phrase for client.key:
Verifying - Enter pass phrase for client.key:
[omm@worker1 test]$
–生成客户端证书请求文件
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key client.key -out client.req
Enter pass phrase for client.key:
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) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
Common Name (eg, your name or your server's hostname) []:world
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[omm@worker1 test]$
–对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书client.crt
[omm@worker1 test]$ openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 -md sha256
Using configuration from openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 3 (0x3)
Validity
Not Before: Jun 9 07:15:47 2024 GMT
Not After : Jun 7 07:15:47 2034 GMT
Subject:
countryName = CN
stateOrProvinceName = shanxi
organizationName = Abc
organizationalUnitName = hello
commonName = world
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
1C:2C:1A:11:FE:56:55:E5:71:78:60:AF:C3:89:B5:7C:E2:C8:DF:F6
X509v3 Authority Key Identifier:
keyid:2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
Certificate is to be certified until Jun 7 07:15:47 2034 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[omm@worker1 test]$
去掉私钥密码保护,方法如下:
–去掉客户端私钥的密码保护
[omm@worker1 test]$ openssl rsa -in client.key -out client.key
Enter pass phrase for client.key:
writing RSA key
[omm@worker1 test]$
–如果不去掉客户端私钥的密码保护需要使用gs_guc工具对存储密码进行加密保护
[omm@worker1 test]$ gs_guc encrypt -M client -D ./
The gs_guc run with the following arguments: [gs_guc -M client -D ./ encrypt ].
Password:
gs_guc encrypt -M client
[omm@worker1 test]$
–根据提示输入客户端私钥的密码,加密后会生成client.key.cipher,client.key.rand两个私钥密码保护文件。
将客户端密钥转化为DER格式,方法如下:
[omm@worker1 test]$ openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
[omm@worker1 test]$ ls
client.crt client.key.cipher client.key.rand demoCA server.crt server.key.cipher server.req
client.key client.key.pk8 client.req openssl.cnf server.key server.key.rand
[omm@worker1 test]$
三、用SSL进行安全的TCP/IP连接
openGauss支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。
前提条件:
从CA认证中心申请到正式的服务器、客户端的证书和密钥。(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)
当用户远程连接到数据库主节点时,需要使用sha256的认证方式。
当内部服务器之间连接时,需要使用trust的认证方式,支持IP白名单认证。
openGauss在数据库部署完成后,默认已开启SSL认证模式。服务器端证书,私钥以及根证书已经默认配置完成。用户需要配置客户端的相关参数。
1、配置客户端参数。
已从CA认证中心申请到客户端默认证书,私钥,根证书以及私钥密码加密文件。假设证书、私钥和根证书都放在“/home/omm”目录。
[omm@worker1 test]$ ls
client.crt client.key.cipher client.key.rand demoCA server.crt server.key.cipher server.req
client.key client.key.pk8 client.req openssl.cnf server.key server.key.rand
[omm@worker1 test]$ pwd
/home/omm/test
[omm@worker1 test]$
1.1 双向认证需配置如下参数:
[omm@worker1 test]$
[omm@worker1 test]$ export PGSSLCERT="/home/omm/test/client.crt"
[omm@worker1 test]$ export PGSSLKEY="/home/omm/test/client.key"
[omm@worker1 test]$ export PGSSLMODE="verify-ca"
[omm@worker1 test]$ export PGSSLROOTCERT="/home/omm/test/cacert.pem"
[omm@worker1 test]$
1.2 单向认证需要配置如下参数:
export PGSSLMODE=“verify-ca”
export PGSSLROOTCERT="/home/omm/cacert.pem"
2、修改客户端密钥的权限。
客户端根证书,密钥,证书以及密钥密码加密文件的权限,需保证权限为600。如果权限不满足要求,则客户端无法以SSL连接到openGauss。
[omm@worker1 test]$ chmod 600 client.key
[omm@worker1 test]$ chmod 600 client.crt
[omm@worker1 test]$ chmod 600 client.key.cipher
[omm@worker1 test]$ chmod 600 client.key.rand
[omm@worker1 test]$ chmod 600 cacert.pem
[omm@worker1 test]$
须知: 从安全性考虑,建议使用双向认证方式。 配置客户端环境变量,必须包含文件的绝对路径。
3、验证SSL配置
使用支持SSL的数据库客户端工具(如gsql、psql等)连接到OpenGauss服务器,并检查连接是否使用了SSL。可以通过客户端工具的输出或服务器的日志文件来验证SSL连接是否成功建立。
[omm@worker1 test]$ gsql "sslmode=require host=192.0.2.121 port=15000 user=omm dbname=postgres"
gsql: FATAL: Forbid remote connection with initial user.
[omm@worker1 test]$ gsql "sslmode=require host=192.0.2.121 port=15000 user=jack dbname=postgres"
Password:
gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.
openGauss=>
显示SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
说明使用了SSL
结语:
本文介绍了在等保要求下为openGauss配置SSL客户端接入认证的过程。通过启用SSL、配置客户端接入认证规则以及验证SSL连接等步骤,可以确保OpenGauss数据库与客户端之间通信的安全性。在配置SSL时,请确保你使用的证书和私钥是有效的,并且与你的openGauss服务器和客户端兼容。同时,需要注意证书管理、权限控制、日志记录和备份恢复等方面的问题,注意保护你的SSL证书和私钥文件,以防止未经授权的访问和使用。如果你在生产环境中使用openGauss,请确保你遵循最佳的安全实践和标准来配置和管理你的SSL连接。以确保整个系统的安全性。
相关文章:

接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...

微软AutoGen高级功能——Selector Group Chat
介绍 大家好,这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊),"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客,但是并没有详…...

w206基于Spring Boot的农商对接系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…...

深度求索—DeepSeek API的简单调用(Java)
DeepSeek简介 DeepSeek(深度求索)是由中国人工智能公司深度求索(DeepSeek Inc.)研发的大规模语言模型(LLM),专注于提供高效、智能的自然语言处理能力,支持多种场景下的文本生成、对…...
flv实时监控视频
文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时,可能需要在大屏上展示一个监控画面,此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...

有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
跟着ai辅助学习vue3
第一章:基础入门(1 - 2 周) 1. 了解 Vue 3 概述 阅读官方文档简介 访问 Vue 3 官方文档,在首页或简介板块中,重点了解 Vue 3 相较于 Vue 2 的重大变革。比如,Vue 3 采用了 Proxy 实现响应式系统ÿ…...
什么是Mustache
Mustache 是一种轻量级模板引擎,用于将变量插入到模板中生成最终的文本输出。它的设计简单且易于使用,适用于多种编程语言,包括 JavaScript、Python、Ruby、Java 等。 Mustache 的模板语法使用双大括号 {{}} 包裹变量或表达式,用…...

C++,STL容器适配器,priority_queue:优先队列深入解析
文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 二叉堆结构2. 容器适配器架构三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义优先队列四、实战应用场景1. 任务调度系统2. 合并K个有序链表五、性能优化策略1. 底层容器选择2. 批量建堆优化六、注意事项…...

1.综述 Google 的软件工程读书笔记
Google 的软件工程由Google的多位资深工程师合著,分享了他们在管理Google庞大代码库(超过20亿行代码)过程中总结的经验教训。这本书不仅涵盖了软件工程的理论知识,还结合了Google的实际案例,展示了如何在大规模、复杂的…...
vue框架生命周期详细解析
Vue.js 的生命周期钩子函数是理解 Vue 组件行为的关键。每个 Vue 实例在创建、更新和销毁过程中都会经历一系列的生命周期阶段,每个阶段都有对应的钩子函数,开发者可以在这些钩子函数中执行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分为以下几…...

复杂电磁环境下无人机自主导航增强技术研究报告——地磁匹配与多源数据融合方法,附matlab代码
本文给出介绍和matlab程序,来实现地磁辅助惯性导航仿真验证,包含地磁基准图构建、飞行轨迹生成、INS误差建模、地磁匹配定位及多源数据融合等模块。通过对比分析验证地磁匹配修正惯性导航累积误差的有效性,可视化显示卫星拒止环境下的航迹修正…...

蓝桥杯---排序数组(leetcode第912题)
文章目录 1.题目重述2.思路分析3.代码解释 1.题目重述 题目的要求是不使用库函数或者是其他的内置的函数(就是已经实现好的函数),也就是这个排序的逻辑需要我们自己进行实现; 2.思路分析 其实这个例子也是很容易理解的ÿ…...
考研高数复习规范
前言 这里记录我的高数复习规范与规划,希望能给需要考研的同学一点启发 规范原因 高数的内容很多,关键的是:会做题、拿高分首先最重要的就是抓住概念。比如有界无界的概念,间断点的概念、极限的概念其次是做题过程中得到的方法…...

Stable diffusion只换衣服的方法
大概看了几个帖子感觉说的都不是很清楚,也大部分都是保持人物一致性,不能只改变衣服,自己摸索了一下,需要使用三个controlnet:一个openpose、一个lineart,一个depth,三个controlnet使用同一个参…...

无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB
一、梦境优化算法 梦境优化算法(Dream Optimization Algorithm,DOA)是一种新型的元启发式算法,其灵感来源于人类的梦境行为。该算法结合了基础记忆策略、遗忘和补充策略以及梦境共享策略,通过模拟人类梦境中的部分记忆…...

LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装
LlamaFactory https://llamafactory.readthedocs.io/zh-cn/latest/ 安装 必须保证版本匹配,否则到训练时,找不到gpu cuda。 否则需要重装。下面图片仅供参考。因为cuda12.8装了没法用,重新搞12.6 cudacudnnpytorch12.69.612.6最新…...
算法12-贪心算法
一、贪心算法概念 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解的算法。贪心算法的核心思想是“局部最优,全局最优”,即通过一系列局部最优选择,最…...

js实现点击音频实现播放功能
目录 1. HTML 部分:音频播放控件 2. CSS 部分:样式设置 3. JavaScript 部分:音频控制 播放和暂停音频: 倒计时更新: 播放结束后自动暂停: 4. 总结: 完整代码: 今天通过 HTML…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...