cfssl简单使用
1、安装
方式1:直接下载
详见:手动生成证书 | Kubernetes
# 1、下载cfssl、cfssljson、cfssl-certinfo
# cfssl:用于签发证书
# cfssljson:将cfssl签发生成的证书(json格式)变成文件承载式文件
# cfssl-certinfo:验证查看证书信息
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo# 2、给cfssl、cfssljson、cfssl-certinfo添加可执行权限
chmod +x /usr/local/bin/cfssl*
方式2:源码编译
详见:https://github.com/cloudflare/cfssl
安装go:
# 1、下载页面:https://go.dev/dl/# 2、下载go
wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz# 3、解压
tar -xf go1.21.6.linux-amd64.tar.gz# 4、移动go到/usr/local/go
mv go /usr/local/go# 5、添加到环境变量
vi /root/.bash_profile # 6、/root/.bash_profile文件内容:
# 内容开始----------------------------------------------
# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi# User specific environment and startup programs
# 【此处添加go相关信息,并追加到PATH环境变量中】
GO_PATH=/usr/local/go/binPATH=$PATH:$HOME/bin:$GO_PATHexport PATH
# 内容结束----------------------------------------------# 7、使环境变量生效
source /root/.bash_profile# 8、在任意目录执行
go version
安装cfssl:
# 1、下载页面:https://github.com/cloudflare/cfssl/releases# 2、下载cfssl
wget https://github.com/cloudflare/cfssl/archive/refs/tags/v1.6.4.tar.gz -O cfssl-1.6.4.tar.gz# 3、解压
tar -xf cfssl-1.6.4.tar.gz# 4、进入目录
cd cfssl-1.6.4# 5、编译
make# 6、查看编译后的可执行文件
ls bin# 7、可将bin目录下的文件移动到/usr/local/bin
# 移动部分可执行文件
mv cfssl /usr/local/bin/cfssl
mv cfssl-certinfo /usr/local/bin/cfssl-certinfo
mv cfssljson /usr/local/bin/cfssljson
2、使用
https://github.com/cloudflare/cfssl/tree/master
查看某个命令使用:cfssl [command] -help,其中[command]为某个命令名称
# cfssl命令,cfssl 或者 cfssl -help 或者 cfssl -h 或者 cfssl [command] -h
cfsslNo command is given.
Usage:
Available commands:ocspdumprevoke 吊销证书info 获取签名者信息serve 启动HTTP API服务器genkey 生成私钥和证书请求ocspservescanselfsign 生成自签证书bundle 生成证书bundlecertinfo 查看证书信息ocsprefreshocspsignprint-defaults 打印默认配置sign 签名证书version 查看版本gencert 生成私钥和证书gencrl 生成新的证书吊销列表
Top-level flags:-allow_verification_with_non_compliant_keysAllow a SignatureVerifier to use keys which are technically non-compliant with RFC6962.-loglevel intLog level (0 = DEBUG, 5 = FATAL) (default 1)
2.1、print-defaults
2.1.1、查看config配置
# 查看config默认配置
cfssl print-defaults config# 默认配置数据
{"signing": {"default": {"expiry": "168h"},"profiles": {"www": {"expiry": "8760h","usages": ["signing","key encipherment","server auth"]},"client": {"expiry": "8760h","usages": ["signing","key encipherment","client auth"]}}}
}
- expiry:8760h,表示8760h/24=365天有效期
- profiles:指定证书使用场景,后续签名生成证书及其私钥时需要指定该场景(profile)名称
- signing:表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE
- server auth:表示 client 可以用该该证书对 server 提供的证书进行验证
- client auth:表示 server 可以用该该证书对 client 提供的证书进行验证
2.1.2、查看csr配置
# 查看csr默认配置
cfssl print-defaults csr# csr默认数据
{"CN": "example.net","hosts": ["example.net","www.example.net"],"key": {"algo": "ecdsa","size": 256},"names": [{"C": "US","L": "CA","ST": "San Francisco"}]
}
CN字段说明:
- CN:Common Name,所有csr文件都必须有字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名。
hosts字段说明:
- hosts:网络请求url中的合法主机名或域名集合。
注意:
1) 超过该集合范围的任何请求都不会被支持认证通过。
2) CA根证书及其私钥创建过程不需要甚至该字段。其它服务证书创建必须有该字段。
3) hosts设置技巧:一般都把"127.0.0.1"包含进去;推荐使用域名或vip(vip即虚拟ip),尽量不要用ip地址,否则后期遇到某个服务所在机器宕机要重新更换某1台或多台机器时会面临证书认证不通过的毁灭性尴尬情况,导致扩容失败,集群服务面临毁灭性灾难。这里强烈推荐用域名或vip地址,另外,如果有条件,配置之处建议多预留1-3个host地址,防止后期扩容困难
key字段说明:
- key:key字段是必须有的字段,其内容一般也比较固定就是:{"algo":"rsa”,"size":2048},表示使用的加密算法rsa,密文长度2048。:
names字段说明:
- C:(Country)所在国家简称,只能是国家字母缩写,如中国:CN
- L:(Locality) 所在地区/城市简称,如Beijing/San Francisco
- ST:(State/Provice)所在州/省份简称,如Beijing/California
- O:(Organization Name) 单位名称,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称
- OU:(other)显示其他内容,常见的内容值有“System"、"Website"等
2.2、genkey
# genkey命令
cfssl genkey -h# genkey命令说明cfssl genkey -- generate a new key and CSRUsage of genkey:cfssl genkey CSRJSONArguments:CSRJSON: JSON file containing the request, use '-' for reading JSON from stdinFlags:-initca=false: initialise new CA-config="": path to configuration file
csr.json文件:
{"CN": "test","hosts": ["example.com","www.example.com","https://www.example.com","jdoe@example.com","127.0.0.1"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "US","L": "San Francisco","O": "Internet Widgets, Inc.","OU": "WWW","ST": "California"}]
}
2.2.1、生成证书签名请求和私钥
# 生成证书签名请求和私钥
cfssl genkey csr.json# 显示结果{"csr":"证书签名请求","key":"私钥"}
{"csr":"-----BEGIN CERTIFICATE REQUEST-----\nMIIDKDCCAhACAQAweDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEx\nFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdl\ndHMsIEluYy4xDDAKBgNVBAsTA1dXVzENMAsGA1UEAxMEdGVzdDCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBALiGBaS3cwbvPiCMn7E4Gtv8RcwhNssoZG64\nF9sK0Zdg4nlBz6/MJg23cRAPPgxUfFXd/Ad1S3K1xiOOW/Ron7pY4MIAfBXDv4NZ\n2w+Vz4tAGVIW32178dkRzFh9DcYSK0bTkJoHqxJ0uPr5cUcB8EmDkqoi2k4pp6lL\nfNaHP/CMz/fcYUuFEhKGrwQjVUpudcFSGbEYExw9omjLTXPcv5ETCM+99ykq4M/g\nfrE8c1AOO9E7faOJ6DUzCoG1COL92wuQa8U4gqfQL944VodoW62nQLo0ldHbCerW\n1AuX2Jx/hRtproPo+MHOn71eiKm/uqZNHyzXJuW6/GX/tQvkjN8CAwEAAaBrMGkG\nCSqGSIb3DQEJDjFcMFowWAYDVR0RBFEwT4ILZXhhbXBsZS5jb22CD3d3dy5leGFt\ncGxlLmNvbYIXaHR0cHM6Ly93d3cuZXhhbXBsZS5jb22BEGpkb2VAZXhhbXBsZS5j\nb22HBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAEW4O5auXbUPhjPiknlydWMINGJ3\nk6+/zq/9J7gBaTrRH/wSeXJrbekrww/1tkRCUFLCQgczWgcaKO34j0nWIsUOSIdl\nytpzVheiB3+WIot62N6rBOpiCSRXOs9KWA1cK7lz8UcBi1GdgeEekXZSd3LJswO6\nLCTwM1dJUxzNDBHrS/UwGINBteLnqIK4O9pJHG564u1ArMncErs0tSCH7zOPcQWp\n1zbw2rL1LMo/ej8SNyr5LdlZJ9fqI6DQi0etUYUVmt/ErM86/SpIlPTL2a6I6fFb\nJ/L3K0oCEL9LC/CNMB8ZxTLjoqSgoCwlr4V54amiel31ewly2rbNCqRItgc=\n-----END CERTIFICATE REQUEST-----\n","key":"-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAuIYFpLdzBu8+IIyfsTga2/xFzCE2yyhkbrgX2wrRl2DieUHP\nr8wmDbdxEA8+DFR8Vd38B3VLcrXGI45b9GifuljgwgB8FcO/g1nbD5XPi0AZUhbf\nbXvx2RHMWH0NxhIrRtOQmgerEnS4+vlxRwHwSYOSqiLaTimnqUt81oc/8IzP99xh\nS4USEoavBCNVSm51wVIZsRgTHD2iaMtNc9y/kRMIz733KSrgz+B+sTxzUA470Tt9\no4noNTMKgbUI4v3bC5BrxTiCp9Av3jhWh2hbradAujSV0dsJ6tbUC5fYnH+FG2mu\ng+j4wc6fvV6Iqb+6pk0fLNcm5br8Zf+1C+SM3wIDAQABAoIBAHG03Mto5HAUg2NJ\nZKqvWRXQei5VFU/Rnzn/JWwsWYWABW8VV+cL1TNEpF5yFhlBArFjLohmBk00qFmG\nwzF0O2F4nV/PLqe2zVAi0fPjrFYx9Kh6QcpUw26xIgwxW4h/770gaA4SxZ+E3+yA\nRAausiSK+JjxCzd5QcD4LICCLauL/kFgIjNajTjGfjVmsDJDUF9Q5kUbcfnEj0+d\nTIG9k6XzkAgboS7o6dBK0BXDrWr2Btnzmbf0eJUXFVZkpYaHcwgqo988e8ubsoBb\niq33BDyH5+VGc/Vr5BwRoAxQOdx0JgISKMv09l0fD/DvIHivymIw5BYgn8c2/bOL\nLCDPn6kCgYEA1dp9cbXvMsG+2gEOwnTeQlrY7P3Wa5FcGtF3n6Z4ZF2D+SdwcdgO\nKPepwHe9yMYDnfQkj8eoAd6evgnAXyCqXCrFD9V83S3qj8Pdo8mw2hTcxfx6kYNX\ny5zpdgnEH6tYXr0qaGZs5WUv+q372lG8OfGfMGRrLpJVG3rTd/beDKMCgYEA3OPA\n2b5Qo/5Ejt8u7wJ/Q+wKWKx5vcWgl7KHqgfGB/+0X19OIKGcQQTa+J2dQCkfM1ZL\nYuegmtMavvQ5rrpNGJT7bwr+pjedB9cSbvr9zEkgw1cj/ZNSxak6tV130ZVr3864\nADBm2CYWyyUO26fz9yf9fdqNl7U8QEDta9uNJpUCgYB7nn19SeonsQ+d/ZaGmgAQ\n42saM/HK5JAVgJhh1V0qx1QOptm9NWOaEvAxrgYrFSvqFsM7yfI4gnPI7uIhG0Tf\nWmnnqUUwpeY9jL+GeoSczAqC+Fvx2bbaoK3j6elRVT8UJM1q5Cp2wHNnuUMpBK6F\n4EJhOusqVLSV2f58Dlx1eQKBgCC/UzP01xe49okH5XlhsWRsdgw3ZcUQq4JR4XL/\nvAgrjJ4nDvofe37YLW52T33XmtyNipebJ2BMs8Zjhrm0vQFL9Qq9YotZ61niNMVn\nSIEkxkqvfJJ3aOoM8Ls6pCzaLif8CaNdiaG5498yG0XNXInjz9z8rck0AT61YX2A\nCykRAoGAPbr3tp/XbRWDUvZNrK+lAhUEFjuFU9pBQFqBPTlFS45OrotE806QVrYi\n4vcYqvHbSypSecI10DEE7RbxIYaCr9pMqdPvlUkopp1mw5hmZprn5lE2Gz0Y/dv0\n+Aso0bCLAT7H7hx9/58h9y4IBbFOVop7g0wnZS/t18NqgO+PHE8=\n-----END RSA PRIVATE KEY-----\n"}
2.2.2、生成自签名根 CA 证书和私钥
# 生成自签名根 CA 证书和私钥
cfssl genkey -initca csr.json | cfssljson -bare ca# 查看文件列表
ls# 显示内容,输出中将出现三个 PEM 编码的实体:私钥、csr 和自签名证书
ca.csr ca-key.pem ca.pem csr.json
2.3、gencert
# 查看gencert命令
cfssl gencert -h# gencert命令说明cfssl gencert -- generate a new key and signed certificateUsage of gencert:Generate a new key and cert from CSR:cfssl gencert -initca CSRJSONcfssl gencert -ca cert -ca-key key [-config config] [-profile profile] [-hostname hostname] CSRJSONcfssl gencert -remote remote_host [-config config] [-profile profile] [-label label] [-hostname hostname] CSRJSONRe-generate a CA cert with the CA key and CSR:cfssl gencert -initca -ca-key key CSRJSONRe-generate a CA cert with the CA key and certificate:cfssl gencert -renewca -ca cert -ca-key keyArguments:CSRJSON: JSON file containing the request, use '-' for reading JSON from stdinFlags:-initca=false: initialise new CA-remote="": remote CFSSL server-ca="": CA used to sign the new certificate-ca-key="": CA private key-config="": path to configuration file-hostname="": Hostname for the cert, could be a comma-separated hostname list-profile="": signing profile to use-label="": key label to use in remote CFSSL server
利用CA根证书及其私钥文件签发生成其它证书及其私钥
步骤如下:
- 创建CA根证书配置文件(ca-config.json、ca-csr.json)、目标证书签名请求文件(server-csr.json)
- 生成CA根证书及其私钥
- 生成目标证书和私钥
- 校验证书
详见:手动生成证书 | Kubernetes
2.3.1、创建文件
ca-config.json文件(用来生成 CA 文件):
CA根证书配置文件,一般命名为ca-config.json,它用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景 (profile)。
{"signing": {"default": {"expiry": "8760h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "8760h"}}}
}
ca-csr.json文件(用于 CA 证书签名请求):
{"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names":[{"C": "<country>","ST": "<state>","L": "<city>","O": "<organization>","OU": "<organization unit>"}]
}
server-csr.json文件(用来为 API 服务器生成秘钥和证书):
{"CN": "kubernetes","hosts": ["127.0.0.1","<MASTER_IP>","<MASTER_CLUSTER_IP>","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "<country>","ST": "<state>","L": "<city>","O": "<organization>","OU": "<organization unit>"}]
}
2.3.2、生成CA根证书及其私钥
生成 CA 秘钥文件(ca-key.pem
)和证书文件(ca.pem
)
# 生成CA根证书及其私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca# 使用命令ls查看文件列表
ca.csr ca-csr.json ca-key.pem ca.pem# 注意:cfssljson -bare + 命名文件名,
# 如本例中的ca,表示生成ca.pem和ca-key.pem,分别为证书和私钥文件。
# 生成的ca.pem是CA根证书文件,ca-key.pem是其私钥文件。
# 至此,CA根证书及其私钥文件已经生成,便可以用它们来签发其他认证文件了。
2.3.3、根据CA根证书及其私钥签名生成目标证书和私钥
生成秘钥和证书,默认会分别存储为server-key.pem
和 server.pem
两个文件。
# 生成目标证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \--config=ca-config.json -profile=kubernetes \server-csr.json | cfssljson -bare server# 参数说明;
# -ca: 根证书
# -ca-key: 根秘钥
# -config: 根证书的配置文件(里面定义了很多场景)
# -profile: 选择根证书配置文件里的一个场景
# server-csr.json : 申请证书的对象的相关信息配置文件
# -bare:制造的证书文件的文件名称(或前缀)# 使用ls命令查看文件列表
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server.csr server-csr.json server-key.pem server.pem
2.3.4、校验证书
# 方式1:使用openssl命令校验证书
openssl x509 -noout -text -in etcd.pem# 说明:
# 确认 Issuer 字段的内容和 ca-csr.json 一致;
# 确认 Subject 字段的内容和 etcd-csr.json 一致;
# 确认 X509v3 Subject Alternative Name 字段的内容和 etcd-csr.json 一致;
# 确认 X509v3 Key Usage、Extended Key Usage 字段的内容和 ca-config.json 中 etcd-opprofile 一致;# 方式2:使用cfssl-certinfo命令校验证书
cfssl-certinfo -cert ca.pem
详见:
https://github.com/cloudflare/cfssl
Introducing CFSSL - CloudFlare's PKI toolkit
手动生成证书 | Kubernetes
CloudFlare 开源证书管理工具 cfssl 详细使用教程 - 知乎
cfssl自签CA证书用于TLS/SSL认证技术指南
cfssl使用方法重新整理说明-CSDN博客
我在B站学运维之SSL与TLS协议原理与证书签名多种生成方式实践指南 - 哔哩哔哩
cfssl证书工具_Star-Seven的技术博客_51CTO博客
相关文章:
cfssl简单使用
1、安装 方式1:直接下载 详见:手动生成证书 | Kubernetes # 1、下载cfssl、cfssljson、cfssl-certinfo # cfssl:用于签发证书 # cfssljson:将cfssl签发生成的证书(json格式)变成文件承载式文件 # cfssl-certinfo:验…...

基于Word2vec词聚类的关键词实现
一.基于Word2vec词聚类的关键词步骤 基于Word2Vec的词聚类关键词提取包括以下步骤: 1.准备文本数据:收集或准备文本数据,可以是单一文档或文档集合,涵盖关键词提取的领域。2.文本预处理:清洗文本数据,去除…...

开源项目_大模型应用_Chat2DB
1 基本信息 项目地址:https://github.com/chat2db/Chat2DBStar:10.7K 2 功能 Chat2DB 是一个智能且多功能的 SQL 客户端和报表工具,适用于各种数据库。 对于那些平时会用到数据库,但又不是数据库专家的程序员来说,…...
【线性代数与矩阵论】范数理论
范数理论 2023年11月16日 文章目录 范数理论1. 向量的范数2. 常用向量范数3. 向量范数的等价性4. 矩阵的范数5. 常用的矩阵范数6. 矩阵范数与向量范数的相容性7. 矩阵范数诱导的向量范数8. 由向量范数诱导的矩阵范数9. 矩阵范数的酉不变性10. 矩阵范数的等价性11. 长方阵的范数…...

【C++】priority_queue模拟实现过程中值得注意的点
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章旨在记录博主在模…...

Git提交 ssh: connect to host github.com port 22: Connection timed out解决方案
你们好,我是金金金。 场景 之前都是好好的,不知道今天为什么提交代码就这样了 排查 根据英文可以看出,ssh端口号被拒绝了,22号端口不行,那就换一个端口 造成error的原因 ssh端口被拒绝 解决 找到.ssh文件ÿ…...
Java调用WebService接口,SOAP协议HTTP请求返回XML对象
Java调用Web service接口SOAP协议HTTP请求,解析返回的XML字符串: 1. 使用Java的HTTP库发送SOAP请求,并接收返回的响应。 可以使用Java的HttpURLConnection、Apache HttpClient等库。 2. 将返回的响应转换为字符串。 3. 解析XML字符串&…...

Django框架二
一、模型层及ORM 1.模型层定义 负责跟数据库之间进行通信 2.Django配置mysql 安装mysqlclient,mysqlclient版本最好在13.13以上 pip3 install mysqlclient DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: "mysite1",USER:root,PASSWO…...

工业相机与镜头参数及选型
文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离(Worki…...

VSCode使用Makefile Tools插件开发C/C++程序
提起Makefile,可能有人会觉得它已经过时了,毕竟现在有比它更好的工具,比如CMake,XMake,Meson等等,但是在Linux下很多C/C源码都是直接或者间接使用Makefile文件来编译项目的,可以说Makefile是基石…...
用C语言验证“三门定理”
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <time.h>// 一个源自博弈论的数学游戏问题: // 参赛者会看见三扇门, // 其中一扇门的里面有一辆汽车, // 选中里面是汽车的那扇门࿰…...

计算机网络-分层结构,协议,接口,服务
文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决,也就分层解决 怎样分层 每层相互独立,每层做的工作不同 界面自然清晰,层与层之间的接口能够体现…...
前端开发 2: CSS
在前端开发中,CSS(层叠样式表)是一种用于描述网页样式的语言。它控制着网页的布局、颜色、字体等外观效果。在本篇博客中,我将为你介绍 CSS 的基础知识和常用技巧,帮助你更好地掌握前端开发中的样式设计。 CSS 基础知…...

嵌入式-Stm32-江科大基于标准库的GPIO4个小实验
文章目录 一 、硬件介绍二 、实验:LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1:面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯2.3 需求3:蜂鸣器不断地发出滴滴、滴滴.....的提示音。蜂鸣器低电平触发。 三、…...

HackTheBox - Medium - Linux - Noter
Noter Noter 是一种中型 Linux 机器,其特点是利用了 Python Flask 应用程序,该应用程序使用易受远程代码执行影响的“节点”模块。由于“MySQL”守护进程以用户“root”身份运行,因此可以通过利用“MySQL”的用户定义函数来利用它来获得RCE并…...

Uniapp多选Popup(弹出层)
uniapp中多选组件很少,故个人简单开发了一个,可简单使用,也可根据个人需求稍微改进 支持的功能 单选多选(默认)限制选择数量默认选中禁用选项 属性说明 属性默认值说明singlefalsetrue为开启单选,否则为…...

什么是网络安全?网络安全概况
网络安全涉及保护我们的计算机网络、设备和数据免受未经授权的访问或破坏。 这个领域包括多种技术、过程和控制措施,旨在保护网络、设备和数据免受攻击、损害或未授权访问。网络安全涉及多个方面,包括但不限于信息安全、应用程序安全、操作系统安全等 …...

c语言小游戏之扫雷
目录 一:游戏设计理念及思路 二:初步规划的游戏界面 三:开始扫雷游戏的实现 注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文…...

如何本地安装Python Flask并结合内网穿透实现远程开发
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

在线App封装技术:HTML5的新生命
HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性,使得Web应用的体验更加接近原生App。封装HTML5到App中,可以大大缩短开发周期,降低开发成本,并且一次编写,多平台运行,极大…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...