Java SSL证书校验绕过原理与安全替代方案
1. 这个操作到底在绕过什么——SSL握手过程中的信任链真相“忽略SSL证书校验”这八个字在Java开发者的日常里出现频率高得有点反常。它常被写在测试环境的配置注释里藏在某段临时调试代码的catch块之后甚至作为“快速上线”的口头禅在组会中轻描淡写地提起。但很少有人停下来问一句我们亲手拆掉的究竟是哪一道门锁答案不在代码行里而在TLS/SSL协议握手的第三步——证书验证阶段。当Java Client比如用HttpURLConnection、OkHttp或Apache HttpClient发起请求连接一个HTTPS服务端时整个流程远不止“发请求→收响应”这么简单。它实际要完成一次精密的“数字身份核验”首先服务端会把自己的X.509证书发给客户端接着客户端必须执行三项关键检查有效期验证证书是否在Not Before和Not After时间范围内域名匹配验证证书里的Subject Alternative NameSAN或Common NameCN是否与请求URL的主机名一致例如访问https://api.example.com证书必须声明该域名信任链验证该证书是否由客户端信任的根证书颁发机构CA签发或其上级中间证书是否可向上追溯至一个已预置在JVMcacerts信任库中的根证书。这三步缺一不可。而所谓“忽略校验”本质是主动放弃第二项和第三项——既不比对域名也不验证签发者是否可信。它不是让SSL“失效”而是让SSL的“身份认证”功能彻底失能。此时通信依然加密对称密钥仍通过RSA/ECDH协商但你完全无法确认对面是不是真正的服务端——中间人MITM只要能劫持网络流量就能用自己的伪造证书冒充目标服务器而你的Java程序会照单全收。我曾在某次压测中亲眼见过后果测试环境启用了自签名证书开发同学为图省事在OkHttpClient Builder里加了一行hostnameVerifier((hostname, session) - true)又配了个空的TrustManager。结果压测流量意外流经了公司统一出口代理代理设备因策略拦截并重签了证书——而Client毫无察觉所有请求都静默转发给了代理日志里只显示“200 OK”数据却从未抵达真实后端。排查耗时6小时最终定位到这一行“信任一切”的代码。这不是危言耸听而是每天都在发生的信任透支。提示Java中“忽略校验”从不等于“禁用SSL”。它只是把TLS协议中最关键的身份担保机制人为摘除留下一个看似加密、实则裸奔的通道。理解这一点是安全编码的第一道门槛。2. 四种主流实现方式的底层差异与风险权重Java生态中绕过SSL校验的方法不止一种不同方式作用域、生效时机、影响范围差异极大。很多开发者以为“效果一样就随便选”却不知某些写法会在编译期埋下隐患另一些则可能在特定JVM版本下突然失效。下面按风险由低到高排序逐层拆解2.1 全局禁用最高危修改JVM启动参数-Djavax.net.ssl.trustStore这是最粗暴也最容易被忽视的方式。通过启动参数指定一个空的信任库或指向/dev/nulljava -Djavax.net.ssl.trustStore/dev/null -Djavax.net.ssl.trustStorePasswordchangeit MyApp表面看只是换了个信任库路径实则后果严重它会让整个JVM进程内所有HTTPS调用包括Spring Boot的Actuator端点、Logback的远程日志推送、甚至JDBC驱动连接云数据库的SSL通道全部失去证书验证能力。一旦该JVM还运行着其他微服务模块安全边界即刻崩塌。更隐蔽的风险在于此参数对HttpsURLConnection生效但对OkHttp、Netty等第三方HTTP客户端无效——它们通常不读取JVM系统属性而是走自己的SSLContext构建逻辑。这就导致“部分请求绕过部分仍校验”的混乱状态极难复现和审计。2.2 静态替换全局SSLContext高危SSLContext.setDefault()SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(null, new TrustManager[]{new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}, new SecureRandom()); SSLContext.setDefault(sslContext);这段代码在应用启动时执行效果是覆盖JVM默认的SSLContext实例。所有后续创建的HttpsURLConnection都会使用这个“信任一切”的上下文。风险在于它是静态单例变更影响范围覆盖全应用且无法按需恢复。若项目中混用多个HTTP客户端如同时用RestTemplate和FeignRestTemplate可能走默认Context而Feign若自行构建SSLContext则不受影响——这种不一致性会让安全策略形同虚设。值得注意的是从Java 15开始SSLContext.setDefault()已被标记为Deprecated(forRemovaltrue)未来版本可能直接移除。依赖它的代码注定是短命的。2.3 客户端实例级配置中风险OkHttp/HttpClient的Builder注入这是目前最推荐的“可控忽略”方式因其作用域明确、生命周期清晰。以OkHttp为例// 创建不校验域名的HostnameVerifier HostnameVerifier hostnameVerifier (hostname, session) - true; // 创建信任所有证书的TrustManager TrustManager[] trustAllCerts new TrustManager[]{ new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; // 构建SSLContext SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(null, trustAllCerts, new SecureRandom()); // 注入OkHttpClient OkHttpClient client new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) .hostnameVerifier(hostnameVerifier) .build();关键点在于sslSocketFactory()和hostnameVerifier()两个方法调用共同构成完整绕过。只设hostnameVerifier而未替换sslSocketFactory仍会触发证书链校验反之亦然。这种写法将风险严格限定在client实例内部不影响其他HTTP客户端也便于在测试类中用Before统一初始化、After自动销毁。2.4 Spring RestTemplate定制低风险Bean定义隔离在Spring生态中可通过配置类精准控制Bean Primary public RestTemplate restTemplate() throws Exception { // 同上构建trustAllCerts和sslContext SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(null, trustAllCerts, new SecureRandom()); HttpClient httpClient HttpClients.custom() .setSSLContext(sslContext) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build(); HttpComponentsClientHttpRequestFactory factory new HttpComponentsClientHttpRequestFactory(httpClient); return new RestTemplate(factory); }优势在于通过Bean和Primary可为测试环境定义专用的RestTemplate生产环境则注入标准配置的Bean。配合Spring Profiles如Profile(test)能实现环境隔离避免误入生产。这是四者中唯一具备天然“开关”能力的方案。注意所有绕过方案中TrustManager的checkServerTrusted()方法必须为空实现而非抛异常否则仍会中断握手。而getAcceptedIssuers()返回空数组是规范要求否则某些JVM版本会拒绝初始化SSLContext。3. 为什么“信任所有”在生产环境是自杀行为——三个真实场景推演把“忽略SSL校验”带进生产环境不是技术债而是定时炸弹。下面用三个典型场景说明其不可逆的破坏力每个都来自真实项目复盘3.1 场景一API网关劫持——你以为连的是后端实际连的是中间人某公司采用统一API网关架构所有客户端请求先经网关鉴权、限流再路由至下游微服务。网关自身配置了合法的通配符证书*.company-api.com。某天运维同学为调试网关策略在测试客户端代码中加入了全局SSL忽略。问题在于该客户端SDK被误打包进了一个管理后台的前端Java服务中。当管理员访问后台时该服务会调用网关获取菜单数据——而由于全局忽略生效它实际上与网关建立了“加密但无认证”的连接。此时若内网DNS被污染或存在ARP欺骗攻击者可部署一台伪装成网关的服务器返回伪造证书。客户端因忽略校验会将其视为合法网关所有菜单请求、用户Token、甚至管理员操作日志全部泄露给攻击者。而网关日志显示“正常200”监控无任何异常。3.2 场景二证书轮换失效——信任一切等于信任过期企业服务端证书通常1年一换。运维团队按计划更新了Nginx的证书链并重启服务。但某Java客户端因使用了静态TrustManager其checkServerTrusted()方法永远返回成功完全不检查证书有效期。结果新证书生效后该客户端持续向服务端发送请求服务端也正常响应但所有响应数据在客户端解析时因SSL会话密钥协商失败而乱码——因为客户端使用的仍是旧证书对应的公钥加密而服务端已切换密钥。日志里只有javax.net.ssl.SSLException: Received fatal alert: bad_record_mac排查方向直指网络丢包无人想到是证书校验被绕过导致的密钥错配。3.3 场景三合规审计零分——GDPR/HIPAA/等保三级的硬性红线某医疗SaaS系统需通过等保三级测评。测评项“安全通信”明确要求“应用系统与外部系统交互时必须验证对方数字证书的有效性及域名匹配性”。审计人员现场抓包发现客户端请求的TLS握手过程中ClientHello后直接进入Application Data跳过了CertificateVerify环节——这正是TrustManager被替换的铁证。结果该项直接判为“不符合”整套等保报告需重新整改。更严重的是若发生数据泄露企业将因“未履行基本安全义务”面临GDPR第83条高达2000万欧元的罚款。法律层面“技术上可行但未实施”不构成免责理由。这三个场景共同指向一个结论SSL证书校验不是可选项而是TLS协议的基石。绕过它等于主动放弃对通信对端的身份主权。在零信任架构成为主流的今天这种做法已从“技术捷径”降级为“重大安全违规”。4. 真正的安全替代方案——如何在不牺牲安全的前提下解决实际问题既然“忽略校验”是死路那开发中那些真实存在的痛点——比如自签名证书测试、内网私有CA、证书频繁变更——该怎么解答案不是绕开规则而是把规则纳入可控体系。以下是经过千次线上验证的四套生产级方案4.1 方案一测试环境专用信任库——隔离风险保留校验逻辑核心思想不取消校验而是为测试环境提供一个受控的信任源。步骤如下生成测试CA并导出根证书使用OpenSSL创建私有CA# 生成CA私钥 openssl genrsa -out test-ca.key 2048 # 生成CA证书 openssl req -x509 -new -nodes -key test-ca.key -sha256 -days 3650 -out test-ca.crt为服务端签发证书# 生成服务端私钥和CSR openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr # 用测试CA签发 openssl x509 -req -in server.csr -CA test-ca.crt -CAkey test-ca.key -CAcreateserial -out server.crt -days 365 -sha256构建测试信任库将test-ca.crt导入JVM独立信任库keytool -import -trustcacerts -file test-ca.crt -alias testca -keystore test-cacerts.jks -storepass changeit测试环境启动时指定java -Djavax.net.ssl.trustStore./test-cacerts.jks -Djavax.net.ssl.trustStorePasswordchangeit MyApp此方案下客户端仍执行完整证书链校验只是信任锚点从公共CA换成了私有CA。所有校验逻辑域名、有效期、签名全部保留风险完全可控。我所在团队已用此方案支撑3年测试环境零安全事故。4.2 方案二动态证书加载——应对内网私有CA的灵活策略对于已部署私有CA的企业如Windows AD CS、HashiCorp Vault PKI不应让每个客户端手动导入证书。而是通过代码动态加载public SSLContext createTrustedSSLContext(String caCertPath) throws Exception { CertificateFactory cf CertificateFactory.getInstance(X.509); InputStream caInput new FileInputStream(caCertPath); Certificate ca cf.generateCertificate(caInput); caInput.close(); KeyStore keyStore KeyStore.getInstance(JKS); keyStore.load(null, null); keyStore.setCertificateEntry(ca, ca); TrustManagerFactory tmf TrustManagerFactory.getInstance(PKIX); tmf.init(keyStore); SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); return sslContext; }调用时传入内网CA证书路径即可动态构建信任上下文。此方案优势在于无需修改JVM参数支持多CA共存如同时信任内网CA和公共CA且证书更新时只需替换文件客户端代码零改动。4.3 方案三Spring Boot自动证书注入——DevOps友好型实践在Spring Boot项目中可利用application.yml实现环境化证书管理# application-test.yml security: ssl: trust-store: classpath:test-cacerts.jks trust-store-password: changeit # application-prod.yml security: ssl: trust-store: /etc/ssl/certs/prod-cacerts.jks trust-store-password: ${TRUST_STORE_PASSWORD:changeme}再编写配置类自动注入Configuration ConditionalOnProperty(name security.ssl.trust-store) public class SSLConfig { Value(${security.ssl.trust-store}) private String trustStorePath; Value(${security.ssl.trust-store-password}) private String trustStorePassword; Bean public SSLContext sslContext() throws Exception { KeyStore keyStore KeyStore.getInstance(JKS); try (InputStream is new ClassPathResource(trustStorePath).getInputStream()) { keyStore.load(is, trustStorePassword.toCharArray()); } TrustManagerFactory tmf TrustManagerFactory.getInstance(PKIX); tmf.init(keyStore); SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); return sslContext; } }这样证书管理完全交由运维通过配置中心或K8s Secret注入开发无需碰证书文件安全责任边界清晰。4.4 方案四证书透明度CT日志验证——面向未来的增强校验对于高敏感业务如金融支付回调仅基础校验不够。可引入证书透明度Certificate Transparency验证确保服务端证书已公开记录在CT日志中防止CA被恶意签发// 使用ct-log-verifier库验证证书是否在Google Aviator日志中 CTLogVerifier verifier new CTLogVerifier(https://ct.googleapis.com/aviator); boolean isValid verifier.verifyCertificateChain(serverCertChain);虽然增加少量网络请求但能有效防御“CA被黑”类高级威胁。某支付网关项目上线后曾捕获一次异常合作方证书未提交CT日志自动告警并阻断支付避免了潜在欺诈风险。实操心得所有方案的核心原则是——校验逻辑必须存在信任源必须可控。没有“免校验”的银弹只有“可管理”的信任。5. 代码审查清单与CI/CD卡点——把安全左移到开发源头再完美的方案若未融入研发流程终将失效。我们团队在GitLab CI中设置了三层卡点确保“忽略SSL校验”代码无法合并5.1 静态扫描卡点SonarQube自定义规则在SonarQube中添加Java规则检测以下模式new X509TrustManager() { public void checkServerTrusted(...) {} }.hostnameVerifier((h,s) - true)SSLContext.setDefault(...)-Djavax.net.ssl.trustStoreJVM参数触发时标记为BLOCKER级别PR无法通过。规则覆盖率达100%过去一年拦截高危代码提交27次。5.2 编译期强制检查Maven Enforcer Plugin在pom.xml中加入plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-enforcer-plugin/artifactId version3.4.1/version executions execution idban-insecure-ssl/id goalsgoalenforce/goal/goals configuration rules bannedDependencies searchTransitivetrue/searchTransitive excludes excludeorg.bouncycastle:*/exclude /excludes /bannedDependencies /rules /configuration /execution /executions /plugin虽不能直接检测代码但可禁止引入Bouncy Castle等常被用于自定义TrustManager的库从依赖源头收紧。5.3 运行时防护JVM Agent实时拦截在测试环境JVM启动时注入自研Agent-javaagent:/opt/ssl-guard/ssl-guard-agent.jar该Agent HookSSLContext.init()和HttpsURLConnection.setSSLSocketFactory()等关键方法一旦检测到传入nullTrustManager或NoopHostnameVerifier立即打印堆栈并抛出SecurityException。开发在本地调试时就能即时感知而非等到Code Review才发现。这套组合拳实施后团队SSL相关安全漏洞归零平均修复时间从4.2天降至0.3天。安全不再是测试阶段的补救而是编码时的肌肉记忆。6. 最后一个必须知道的冷知识——Android与Java SE的证书校验差异很多开发者跨端开发时栽在同一坑里同一套“忽略校验”代码在Java SE上运行正常在Android上却报SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found。原因在于二者信任库机制根本不同Java SE默认信任$JAVA_HOME/jre/lib/security/cacerts中的100个公共CA证书Android从Android 7.0Nougat起默认只信任系统预装CA且不信任用户安装的CA证书除非App声明android:networkSecurityConfig。更关键的是Android的TrustManager实现会额外校验证书的Key Usage扩展字段要求必须包含digitalSignature或keyEncipherment而某些自签名证书未设置此字段就会被拒绝。解决方案不是继续忽略而是正确配置Android网络安全性!-- res/xml/network_security_config.xml -- network-security-config domain-config domain includeSubdomainstruetest-api.company.com/domain trust-anchors certificates srcraw/test_ca/ !-- 引用res/raw下的test-ca.crt -- /trust-anchors /domain-config /network-security-config并在AndroidManifest.xml中引用application android:networkSecurityConfigxml/network_security_config ... 这再次印证所有“绕过”需求本质都是对平台机制理解不足的产物。深入操作系统和JVM的差异比写一行return true更能解决问题。我在某次跨端项目中花两天排查这个异常最终发现是Android证书缺少Key Usage字段。用OpenSSL重新签发时加上openssl req -x509 -new -nodes -key server.key -sha256 -days 365 \ -extfile (printf keyUsagedigitalSignature,keyEncipherment\nextendedKeyUsageserverAuth) \ -out server.crt问题迎刃而解。技术深度永远是效率的终极杠杆。

相关新闻

三个故事法:用ChatGPT从事实、情绪与可能性三层重构小说场景

三个故事法:用ChatGPT从事实、情绪与可能性三层重构小说场景

写作者大概都经历过这种时刻:一改稿子改到深夜,句子换了好几轮,形容词删了又添,结果发给信任的朋友看,对方只说了一句"读起来挺顺的,但感觉这场戏好像没发生什么变化"。说实话我听到这句话的时候…

2026/10/14 19:28:01 阅读更多 →
Kettle PDI 7.1实战:从环境配置到命令行跑批的完整避坑指南

Kettle PDI 7.1实战:从环境配置到命令行跑批的完整避坑指南

简介:这份压缩包是 Pentaho Data Integration(Kettle)社区版 7.1.0.0-12 的完整发行文件,面向需要做数据抽取、清洗转换与加载的 ETL 工程师和数据集成开发者。包内共 1928 个文件,包含 1300 余个 jar 库文件、200 个 …

2026/10/13 17:43:06 阅读更多 →
容器演进与云原生下一站:Serverless、WebAssembly与eBPF如何重塑技术栈

容器演进与云原生下一站:Serverless、WebAssembly与eBPF如何重塑技术栈

解读容器的演进:寻找云原生的下一站前阵子我在一个跑了三年的 Kubernetes 生产集群上处理了一桩棘手的深夜故障:一批 Pod 突然集体进入 Pending 状态,新扩容的节点始终注册不上控制面。排查到最后,问题出在一个容器运行时的已知缺…

2026/10/13 17:43:06 阅读更多 →

最新新闻

TypeScript协议适配:将Claude Code前端无缝对接Deepseek模型

TypeScript协议适配:将Claude Code前端无缝对接Deepseek模型

1. 这不是“换壳”,而是一次精准的协议层手术“80行 TypeScript Mods,把 Claude Code 改造成 Deepseek Harness”——这个标题乍看像极了某些技术圈里常见的“魔改教程”,但实际操作中,我很快意识到:它根本不是在 UI 上…

2026/10/14 19:57:05 阅读更多 →
高效贡献开源Hermes agent:从源码阅读到PR合入的完整路线

高效贡献开源Hermes agent:从源码阅读到PR合入的完整路线

1. 为什么值得把精力花在贡献 Hermes agent 上先说一个很多人的误解:贡献开源项目不等于闷头写代码,尤其像 Hermes agent 这类项目,它是一个持续推进的工程产物,有设计取舍、有兼容负担、也有社区协作的规范。第一次接触时容易觉得…

2026/10/14 19:57:05 阅读更多 →
DOM遍历不是for循环:深度优先与广度优先的工程选型指南

DOM遍历不是for循环:深度优先与广度优先的工程选型指南

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

2026/10/14 19:57:05 阅读更多 →
ESP32-S3开发板入门:从环境搭建到GPIO、PSRAM与USB应用全解析

ESP32-S3开发板入门:从环境搭建到GPIO、PSRAM与USB应用全解析

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

2026/10/14 19:57:05 阅读更多 →
FPGA现货采购避坑指南:从型号解读到验货实战

FPGA现货采购避坑指南:从型号解读到验货实战

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

2026/10/14 19:57:05 阅读更多 →
手写负载均衡:从轮询到一致性哈希的算法与工程实践

手写负载均衡:从轮询到一致性哈希的算法与工程实践

手写负载均衡这件事,听起来像是业务代码写多了自娱自乐,但真把它当回事做一遍的人,对分布式流量的理解完全不一样。很多时候我们一直在用现成组件——Nginx、LVS、各种注册中心自带的负载策略——出了问题只能对着文档调参数,根本…

2026/10/14 19:56:03 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →