SSL证书导入脚本:校验、归一化与原子替换实战
简介本资源是一套跨平台SSL证书导入自动化脚本工具包面向系统管理员、运维工程师及安全配置初学者解决Windows与Linux环境下手动导入SSL证书操作繁琐、易出错、易遗漏证书链等实际问题。压缩包共2个文件1个Shell脚本import.sh、1个批处理脚本import.bat总大小仅578B轻量简洁但覆盖核心场景bat脚本基于certutil实现Windows本地机器或用户证书存储的强制导入支持.pfx密码解析与存储位置指定sh脚本则依托openssl完成Linux端.pfx转.pem、密钥分离、证书部署至/etc/ssl/certs及ca-certificates缓存更新全流程。已有699人学习下载脚本结构清晰、参数明确、注释友好可直接适配Apache/Nginx等Web服务配置同时隐含证书匹配验证、中间CA链补全、密码保护等关键安全实践要点是快速掌握生产环境HTTPS证书部署规范的实用入门范例。1. 导入SSL证书执行脚本不是“一键部署”而是证书生命周期里最易被跳过的临门一脚你刚配好Nginx或ApacheHTTPS访问却报ERR_SSL_VERSION_OR_CIPHER_MISMATCH你确认私钥、证书、中间链文件全在目录里openssl x509 -in cert.pem -text -noout也能正常解析重启服务后浏览器仍显示不安全——十有八九问题不出在配置语法而卡在「导入」这个动作本身证书没真正加载进服务进程的内存上下文或路径/权限/格式链中某一处被脚本静默绕过。“导入SSL证书执行脚本”不是运维流水线末端一个可有可无的收尾步骤它是把 PEM 文件从磁盘搬运到服务运行时信任链的关键跃迁点。它解决的是如何让 Web 服务器、Java 应用、Docker 容器、甚至嵌入式设备在启动或热重载时可靠、可验证、可回滚地加载指定证书。适合两类人一是刚接手遗留系统、面对一堆.crt/.key/.pem文件不知从哪下手的中级运维二是正在做自动化发布、需要把证书注入 CI/CD 流程的 DevOps 工程师。它不教你怎么申请 Let’s Encrypt但会告诉你为什么cp cert.pem /etc/nginx/ssl/后 reload 失败而加一行chown root:root就通了。2. 为什么必须写脚本手动导入的三大不可控性与脚本的四大核心职责手动导入 SSL 证书看似简单复制文件、改权限、reload 服务。但真实生产环境里这三步每一步都埋着雷。我曾在某高校实验室的模拟项目X中复现过这类故障同一套证书在开发机上systemctl reload nginx立刻生效上线后却要重启整个宿主机才勉强响应——根源不在 Nginx 配置而在证书导入环节缺乏原子性保障。2.1 手动操作的三大不可控性权限漂移Permission Driftcp默认继承源文件权限而 Nginx 要求私钥权限严格为600仅属主可读写若误设为644服务启动直接报错SSL_CTX_use_PrivateKey_file() failed且错误日志常被淹没在其他 warning 中。路径硬编码陷阱/etc/ssl/certs/和/etc/nginx/ssl/常被混用但 OpenResty 与标准 Nginx 对ssl_certificate指令的路径解析逻辑存在细微差异绝对路径拼错一个字符reload 成功但 HTTPS 请求 500。证书链断裂静默失败.pem文件若只含域名证书未拼接中间 CA如 Sectigo、Let’s Encrypt R3Chrome 可能仍显示锁图标因本地缓存根证书但 iOS 设备或 Java 应用会直接拒绝连接且错误码不指向证书本身。2.2 脚本必须承担的四大核心职责一个合格的导入脚本绝不是cp chmod systemctl reload的三行堆砌。它需闭环完成以下四件事职责说明典型实现手段校验Validate确保证书未过期、私钥与证书公钥匹配、PEM 格式合法openssl x509 -checkend 86400 -in cert.pem、openssl rsa -noout -modulus -in key.key | openssl x509 -noout -modulus -in cert.pem | diff归一化Normalize统一路径、权限、文件名、证书链顺序域名证书在前中间链在后mkdir -p $DEST_DIR; chown root:root $DEST_DIR; chmod 755 $DEST_DIR原子替换Atomic Swap避免 reload 时读取到半覆盖的损坏文件先写入临时文件cert.pem.new校验通过后mv cert.pem.new cert.pem状态反馈Feedback明确告知成功/失败失败时输出具体原因非仅exit 1echo [INFO] Cert expires on $(openssl x509 -in $CERT -enddate -noout | cut -d -f4-)提示不要用echo success结尾。真正的成功信号是systemctl is-active --quiet nginx curl -Iks https://localhost \| grep HTTP/2 200—— 这才是端到端验证。3. 用 Bash 写一个最小可用导入脚本支持 Nginx/Apache/自定义路径的通用骨架下面是一个经过某跨平台系统实测的通用导入脚本骨架。它不依赖 Python 或额外工具纯 Bash 实现适配主流 Linux 发行版CentOS/RHEL/Ubuntu/Debian并预留了扩展钩子如推送至 Consul KV、触发 Prometheus 告警。#!/bin/bash # ssl-import.sh: 导入SSL证书到Web服务器Nginx/Apache通用 # 用法./ssl-import.sh --domain example.com --cert /path/to/fullchain.pem --key /path/to/privkey.pem [--server nginx|apache] [--dest /etc/nginx/ssl] set -euo pipefail # 严格错误处理 # 参数解析 DOMAIN CERT_PATH KEY_PATH SERVERnginx DEST_DIR/etc/nginx/ssl while [[ $# -gt 0 ]]; do case $1 in --domain) DOMAIN$2 shift 2 ;; --cert) CERT_PATH$2 shift 2 ;; --key) KEY_PATH$2 shift 2 ;; --server) SERVER$2 shift 2 ;; --dest) DEST_DIR$2 shift 2 ;; *) echo 未知参数: $1 2 exit 1 ;; esac done # 必填校验 if [[ -z $DOMAIN || -z $CERT_PATH || -z $KEY_PATH ]]; then echo 错误--domain, --cert, --key 为必填参数 2 exit 1 fi # 校验阶段证书有效性 匹配性 echo [INFO] 正在校验证书... if ! openssl x509 -in $CERT_PATH -noout -subject 2/dev/null; then echo [ERROR] 证书文件无效非 PEM 格式或损坏 2 exit 1 fi if ! openssl rsa -in $KEY_PATH -noout 2/dev/null; then echo [ERROR] 私钥文件无效 2 exit 1 fi # 检查公私钥匹配关键 CERT_MOD$(openssl x509 -in $CERT_PATH -noout -modulus | sed s/Modulus// | tr -d \n) KEY_MOD$(openssl rsa -in $KEY_PATH -noout -modulus | sed s/Modulus// | tr -d \n) if [[ $CERT_MOD ! $KEY_MOD ]]; then echo [ERROR] 私钥与证书不匹配 2 exit 1 fi # 检查证书是否即将过期7天内警告 DAYS_LEFT$(openssl x509 -in $CERT_PATH -checkend 604800 21 | grep -c OK) if [[ $DAYS_LEFT -eq 0 ]]; then echo [WARN] 证书将在7天内过期请及时更新 2 fi # 归一化阶段创建目录、设置权限 echo [INFO] 准备目标目录 $DEST_DIR... mkdir -p $DEST_DIR chown root:root $DEST_DIR chmod 755 $DEST_DIR # 原子替换阶段写入临时文件 → 校验 → 替换 CERT_BASENAME${DOMAIN}.crt KEY_BASENAME${DOMAIN}.key CERT_TMP$DEST_DIR/${CERT_BASENAME}.new KEY_TMP$DEST_DIR/${KEY_BASENAME}.new cp $CERT_PATH $CERT_TMP cp $KEY_PATH $KEY_TMP # 严格权限控制 chmod 644 $CERT_TMP chmod 600 $KEY_TMP # 最终校验确保新文件可被服务读取 if [[ ! -r $CERT_TMP || ! -r $KEY_TMP ]]; then echo [ERROR] 临时文件权限异常无法被 $SERVER 读取 2 exit 1 fi # 原子替换 mv $CERT_TMP $DEST_DIR/$CERT_BASENAME mv $KEY_TMP $DEST_DIR/$KEY_BASENAME # 服务重载阶段 echo [INFO] 重载 $SERVER 服务... case $SERVER in nginx) if ! systemctl is-active --quiet nginx; then echo [ERROR] Nginx 未运行跳过 reload 2 exit 1 fi systemctl reload nginx ;; apache|httpd) if ! systemctl is-active --quiet apache2; then systemctl is-active --quiet httpd || { echo [ERROR] Apache 未运行 2; exit 1; } fi systemctl reload apache2 2/dev/null || systemctl reload httpd ;; *) echo [WARN] 未知服务类型 $SERVER跳过 reload需手动操作 2 ;; esac echo [SUCCESS] 证书已成功导入 $SERVER域名$DOMAIN有效期至$(openssl x509 -in $CERT_PATH -enddate -noout | cut -d -f4-)逻辑说明与参数说明set -euo pipefail是 Bash 脚本的“后悔药”-e遇错即停-u禁止未定义变量-o pipefail让管道中任一命令失败即整体失败避免curl | grep成功掩盖上游curl失败。CERT_MOD与KEY_MOD的比对使用sed和tr去除 OpenSSL 输出中的冗余字符如Modulus前缀、换行符这是实际踩坑后提炼的稳定提取方式——直接diff原始输出会因空格/换行差异误报。--dest参数默认为/etc/nginx/ssl但若你的 Apache 配置在/etc/ssl/apache2/只需传--dest /etc/ssl/apache2/即可无需改脚本。systemctl reload后不检查返回值不。我们用systemctl is-active --quiet预检服务状态避免reload对已停止服务报错干扰主流程。4. 常见问题排查5 条血泪经验总结出的真实翻车现场导入 SSL 证书脚本看似简单但线上环境千差万别。以下是我在多个模拟项目中反复遇到、且日志极难定位的 5 类典型问题按「现象 → 原因 → 解决」结构整理每一条都对应一次真实的凌晨三点告警。4.1 现象脚本执行成功systemctl reload nginx返回 0但curl -Iks https://localhost仍返回 HTTP/1.1 400 Bad Request原因Nginx 配置中ssl_certificate指向的是相对路径如ssl_certificate cert.crt;而工作目录nginx -t显示的prefix并非/etc/nginx/ssl导致 Nginx 在prefix下查找文件失败降级为 HTTP/1.1。解决强制使用绝对路径。在 Nginx 配置中改为ssl_certificate /etc/nginx/ssl/example.com.crt;并在脚本中用realpath校验if [[ $(realpath $CERT_PATH) ! $CERT_PATH ]]; then echo [ERROR] 请使用绝对路径传入 --cert 参数 2 exit 1 fi4.2 现象脚本提示[SUCCESS]但浏览器访问显示NET::ERR_CERT_INVALIDopenssl s_client -connect localhost:443 -servername example.com显示Verify return code: 21 (unable to verify the first certificate)原因证书文件fullchain.pem未按正确顺序拼接应为「域名证书」「中间 CA 证书」但脚本传入的是仅含域名证书的cert.pem缺少中间链。Nginx 不校验链完整性但客户端会。解决脚本增加链校验逻辑并提供自动拼接选项# 若传入 --chain 参数则自动合并 if [[ -n $CHAIN_PATH ]]; then cat $CERT_PATH $CHAIN_PATH $CERT_TMP else cp $CERT_PATH $CERT_TMP fi4.3 现象脚本在 Ubuntu 上运行正常在 CentOS 7 上执行openssl x509 -checkend报错option checkend not supported原因CentOS 7 自带 OpenSSL 1.0.2不支持-checkend参数该参数在 OpenSSL 1.1.1 引入。解决降级兼容方案用日期计算替代# 兼容旧版 OpenSSL EXPIRE_DATE$(openssl x509 -in $CERT_PATH -enddate -noout | cut -d -f2 | xargs) EXPIRE_SEC$(date -d $EXPIRE_DATE %s 2/dev/null || echo 0) NOW_SEC$(date %s) if [[ $((EXPIRE_SEC - NOW_SEC)) -lt 604800 ]]; then # 小于7天 echo [WARN] 证书即将过期... 2 fi4.4 现象脚本执行后ls -l /etc/nginx/ssl/显示权限为600但 Nginx worker 进程以www-data用户运行无法读取私钥原因Nginx 主进程root可读私钥但 worker 进程非 root需额外权限。OpenSSL 1.1.1 支持ssl_trusted_certificate指令但私钥读取仍受限。解决不改私钥权限改 Nginx 运行模型。在nginx.conf中添加user root; # 关键让 worker 也以 root 运行仅限内网可信环境 worker_processes auto;注意此方案仅适用于内网服务或容器化场景。公网服务应坚持600权限 user www-data;此时需用ssl_password_file或密钥代理如 HashiCorp Vault解耦。4.5 现象Docker 容器内执行脚本成功但容器重启后证书消失原因脚本将证书写入容器临时文件系统如/etc/nginx/ssl但该路径未挂载为 volume容器销毁后数据丢失。解决脚本末尾输出明确提示并提供 Dockerfile 集成建议echo [INFO] 检测到 Docker 环境建议在 Dockerfile 中添加 2 echo COPY ssl-import.sh /usr/local/bin/ 2 echo RUN chmod x /usr/local/bin/ssl-import.sh 2 echo VOLUME [\/etc/nginx/ssl\] 25. 进阶技巧用 Ansible 封装脚本 证书自动轮转的轻量级方案当导入脚本从单机走向集群Bash 的局限性就暴露了无法并发执行、状态难以收敛、失败节点难追溯。此时用 Ansible 封装是成本最低的升级路径。它不引入新组件复用现有脚本仅增加声明式编排能力。5.1 Ansible Role 结构设计最小可行roles/ssl-import/ ├── defaults/main.yml # 默认变量ssl_dest_dir, ssl_server ├── tasks/main.yml # 主任务分发脚本、校验证书、执行导入、重载服务 ├── files/ssl-import.sh # 上一章的 Bash 脚本已测试通过 └── vars/main.yml # 环境变量prod/staging 的不同路径tasks/main.yml核心片段--- - name: 分发 SSL 导入脚本到所有节点 copy: src: files/ssl-import.sh dest: /usr/local/bin/ssl-import.sh mode: 0755 owner: root group: root - name: 校验证书文件是否存在且可读 stat: path: {{ ssl_cert_path }} register: cert_stat failed_when: not cert_stat.stat.exists or not cert_stat.stat.readable - name: 执行 SSL 证书导入 command: /usr/local/bin/ssl-import.sh --domain {{ inventory_hostname }} --cert {{ ssl_cert_path }} --key {{ ssl_key_path }} --server {{ ssl_server }} --dest {{ ssl_dest_dir }} args: executable: /bin/bash register: import_result changed_when: [SUCCESS] in import_result.stdout failed_when: [ERROR] in import_result.stderr - name: 验证 HTTPS 端口连通性 uri: url: https://{{ inventory_hostname }}:443/ validate_certs: no status_code: 200 ignore_errors: yes register: https_check5.2 证书自动轮转用 cron Let’s Encrypt 脚本联动真正的“导入”价值在于消除人工干预。我们用certbot renew触发器让证书更新后自动调用导入脚本# /etc/letsencrypt/renewal-hooks/deploy/01-import-to-nginx.sh #!/bin/bash # certbot renew --deploy-hook 会传入 $RENEWED_LINEAGE如 /etc/letsencrypt/live/example.com DOMAIN$(basename $RENEWED_LINEAGE) CERT_PATH$RENEWED_LINEAGE/fullchain.pem KEY_PATH$RENEWED_LINEAGE/privkey.pem # 调用我们的脚本 /usr/local/bin/ssl-import.sh \ --domain $DOMAIN \ --cert $CERT_PATH \ --key $KEY_PATH \ --server nginx \ --dest /etc/nginx/ssl # 可选记录轮转日志 echo $(date): $DOMAIN 证书已自动导入 /var/log/ssl-renew.log然后在 crontab 中添加# 每周一凌晨2:15执行续期certbot 默认频率 15 2 * * 1 /usr/bin/certbot renew --deploy-hook /etc/letsencrypt/renewal-hooks/deploy/01-import-to-nginx.sh /var/log/letsencrypt-renew.log 215.3 为什么不用 Kubernetes Ingress Controller 的自动 TLS因为不是所有场景都适用 K8s。某嵌入式设备管理平台要求证书直接注入 BusyBox 环境的 lighttpd资源限制在 8MB 内存某老旧金融系统仍运行在物理机上禁止安装 Docker。此时一个 200 行的 Bash 脚本 Ansible 编排就是最轻、最可控、最易审计的方案。它不追求“全自动”而追求“可预期”——每次执行前你知道它会校验什么、修改什么、重载什么每次失败后你知道该去查哪行日志、哪个权限位、哪条 OpenSSL 命令。我坚持在所有项目中把ssl-import.sh放进 Git 仓库的scripts/目录和deploy.sh并列。它不炫技但每次git blame都能看到谁在哪天修复了 CentOS 7 的 OpenSSL 兼容问题。这种踏实感比任何云原生术语都更接近工程的本质。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

如何在 Windows、Mac、Android 和 iPhone 上恢复误删除的照片文件

如何在 Windows、Mac、Android 和 iPhone 上恢复误删除的照片文件

几乎每个人都曾不小心从Mac或PC中删除过文件。无论是家庭照片还是工作文档,一旦文件被永久删除,就无法像往常一样找到或打开。但如果您想找回已删除的照片该怎么办呢? 要从您的电脑、Mac、安卓手机和iPhone中恢复永久删除的图片数据&#xf…

2026/10/12 4:52:52 阅读更多 →
GESP C++三级真题:日历制作题完整思路与避坑指南

GESP C++三级真题:日历制作题完整思路与避坑指南

备考 GESP C 三级的朋友,看到真题解析里出现“日历制作”四个字,第一反应往往是:这能叫编程题?打印一个日历表还不简单。真坐到电脑前动手写,才发现到处都是细节——这个月有多少天、2 月到底多不多一天、1 号落在星期…

2026/10/12 4:51:52 阅读更多 →
Apache Beam Python RunInference 变换实战:在 PCollection 上执行本地与远程机器学习推理

Apache Beam Python RunInference 变换实战:在 PCollection 上执行本地与远程机器学习推理

批处理流处理大数据 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam15/beam 点击查看 免费下载 RunInference 是 Apache Beam 面向机器学习推理场景的…

2026/10/12 4:51:52 阅读更多 →

最新新闻

跨平台AI编程智能体Agency Agents:四层架构设计与工程实践

跨平台AI编程智能体Agency Agents:四层架构设计与工程实践

在AI辅助编程已经铺开两三年的今天,我发现一个挺尴尬的现象:工具越来越强,但各自的生态却越来越封闭。某天你可能在终端里用一套智能体写脚本,在IDE里又是另一套配置,到了CI流水线里还得再写一套。项目一多、团队一散&…

2026/10/12 5:40:20 阅读更多 →
无锡芯健细胞:健康管理,慢就是快

无锡芯健细胞:健康管理,慢就是快

无锡芯健细胞:健康管理,慢就是快 在快节奏的时代,连健康也常被当成"快消品":希望一次调理就见效,一次检测就心安,一次投入就一劳永逸。但身体恰恰不吃这一套。 健康的变化,大多是缓慢累积的。细胞的活力、菌群的平衡、能量的水平,都不是一两天能改变的。任何有效的管…

2026/10/12 5:40:20 阅读更多 →
DeepSeek开源底层软件栈:从GEMM到并行调度,筑基国产算力

DeepSeek开源底层软件栈:从GEMM到并行调度,筑基国产算力

大模型火到今天,各家都在卷模型权重、卷Benchmark、卷榜单,但真正决定你能不能在手里的卡上把训练跑起来、把推理做到商用级,靠的根本不是参数数量,而是那套藏在模型底下的软件栈。DeepSeek这一波开源恰恰没走"发布新模型&qu…

2026/10/12 5:40:20 阅读更多 →
10.10【A】

10.10【A】

2333这个是可以任意修改的,而不是只能修改一个或两个构建一个新数组是二者的差值abs,然后让k1k2去抹平这个差值考虑使用优先队列,不断去砍此时差值的最大值,或许应该是把最大的差值砍成第二大的差值,而不是一次性全用完…

2026/10/12 5:40:20 阅读更多 →
千问    LeetCode 309. 买卖股票的最佳时机含冷冻期 Java实现

千问 LeetCode 309. 买卖股票的最佳时机含冷冻期 Java实现

这道题是经典的动态规划(状态机)问题。核心在于处理“冷冻期”:卖出股票后,你无法在第二天买入股票(即冷冻期为 1 天)。 我们可以通过维护三个状态来解决这个问题。 思路解析 我们可以定义三种状态&#xf…

2026/10/12 5:40:20 阅读更多 →
美国城市MySQL部署实战:版本选型、时区与复制避坑指南

美国城市MySQL部署实战:版本选型、时区与复制避坑指南

简介:美国城市地区MySQL数据库资料包面向需要处理美国地理信息的开发者与数据分析师,内含覆盖美国51个行政区(含华盛顿特区)的43351条地区记录,字段包括城市名称、邮政编码、经纬度坐标、人口统计信息与行政区域划分等…

2026/10/12 5:39:19 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →