普通视图

发现新文章,点击刷新页面。
昨天以前Joe's Blog

2025年终总结

作者 Joe Jiang
2025年12月20日 00:00

还记得去年的总结是在高烧中迷迷糊糊完成的,谁能想到,今年开始动笔时,我又发烧了。

年终序言:这会是最后一篇年终总结吗?

去年使用各类 AI 工具时,新鲜中还夹杂着对不可控与等待焦虑的不确定性,但随着 DeepSeek 在年初的重磅更新引爆全球,中美各大科技巨头纷纷加注,砸下大量资源对 AI 进行超饱和式投入。这一年,随着产品端爆发式迭代,用户对 AI 产品的接受度也在迅速提高。

这一年,随着产品形态更多从 assistant 向 agent 转向,AI 智能体的交互形态和数量都在迅猛膨胀,而随着中心化 ReAct 架构的迅速衰落,多智能体方案伴随着持久记忆、生成式 UI 等技术手段与创新,开始走向主流,助力 AI 成为真正能上岗干活的智能助手

随着时代革命的加速迭代,从国家层面战略部署、城市发展与治理被 AI 重构,再到企业间竞相内卷大模型能力,仿佛不踩上这趟车,就会被时代彻底抛下。而这份宏大的冲击,从日常新闻报道中,也顺着行业脉络、公司运营,渗透进了每个人的日常生活。AI 除了在疯狂迭代中对各行各业产生颠覆性“冲击”,也在以肉眼可见的速度击穿宏观与微观的边界。不论 AI 最终发展成什么样,毫无疑问,当前 AI 已演变成一场裹挟所有人无法回避的浪潮。

兴奋与恐慌持续共存,而这一年也悄悄来到尾声。不知再过多久,AI 的认知与思考能力会超过我,但至少当下,我最真实的感受还需要通过控制大脑,从这一年的见闻中挑挑拣拣,以形成这篇年终总结。

躺在投资舒适区,迎向迷茫和充满风险的未来

近几年的年度总结,似乎总是从投资复盘开篇,不过今年这部分会相对轻松些。尽管这一年依旧不太平——地缘政治冲突持续、中美谈判几经反复,但美联储降息预期逐步落地,国内也多措并举稳内需、促经济,整体仍是平稳的一年

资本市场在这一年走出了回升行情,只要不追涨杀跌,不在高频交易中损耗成本,大概率都能像我一样,在宽基指数与行业指数的布局中有所收获。不过,即便今年的交易难度有所降低,仍有不少美中不足:比如仍趴在地板上的医药和白酒,以及在我看来远没触底的房地产板块。

展望明年,AI 在资本的饱和式供给下正迎来“龙卷风式”的迭代,这股浪潮不仅在革新各行各业,更在深刻影响未来的职场格局、企业需求及订单结构。眼下,由于资本仍热情高涨,市场也未充分计价风险,我们尚难判定这场 AI 热潮究竟是颠覆性的技术变革,还是即将破灭的资本泡沫。但多重复杂因素交织之下,明年的资本市场无疑会充满更多不确定性。

从最终结果来看,我今年的投资收益算得上差强人意。但遗憾的是,过去一年各类杂事填满了生活,我在投资学习上几乎是全然荒废。全年的投资操作,更多依赖长期持有与被动调仓,主动投研和持仓深度分析的环节,几乎是一片空白。投资本就是一门需要终生钻研的学问,依赖市场势能或许能让人 “躺平” 一时,但长此以往,终将被市场淘汰。明年务必要补齐这块短板。

除了股票与基金投资,今年我还花了不少心思研究稳健理财。从曾经的刚性兑付,到如今全面净值化转型,再到多项不合规计价方式被明令禁止,稳健理财早已渐渐褪去了 “稳健” 的标签,而我也到了该离开的时候了。年中时,我梳理了手头的稳健理财持仓,决定逐步将资金分流至其他资产类别。不过这些调整,暂时还未体现在投资收益率的提升上。往后等时机成熟,我或许可以写一篇文章来分享这段心路历程。

当职业生涯被 AI 击穿,很多事情开始模糊起来

以前说到转型,我们往往会将牺牲品锁定在被机器和技术替代的基础服务行业,不太会担心自己。相比可以被替代的体力,我们曾认为程序员的思考与编码能力难以模拟。但随着行业中到处 All in AI 的战略落地,不论大模型技术还是各类 AI 应用都入雨后春笋般涌现,不断地迭代正使得 AI 能完成一定复杂度工作的能力被认可,各类 AI 工具已渗透进我们的日常工作中,“经验优势”和“技能壁垒”正在加速瓦解,不可替代性已成为假命题。

程序本身,作为高度可判断和可推断的特性,在 AI 替代列表中首当其中。AI 创新没有带来温和的转向,而是让“平庸层”在迅速消失,不同工种之间的界限也逐渐变得模糊,市场上不再需要那么多“写代码的人”,总体岗位需求正在不断湮灭。

以前,我曾一直自嘲没有核心竞争力、随时要下岗,那时还很笃定自己的生产与创造力,但直到今年,在“无所不能”的 AI 面前,我第一次真正感受到职业生涯的明显缩减。

平平无奇的一年,从热闹工作开始、以忙碌焦虑收尾

今年的我,工作上是平平无奇的。一度忙碌到兼任产品、研发、设计等多个角色,但突然戛然而止,又干回前端,几个月后却又在迎面迷雾中转向全栈与 AI。这一年里,体验了冲一把的刺激,在一些项目尝试中有了跨越边界的收获,但更多的是,在大环境裹挟下日复一日品尝着身不由己的无趣。我曾经以为,工作要么快乐时斗志向前,要么气愤时转向窗外,却没想到还有一种带着忧虑和迷茫的无趣感。

虽说无趣,但我一直相信,每个时代都有属于每个时代的机会。在 AI 带来职业冲击的同时,虽然不知胜算几何,但我还是做了不少尝试,从个人 Context Coding 到 Agent 与 workflow 开发,很多事情虽然不一定有结果,但至少没有坐进观天、原地踏步。

虽然我仍没有想清前路,但就像在之前一篇文章中所说,首先,不论有没有 AI,很多工程技术的发展在这几年就已经大幅放缓了,这受制于市场需求和经济基础;其次,不止前端,客户端、服务端等主要靠通过人类来弥合用户需求与机器实现之间 gap 的工种,都在消亡。

在焦虑中,用一句话总结下今年的工作经历,仿佛是在激情蹦迪后,又跳回了原地。

年度健康 Keywords:全麻手术、健身退步、重拾烟火气

回过头才发现,我的忍耐力还挺高。我那不安分的阑尾在最近三年发作了三次,但每次我都忍了两天才去就医。之前因为担心影响工作,我都选择了保守治疗。由于多次发作,医生担心反复保守治疗会留下囊肿和粘连等后遗症,在医生的反复劝说下,一咬牙,我就把这个没什么用却充满负担的小器官切了。第一次做全麻手术,第一次需要家人陪着住院。手术本身并不难受,但陌生的环境加上术后插着个引流管,我的身体和精神都有明显的不适应症。

由于身体条件不允许,住院期间我实在没法工作,但在肢体被限制期间,我在病房里荡悠,在护士站闲聊,在病床上闭眼静养,在休息区和其他病号闲聊,收获很多生动故事的同时,内心默默给“健康”在人生排位上提升了很大的优先级。

我仍在坚持运动,但因为手术及恢复期间断过两个月,再加上今年频繁搬家,游泳这项运动也一度中断,运动量大大退步,这对于“努力健身却毫无痕迹”的我来说,更是雪上加霜。明年务必要补回来。

今年的我在医疗健康问题上一改往日拖沓作风,但另一方面,在按时作息、高效利用时间上,仍旧不合格。但关于饮食健康上,我很自豪的一点是“重归烟火气”。从往日看着食谱慌忙做出四不像菜肴,到跟着爸妈指导依葫芦画瓢,再到独自一人尝试新品、开拓新口味……这一年里,我的厨艺有非常明显的进步。我会担心在厨房呆久了成了“黄脸婆”,但更多的还是开心。刨根问底,我发现自己开火带给我的最大收获不仅是食材安全和健康可控,更多在于自己可以在从买到做的整个过程中放空自己,远离忧虑与压力,尽情享受没有杂念的创意设计过程。

藏在生活碎片里的快乐片段与遗憾插曲

今年的生活一波三折,比如我签过三个合同、搬了两次家。作为一个嫌麻烦且犹豫不决的人,没想到因为一些变故,有了第一次租房违约,压床底的收纳箱在短短半年里派上了两次用场。

然而,就是在这过程中,我开始践行真正意义上的断舍离。那些之前可能几年完全没用过的一些物品,大到床垫,小到杯子,我一个个将他们摆好,给他们拍上好看的“身份照”,然后编辑文字发贴。就在这些东西卖出去的那一刻,我发现自己也感受到了快乐,这快乐不仅来自于我从中回了些本,更在于这些物品在流转中,寻来了真正需要他们的主人。从某种意义上说,这非常契合我的性价比和实用主义观念。

记得我在公众号开始输出时,第一篇文章的名字就叫重振香港,但当时我其实没去过粤港澳大湾区。今年,我第一次去了香港。在准备行程时,才发现港澳通行证已经过期。很多证件都以十年为一个周期,但就在一切备齐时,最终也没促成行程。这一次,算是弥补了过去十年的遗憾。这次去香港,从蹲点太平山顶的烟花展到漫步西贡码头,从看不懂的 M+ 到 Hotel ICON 的榴莲自助,在快速感受这个城市的律动同时,我也攒下了足够很长一段时间回忆的美好碎片。一路上,遇到的人和事,除了让我开心快乐外,也真正让我慢下来思考。也是从今年起,我开始考虑长期规划的变数,我正式取消了在北京安家置业的打算,而开始向更适合的职业发展机会倾斜,去哪个城市、做什么工种,更多只是需要考虑的配套罢了,并不 key。

旅行是快乐的,于是就会想着再多尝试几次,获得更多快乐。以前,每逢假期景点爆满的新闻总会让我焦虑,于是我更喜欢通过大家的朋友圈“云游四方”。但人生嘛,重在体验,也不用一成不变的固守一处。随着性子,以后遇到假期,还是可以有些不同的尝试。

今年,我还想从分享文字转向视频输出,也就是当一个 up 主,但遗憾的是,这件事情迟迟没有落地,本来半年结束时,我在反思自己不够快乐时有过这个想法,但生活琐事交织在一起,这里处理一下那里处理一下,就来到了年底,而我还没有真正开始动手。今年还有个小成就,就是带家人逛了北京、天津和上海这几个城市,在纯粹的陪伴中,我感到自己是被需要的,再加上全程都是我一手操办,想想就很开心。

磨平棱角,中庸其实是个中性词

人到中年,我发现自己越来越倾向中庸之道。在我看来,这是一个中性词,生活里、工作中、感情上,很多事情没有绝对的对错,只是是否匹配或者合适,所以我也不再用 YES or NO 来回答,取而代之的是带着前因后果与个人思考的阐述,希望为回答提供更多上下文,让“读者”能更明白我的所思所想。事实上确实如此,“你过了 35 工作怎么办?”、“买这个能赚钱吗?”、“AI 到底能提效多少?”,这些问题怎么可能会有直接的答案呢,但事实证明,更多的补充与不直接回应,很少换来感同身受,反而会被推诿成不直面问题、犹豫不决、能力不足等等。

但好在,相比年轻气盛时,我已不太在意他人眼光了。不再需要证明自己就是对的,不再需要频繁得到他人肯定,我认可人本质上还是孤独的,开始用更多的时间来探索与自己、与世界的相处之道。倒不是说不需要恋爱、家庭,不需要工作、生活,或者不需要与外界接触和反思,只是说在特定事情上的处理方式开始频繁向内追求自洽,寻求内心平静罢了。如果一个事按照符合心意的方式发展,能在沟通中获得他人的共鸣,自然会很欣慰、会开心,但如果事与愿违,或得不到别人的理解,那么在一声叹息后,虽有遗憾,也会放下继续前行。

磨平棱角后,在权衡利弊中不再勇敢和不顾一切,好处是终于可以舒服地在社会上生存下去,但这样真的好吗?理性可以让很多事情的解法可量化、可计算,走向确定性,但还有很多时候,拥抱天马行空时,为了那微不足道的可能性想冲一把,仍需要上头瞬间的感性。

虽然走向中庸,但如何平衡理性和感性的配比,仍是新的一年我要继续学习的课题。

写在最后

今年的总结有太多和 AI 相关的笔墨,这既是生活经历的写照,也是真实的职业焦虑。但回过头来,或许并不需像上文般如此焦虑。以人类的草台程度,AI 的全面替代还要在很多年后。我有很多新的想法并没写下,但我认为对 AI 能力更切实的描述应该是,一个可以辅助人类生产、生活变化的革命,在其中,AI 既提升生产力效率,也可以拉高创造力上限,但要做到端到端全场景智能,还太过完美化,我们到现在连人类大脑都还没完全摸清楚呢。

退一万步说,或许 AI 能做很多事,AI 也确实能在某一天完全替代我们,但你我存在的意义并不需要过多去外界寻求价值锚点。平淡或是精彩,我们认真生活的每一天,都是独一无二的,而这些组成我们的情感、经历、思想,这就是我们,直到最后、最坚定的人类信念。

如果感到焦虑时,可以停止快速滑动手机屏幕,走出门外,大口呼吸新鲜空气,感受阳光洒在身上时,你注视眼前那些烟火气的认真瞬间。今年没怎么分享我的年度 TODO 完成情况,但在那些没有太多被说道的琐事瞬间里,我仍在认真生活。新的一年,希望大家平安健康,我也要好好加油。希望突破现状,希望有所收获。

新年快乐。

提示工程最佳实践:如何与 AI 更好地对话

作者 Joe Jiang
2025年11月26日 00:00

Claude 最近新发了一篇关于提示工程最佳实践的文章,其中提到了诸多如何更好的写好提示词以利用 AI 帮助大家精准解决问题的思路,太长不看可以直接拿走这份思维导图。以下正文会详细给大家分享一下我认为文章还不错的很多精华部分。

什么是提示工程?其本质是修改传递给大语言模型(LLM)的查询,核心是在实际请求前添加 “正确的信息”。提示工程的核心价值在于:

  • 提示工程是构建指令以从AI模型获得更优输出的技巧,包括表述查询、指定风格、提供上下文和引导模型行为等方面。
  • 模糊指令与精心设计的提示差异显著:前者可能需要多次沟通澄清意图,后者可一次性达成目标。
  • 提示工程是上下文工程的核心组成部分,与对话历史、附加文件和系统指令协同作用,共同优化AI输出结果。

一个合适的学习路径应该是先掌握基础习惯,再逐步应用复杂项目的高级方法。

一、核心基础技术

1. 指令明确清晰

核心原则:直接告知模型期望的结果,不假设模型能推断需求,使用简洁无歧义的语言。

最佳实践

  • 以直接的动作动词开头(如“撰写”、“分析”、“生成”、“创建”)。
  • 跳过开场白,直接切入请求核心。
  • 明确输出应包含的内容,而非仅说明处理对象。
  • 具体说明对质量和深度的期望。

示例对比

模糊表述:“创建一个分析仪表板”
明确表述:“创建一个分析仪表板,包含尽可能多的相关功能和交互,超越基础要求,实现功能完备的方案”

2. 提供上下文与动机

核心价值:解释需求背后的原因,帮助AI理解核心目标,生成更具针对性的响应(对能推理潜在目标的新型模型尤为有效)。

适用场景

  • 说明输出的用途或受众。
  • 解释特定约束存在的原因。
  • 描述输出的使用方式。
  • 指明要解决的具体问题。

示例对比

效果较差:“绝不要使用项目符号”
效果更佳:“我偏好自然段落形式的响应而非项目符号,因为流畅的散文更易阅读且更具对话感,项目符号对我的轻松学习风格而言过于正式和列表化”

3. 指令具体化

核心要求:通过明确的指导方针和要求构建指令,具体程度越高,结果越优。

需包含的关键要素

  • 明确约束(字数、格式、时间线)。
  • 相关上下文(受众、目标)。
  • 期望的输出结构(表格、列表、段落)。
  • 任何要求或限制(饮食需求、预算限制、技术约束)。

示例对比

模糊表述:“创建地中海饮食的膳食计划”
具体表述:“设计一份用于糖尿病前期管理的地中海饮食膳食计划,每日1800卡路里,重点关注低血糖指数食物,包含早餐、午餐、晚餐和一份加餐,并提供完整的营养成分分析”

4. 使用示例(单样本/少样本提示)

核心作用:通过示例直观展示期望的格式、语气或模式,比纯描述更易澄清复杂需求。

注意事项:现代模型(如Claude 4.x)会密切关注示例细节,需确保示例与期望行为一致,避免传递不良模式。

适用场景

  • 期望格式难以用文字描述。
  • 需要特定语气或风格。
  • 任务涉及微妙模式或惯例。
  • 简单指令无法产生一致结果。

实用技巧

  • 先尝试1个示例(单样本),仅在输出不符合需求时添加更多示例(少样本)。

示例对比

无示例:“总结这篇文章”
带示例:“以下是我想要的总结风格示例:文章:[AI监管相关文章链接] 总结:欧盟通过全面的《人工智能法案》,针对高风险系统,核心条款包括透明度要求和人类监督规定,2026年生效。 现在按相同风格总结这篇文章:[新文章链接]”

5. 允许AI表达不确定性

核心目的:减少模型的幻觉(虚构信息),提高响应的可靠性。

示例

分析这份财务数据并识别趋势,若数据不足以得出结论,请直接说明,不要猜测

二、高级复杂场景技术

1. 预填充AI响应

核心作用:提前启动AI的响应内容,引导输出的格式、语气或结构。

适用场景

  • 需要输出JSON、XML等结构化格式。
  • 希望跳过对话开场白,直接获取核心内容。
  • 需维持特定语气或角色。
  • 要控制AI的响应开头方式。

2. 思维链提示(CoT)

定义:要求AI在给出答案前进行分步推理,适用于复杂分析任务。

适用场景

  • 无“扩展思考”功能可用。
  • 需要可审查的透明推理过程。
  • 任务涉及多步分析。
  • 需确保AI考虑特定因素。

三种常见实现方式

  • 基础思维链:在指令中添加“分步思考”。示例:“为Care for Kids项目撰写个性化捐赠请求邮件,先分步思考再动笔”。
  • 引导式思维链:指定具体推理阶段。示例:“撰写邮件前先思考:1. 根据捐赠者历史,哪些信息可能吸引他们;2. Care for Kids项目的哪些方面能引起共鸣;3. 基于分析撰写个性化邮件”。
  • 结构化思维链:用标签分隔推理过程与最终答案。示例:“用<thinking>标签记录思考过程(分析吸引捐赠者的信息、项目相关亮点),用<email>标签呈现最终邮件”。

注意事项:“扩展思考”与手动CoT可互补使用,复杂任务中结合使用效果更佳。

3. 控制输出格式

核心原则:通过正向引导、风格匹配和明确要求实现格式控制。

三种有效方法

  • 正向指令优先:不说“不要做什么”,而说“要做什么”。示例:不说“不要使用Markdown”,而说“响应应采用流畅的散文段落”。
  • 提示风格与输出风格匹配:若希望输出少用Markdown,自身提示中也应减少Markdown使用。
  • 明确格式偏好:详细说明格式要求。示例:“撰写报告时使用完整段落和标准分段,Markdown仅用于行内代码、代码块和简单标题;非必要不使用有序/无序列表,将内容自然融入句子中”。

4. 提示链

定义:将复杂任务拆分为多个连续步骤,每个步骤用单独提示处理,前一步输出作为后一步输入。

核心优势:以增加延迟为代价,提高每个子任务的准确性,适合需要迭代优化或中间验证的场景。

适用场景:

  • 复杂请求需拆分步骤。
  • 需要迭代优化输出。
  • 多阶段分析任务。
  • 中间验证能提升最终质量。
  • 单条提示输出结果不一致。

示例(研究总结):

  1. 第一条提示:“总结这篇医学论文,涵盖方法、发现和临床意义”。
  2. 第二条提示:“审查上述总结的准确性、清晰度和完整性,提供分级反馈”。
  3. 第三条提示:“根据以下反馈优化总结:[第二步的反馈内容]”。

三、技术整合使用提示

1. 尝试通过多技术组合达到目的

从这份季度报告中提取关键财务指标,以JSON格式呈现。该数据用于自动化处理,因此响应必须仅包含有效JSON,无开场白或解释。使用以下结构:{\"revenue\":\"带单位的值\",\"profit_margin\":\"百分比\",\"growth_rate\":\"百分比\"}。若报告中未明确说明某指标,用null表示,不要猜测。响应以左大括号开头:{

2. 技术选择决策框架

基础判断步骤

  • 需求是否清晰明确?若否,优先优化清晰度。
  • 任务是否简单?是则仅使用核心技术(明确、具体、提供上下文)。
  • 是否需要特定格式?使用示例、预填充或明确格式指令。
  • 任务是否复杂?考虑拆分任务(提示链)。
  • 是否需要推理?使用“扩展思考”(若可用)或思维链。

技术-需求匹配表

需求场景 推荐技术
特定输出格式 示例、预填充、明确格式指令
分步推理 扩展思考(Claude 4.x)、思维链
复杂多阶段任务 提示链
透明推理过程 带结构化输出的思维链
防止幻觉 允许AI说“不知道”

3. 常见问题故障排除

问题现象 解决方案
输出过于通用 增加特异性描述、提供示例、明确要求“超越基础内容”
输出偏离主题或未击中要点 更明确地说明核心目标,提供需求背后的上下文
输出格式不一致 添加示例(少样本)或使用预填充控制响应开头
任务复杂导致结果不可靠 拆分为多个提示(提示链),每个提示专注单一任务
AI添加不必要的开场白 使用预填充或明确要求“跳过开场白,直接给出答案”
AI虚构信息(幻觉) 明确允许AI在不确定时说明“不知道”
期望执行操作,AI却仅提供建议 明确动作指令(如“修改此函数”而非“你能建议修改吗?”)

4. 实用技巧

  • 从简单提示开始,仅在需要时添加复杂技术。
  • 每次添加技术后测试效果,确认是否真的提升输出质量。

四、常见错误与避坑指南

  1. 过度设计:更长、更复杂的提示不一定更好。
  2. 忽视基础:核心提示模糊不清时,高级技术无法弥补。
  3. 假设AI能“读心”:不明确的需求会导致AI误解,需具体化所有要求。
  4. 滥用技术:无需同时使用所有技术,仅选择解决特定问题的方法。
  5. 不迭代优化:首次提示极少完美,需测试并调整。
  6. 依赖过时技术:XML标签和过度角色提示对现代模型必要性低,优先使用明确指令。

五、最终建议

  1. 核心定位:提示工程本质是“沟通”,即用AI能清晰理解的语言表达意图。
  2. 学习路径:先熟练掌握核心技术,形成习惯后,仅在解决特定问题时添加高级技术。
  3. 优质提示的关键:并非最长或最复杂,而是能以最少的结构可靠达成目标。
  4. 与上下文工程的关系:提示工程是上下文工程的基础,每一个优质提示都是塑造AI行为的重要组成部分。

参考

原文:Best practices for prompt engineering

2024年终总结

作者 Joe Jiang
2024年12月31日 00:00

前些天还有很大冲动要赶紧忙完手头事给这个年更节目预留时间,但真腾出空来打算下笔时,迟疑了很久,不知从何说起。打开相册从 1 月翻到 12 月,各种平淡无奇的片段一闪而过,要说这一年都干了些什么,貌似除了继续“熬”着并没有什么让我印象深刻,但真当想放弃时,又觉得该为他记录些什么。此刻的我扁桃体发炎加高烧不退,最终能写下啥文字,有几分可读性也不再清楚,但年更节目不能断更。

在投资中感受人性的贪婪与恐惧

要说这些年的“熬”收获了什么,我首先想到的是对贪婪与恐惧的人性有了更深的认知。在每一轮行情中,除了感受市场冷暖,自己的贪婪与恐惧也随之不断辗转。

今年初,A 股在急跌后迎来了一波转瞬即逝的疯狂反弹,就当大家还没回过神来,随着经济数据陆续出炉,市场情绪迅速冷却,一路阴跌到 9 月缩量到每天 6000 亿左右。熬到熊市第三年,加仓的间隔与金额在每次计算时都显得更加谨慎,虽然心知肚明,市场不可能一直跌下去,但在经济下行的背景下,不论是宏观行业还是微观个体的经济状况,都在不断恶化,我也早已没了从前的自信。

就在市场绝望之际,9 月底重磅会议突然加场,给政策转向定调,市场情绪直接被点燃。你说这半个月不到的时间里,有实体经济变化了吗?丝毫没有。但上证指数就直接旱地拔葱式的从 2700 直接跳到将近 3700,“信心比黄金重要“。甚至,一位从不投资的同事,也在国庆期间信誓旦旦跟我预测:指数月底必上 6000,年底 10000 不是梦。当然,没人能猜到市场怎么走,一路狂欢的暴涨行情在国庆后也戛然而止。直至今日,A 股的震荡行情已持续三个月了。

不仅要有目标,还要有清晰的执行计划

你可能会好奇,在今年市场最疯狂的那半个月,我做了什么?市场突然转向,几乎没给我太多时间思考行动方案,但却给我带来了巨大的焦虑。这种急涨行情明显不可持续,我频繁问自己是否需要撤出一些已盈利仓位;与此同时,更让我不安的是随着行情从火热变得火爆,因为手头还有闲钱在活期,我也开始担心错过。

即便不知道击鼓传花最终停在谁手中,但我仍会觉得自己不是那最后一个,于是我开始谨慎增加了短期仓位,并开始沉迷于每天不停地刷新软件。从结果上看,没动长期仓位以及通过短期网格使我不仅享受了完整行情也额外赚到几波零花钱,多少算个小股神,但只有我知道,当时的我可不是这个状态。

直到现在,我仍会设想另一条不曾发生过的场景:如果行情快速跌回到 2 月?如果因为担心过早撤出了大量仓位,而后又上头追涨了进去?人终归是动物,贪婪与恐惧的情绪在投资上会被极大放大,如果没有清晰的执行计划,那么就只能依靠不可靠、充满情绪的大脑。

市场上赚钱翻倍的机会数不胜数,但只需要亏一次就可以净值归零。提前做好计划,不预测,只应对。新的一年,要把完善的执行计划补齐。

不用等到一切都就绪才开始

很多时候,我都会倾向一件事情在大体上就绪才开始,因为,太多的不确定性会给我一种”失控感“。我曾经从中受益良多,从竞赛获奖到推免保送,从校招斩获众多 offer 到依据自身规划跳槽晋升加薪,这些大多都是在有了足够准备和充分练习后,奋力发起一击的结果。但凡事没有银弹,并不是所有事情都适用这种方式,也不是所有事情都有足够的时间等得起你的准备。

还记得两年前就和朋友约定好,我们要互相监督努力发展副业,但两年过去了从没行动起来。反省起自身,也不算是个拖延症的性格,但就是一直没开始,源头还是因为我真的没准备好。我还需要想清楚,但如果一直不能想清楚呢?

我们今年做出了改变,先从稳定的输出开始。不论是生活、技术还是商业、社会,不用过多的关注行文段落和措辞,但要输出鲜明的观点。我还记得逼迫自己将第一篇文章选题香港时,逼迫自己在半小时内完成搜索、阅读、学习以及将文章发表出来当时争分夺秒的紧迫感。随后的大半年时间里,我利用下班、周末、健身的间隙记录些思路关键词,并通过其他空余时间将其扩写成文章。期间不仅越写越顺畅,还结识了不少朋友。

你要问我现在准备好了吗?我会说并没有,也许永远都准备不好,因为永远都会有值得琢磨与优化的空间,但他已经不影响我行动起来。在行动的过程中,不断地审视与回顾,使自己对要做的事情也有了更加清晰的认知。可能最初我定的目标是向东走,而后发现应该转向东南,但这都不重要,重要的是行动起来。行动的过程,也是在梳理思路、发现自己的过程。

留出时间,与自己对话

这些年经济下行压力很大。各行各业都受此影响。本以为熬一熬就能看到光明,但实际等来的却是起落落落。每个你我都承受了很多,这在日常工作上体现为”不停的内卷“。当增量市场没了空间,就只能从存量市场中抢蛋糕。当自己行业的蛋糕不够吃,便开始觊觎跨行业的蛋糕。一个直观的数据来源,从统计局统计的人均每周工作时长在不断提升。

我们都知道卷不好,但更不好的是他的副作用。我经常听到一些朋友的声音,他们说,再熬一熬,忍一忍就好了。但就像今年 9 月的闪电行情一般,如果我们只是一味的熬,而不思变,那等行情真正来临时,我们如何反击?一味的内卷,既是对当下生活的麻木应对,也占用我们用于思考的时间。

我今年坚持下来的几个习惯,都源自留出的时间。即便工作再忙,我都留出时间写作、健身与复盘。游泳吐气之余,思考自己昨天做的事还有哪些改进措施可以做得更好;坚持输出观点之余,与自己对话,为不断学习、不断收获的自己喝彩;坚持投资复盘之余,找到自己的弱点、补齐短期计划并实施。每个人都是一个独立个体,世上能真正与我们感同身受的只会有我们自己。懂的自己的希望与迷茫,快乐与悲伤,才能知道自己想要向哪走,以及如何走。

享受结果的同时也享受过程

今年的世界变得太快了,不论是世界政局变化还是国内经济发展,很多人都认为未来不会再好了。既然如此,那也不用熬了,直接躺平。躺平是一种生活选择,无关对错,不过我有另一个看法。

你不会说,当我想要收养一只小猫时,我发现猫是有寿命的,最终仍会离开这个世界,那我就不好好对它了。因为,在它陪伴你的每一天,那些美好的时光和片段,就会是最大的享受。另一方面,通过你的悉心照料,小动物可能会拥有稍长的快乐生活时光,而这个是你可以掌控的。

我们虽然希望享受结果,但过程一样重要。

保持好奇心与观察力

我读书期间去过国外一段时间,当时回国前,一位老师对我说,”Keeping curious“,随后我将那天的照片放在博客,直到今天。我的好奇心与观察力似乎一如往常,而如果我有机会再遇到他,我想好好的感谢他对我的鼓励。

不知道有没有人像我一样,会因为小区晚上更加明亮而发现物业更换了一批更节能的路灯,发现平日上班的小道被市政凿开重新铺了砖块,也会发现航班上的小桌板不再每次都保持干净,发现外出就餐时餐厅工作人员变少以及更多的引导我们自助扫码点单。我们工作时,大家不再考虑我们一起做出一款卓越的产品,而是更多考虑这个功能的投入产出比以及是否有用户需求。当我们购买电子设备时,导购员也不再无脑鼓吹你下单,也会给你提供一些优惠券的领取建议。

世界还是我们从小到大的那个世界,但似乎又在细微之处变了许多模样。充满好奇心,对周边事物持续观察,我仍享受着由此带来的乐趣与自由。此刻的我即将踏上再次前往上海的旅途,而我记忆深刻的仍是年初在上海的打车日记以及年中去上海与网约车师傅的一路交谈

这一年我还做了些什么

三月份,达成了一个人做手术的顶级单身成就。我在手术当天提前到医院候着,在护士的引导下换上病服,但刚走进手术室便开始犯嘀咕了,”这手术室简陋的怎么跟电视剧里演的不一样呢?“

这一年,除了几次去医院以及附随的康复期,我几乎每天都坚持到健身房打卡。自从去年同事鼓励我尝试器械锻炼后,我便一直坚持了下来。虽然没有健身房那些霸榜大哥的爆炸肌肉,但更有型一些的身材以及每次拳击时挥洒汗水的快乐,已经让我快乐满满。

虽然没有明确的出游计划,但今年因为各类事情的凑巧,还是逛了不少地方,也攒下了不少游客照。而”读万卷书,行万里路“里的读也仍在状态。

在公交车上,在地铁里,在商场等号就餐间隙,在上下班路上,对着那个电子屏幕,不断地翻页,不停地阅读。c除了书籍外,年初我还定了一个目标,即追更完今年所有的《财新周刊》,除了当下因为发烧无法继续的最后两期,我几乎坚持了下来。从财经、商业、宏观世界到人文落地,这份稳定且有质量的信息源,很好的扩充了我的世界观与从信息中攫取价值的能力。

今年,也并不都是美好。我坚持了多年的居家做饭习惯,中断了。一方面是享受做饭准备时的放空感,另一方面是真正尝到自己动手成果的自豪感,这难免不让我觉得遗憾,希望明年能拾起这中华民族自古以来的”优良传统“。

写在最后

这一年,不能说没有遗憾,但能够更坦然的应对失误、不纠结当下,我的世界观与认知明显正在变得更加完整,这让我感到充实、自由。虽然这可能不是我努力的结果,而是岁数到了。

轻舟已过万重山。新的一年,要加油。

车里的微光

作者 Joe Jiang
2024年7月25日 00:00

刚到虹桥

下了飞机,我沿着通往停车场的道路走去,同时打开手机叫网约车。每次在机场叫车,貌似都需要跟司机沟通一番确认上车地点,软件的上车指引貌似只是一纸友好但过期的提示,并不具备实际参考价值。没过多久就有司机接单,很快一个电话打来,司机让我到另一层等他,我毫不犹豫地答应,径直朝向约定地点走去。当车到达,我把行李放入后备箱,像往常一样打开后座门坐了上去。

“师傅,不走高速哈,其他随意”,我说。

“好的,这一路没有高速,只有些高架”,他回答,“如果你在浦东叫车,那边可能有”。

“浦东啊,我前几个月来过一次,当时是从浦东机场出发的,那边可远了”,我抱怨道,“后来,我都注意选到虹桥机场了”。

我沉默了一会,继续说道:“浦东的客流是不是比虹桥少一些,毕竟远离中心市区嘛”。

“其实也不少,我们也能接到不少单。那边虽然远,但我更愿意接,赚的会更多一些”。

“是的,路途远价格就会高些”,想着师傅这么晚接我的单,于是我鼓励到:“师傅,你这么晚还跑车,家人肯定也挺心疼你吧”。

“就我一个人在这边,家人都在老家呢。对了,等你回去的时候可要注意,从哪个机场出发,别走错了,不然可就麻烦了”。

“好的”。

激烈的竞争

平时外出,我都会主动给家里报平安。在给家人回复完消息后,我又主动与师傅搭话:“上海的高架桥挺多呢,还有地道,车开着也不会堵吧,感觉比北京要好很多,经济也比北京有活力”。

“是啊,这里的路,建设的很好,到哪都方便”,他说道,“北京是首都嘛,上海还是比较多搞经济的人儿。但是啊,这两年也没以前好了啊。社会上那么多公司,又是裁员又是降工资的。就拿我们自己说,这半年赚到的也比原来少了很多”。

我说:“确实,我也有听说,好像滴滴提升了不少抽成比例吧?”

“是的,比如平常你付 100 块钱的单,我们能拿到 80 块,今年可能就只有 70 喽,尤其今年过完年之后,这不就是压榨我们司机嘛”,从话语中能听到师傅对现实的无奈,但他仍在坚持。

“经济不好,大家就都卷起来了,同行互相卷,平台卷司机”,由于聊的比较投机,我继续说到,“现在,不仅滴滴抽成,你们内部也有危机感吧。前段时间新闻不是提到萝卜快跑嘛,也会抢走大家一些饭碗吧”。

“是啊,那萝卜在武汉多火啊,抖音上天天刷到。不过说回来现在道路这么复杂,你说我们都开不明白,他机器还能开明白咯”,师傅继续说道,“你看新闻不是也说两个萝卜在转弯的时候互相卡住了嘛,一动不动,给路上堵得哦。“

师傅继续,“人还能听交警的话,那萝卜哪会听啊?路上要都是萝卜,那得乱套了。我看啊不太行,这开车还是需要人”。

Untitled

电车与保险

“但现在电车真的很便宜,你觉得呢”,师傅谈兴正浓,开始饶有兴趣地给我介绍车市行情:“你看前阵子,比亚迪那车一出降价消息,价格就低了不少!依我看,其他车企啊都得跟着降。电车以后肯定会越来越便宜,大家都能买得起车”。

我突然有个疑问,便向师傅问道,”师傅,你说这路上跑的有多少是新能源车呢?”

“一百辆里,至少得有五、六十辆吧”。

“那还挺多的。北京虽然也有新能源车,倒没这么多。可能因为天气冷吧,电池不经扛?”

“是的,天气冷,电池掉电起来非常快,电车还是南方多些“。

我继续追问师傅:“话说,电车你考虑过蔚小理吗?相比比亚迪,他们的车型应该会更便宜些吧,性价比更高?”

“比亚迪也不贵呢,而且质量多好呀。你看这次他们降价,又便宜了不少“,说到这,师傅扭了下身子,继续说道,“要说贵啊,还得是保险”。

“我之前倒是有了解过,好像是因为新能源车更容易出事故,再加上发展起来时间还太短,所以保险定价也比较困难?”

“事故确实多,发生得也快啊。就像上一次我在路上开车,眼看着前方一辆车冒烟了,就开一会到跟前的功夫,那车已经全部烧起来了,你说这多严重啊!”

我紧握着收集,听着师傅的描述,仿佛能看到那些惊心动魄的场景在眼前一幕幕上演。

师傅似乎还有很多经验继续分享,“不仅是容易着火,平时啊你一个不注意,保费都会往上涨点。我去年续保费用涨了 20%,当时业务员也很纳闷,后面一查发现是违章、扣分啊这些,影响最终的价格”。

“但这保费啊,就算再涨也得买呀。这年头,你要不上保险,哪敢开车往路上跑啊。万一撞到人,误工费、住院费、治疗费这些各种算在一起,哪赔的起啊“,他说着说着有些激动,”你知道我们最怕什么吗?”

我摇摇头,表示不知道。

“最怕那些跟你耗着的。遇到个事故,就算不是你的责任,人家是弱势群体,你都得搭进去好些时间和精力,还有赔偿。就说去年那会吧,我的车直接被交警扣押了一周多”。

我问道,“你当时遇到什么事了吗?”

师傅说:“当时在小区里,我开的很慢,突然不知道从哪个缝里窜出一辆电瓶车,‘咣’地一下撞到我车上。你说明明是他没看路撞上来,检查后也没发现什么大问题,但他就是躺着不肯走。最后没办法,我只能报警。警察来了后,了解了一下情况,直接把我车拖走。后面赔了钱,才把我的车拿回来。”

我又疑惑道,“按理说,这事故也不是你的责任啊,为什么交警要扣你的车?”

“不管谁的问题,你们之间没有协商好,交警就会先把车拖走,权当个抵押物吧”,他带着些许抱怨的语气说道,“必须等到双方协商好签完字,才能把车拿走。要是没法达成协议,对方还可以让你的车继续往后拖个十天八天的。车扣一天,我就少赚一天的钱,我在上海也要生活下去啊。你说,我哪拖得起呀?”

我安慰道:“有人就故意碰瓷,没事也说有事”。

“是啊,但你保不准会遇到什么样的人。现在买保险了,遇到事故就交给保险公司去处理了”,他说道。

她还在坚持

“还好有保险”,我感慨道。

“有了保险,也没太多改善啊,一样攒不下钱”,师傅感慨道,“你就说,我这一年跑车下来,也能赚个十几万不少了,要是在老家干活,一个月也就三四千,但还是攒不到钱啊”。

此时,路程已经好一会了,窗外的风景在多个高架桥和隧地道之间切换,一会明亮,一会阴暗,快速切换的光景让我时而可以放空发呆,给大脑一阵小憩。

车辆向前,貌似不再有地道了,具有经典上海街景的马路映入眼帘,两边整齐排列精致且小巧的楼房,在外饰灯光的映衬下还挺好看。即便如此,我还是感觉有些不对,说不上哪来的一股隐隐压抑感,突然,我想到,是对师傅印象的那种忸怩与割裂感,对的,就是这种不太真实的割裂感。

一个深夜这么努力跑车赚钱的师傅,对乘客出行给出热心建议,对新能源车行业也有自己的学习与了解,对激烈的市场和经济不好的大环境有所提防,同时还不忘配置保险保障家庭,怎么还会感慨攒不到钱呢。他的热情、努力与那份真实感,怎么都让我无法将他与那种赚到钱就去大手大脚消费、月光的人联系在一起。我心里犯着嘀咕, 而此刻,师傅开始主动搭话。

“我平时除了睡觉、跑车,也没啥开销,赚到的钱都往家里寄。你知道,我 88 年的,活到现在这个岁数,养家糊口啊开销很大,我这生活啊已经不是为自己而活了“。

我突然明白,原来师傅的钱都用在了家人身上,那确实花钱。还记得同事经常说,养娃就是个无底洞,师傅将花销都花在了孩子身上,那想必也是幸福的烦恼吧,我一阵释然。

师傅继续说道:“上有老下有小的,今天女儿要上个补习班,明天儿子要去学个兴趣课程,到处都花钱,就跟流水一样”。

我轻松应答道:“是啊,养孩子嘛,为了孩子定位茁壮成长,还有上学,都很花钱的”。

师傅继续:“小时候,我就在读书上吃过亏,现在不想他们再吃亏了,我多跑车,让他们可以多学一些吧”。

“可怜天下父母心啊,孩子长大后会明白你的好的”,我说道。

“倒不奢求他们将来如何回报我们,现在社会上那么多不孝顺的新闻,见怪不怪了。为他们付出了这么多,要真等我老了,他们不管我了,我也不能怎么办”,师傅补充道。

“是啊,这就是单纯的付出与爱,是不求回报的”,此刻的我由于对亲子教育没有太多经验,也不太想聊,于是借着上有老下有小的话题,我开始向「上有老」延伸,但没想到接下来引出了非常沉重的话题。

我对师傅说道,”孩子嘛,至少还有个盼头,就是不求他们孝顺回报,但这么一天天看着他们长大,也算有所慰藉。但是家里的老人啊,这事就不那么好处理了“。

听了我的话,师傅似乎没有那么主动想接话,由于我对父母养老这个话题也很敏感,所以每当有机会,我都会拉着人一起聊聊,于是我继续说下去,”父母啊随着年龄增长,不管是生病还是养老陪护,都需要花精力、花钱,有的时候这些事情才让人烦恼“。

师傅向前挺了挺身子,然后回复到,“可不是嘛,父母这一病,不停地吃药、治疗,每个月那么多钱,压力很大“。

师傅的声音突然低沉下来,他紧紧握住方向盘,一字一句的吐露着:“我妈每天都在吃药,每个月花很多钱在买药上,但依旧在病痛中度过,已经很久了。花费这么多,但还是没法好,而我们也不能多做些什么,除了多赚些钱“。

“她得了癌症,熬到现在有三年了”,他补充道。

我的转过头,看着窗外快速略过的夜景,试图平复自己的情绪,但师傅的话语却像一根针,深深地刺入我心底。昏暗的夜晚,只能靠着不断来往的车辆折射的灯光,隐约看到师傅的身影,此刻,我透过后视镜扫了师傅几眼,发现他的眼眶已有些湿润,闪着微光。此刻,我想安慰他,却发现任何言语都显得是那么的苍白无力。

Untitled

尽力而为

只见师傅眼眶越来越红,他深吸一口气,仿佛在平复自己的情绪,然后继续说道:”你说做子女的哪能不管呢,但这三年来,不停地检查、更换治疗方案、换药治疗,花了很多,她每次忍着病痛的样子,让我看到真是如刀割一样。但我们已经尽力了“。

“是啊”,我憋出两个字回应师傅。

师傅继续说道:“我们家,我到上海来赚得多些,我爸在家打工,我老婆也在家打工,为了孩子和我妈,不停地攒钱,又哗哗的花出去,你说哪攒的下钱呐”。

“三年前她刚确诊癌症,当时每个月的钱还少些,但每隔两个月旧的检查一次,一次六七千,还要不断地买药。刚开始药便宜,后来药不管用了,医生就让我们换药吃,不断的换药,价格也不断上涨。上个月医生又跟我说之前的药不管用了,要换另一种药试试,一个月一两万。药越来越贵,也得继续吃着啊,她治疗着痛苦,但治不好,我们也难受。“

这时我想起了医保,于是忙问师傅:“你妈有买医保或者农村保险之类的东西吗,那个应该可以分担一些支出费用?”

“买啦。早几年,有个上门卖保险的,当时就给他们买了,赔了七八万吧,但要早知道,当时就该多买些,那样可以赔得更多。医保嘛,期初还能报一些,但后来不断加药、换药,那些进口药都不在里面,是不能报销的”,师傅一口气说了很多,但明显还没说完,他清了清嗓子,继续说道:“我妈是真遭罪,就这么一直扛着,扛了三年了,不知道还能撑多久了。我们真的尽力了”。

看到师傅的眼眶明显有些红润,我平静的说道:“你尽力了”,我不知道自己的表述是否恰当,于是停顿了一会,才继续说道:“可能努力改变不了结果,但至少让自己不留遗憾吧”。

”你说尽孝吧,我们也一直在努力,但就没个希望。过个一阵,就听到医生说这个药效没啥效果了,需要换新的药。你说就我们县城,大家都是一个月三四千的收入,我在上海还能赚不少钱,这要换其他家里可能早就放弃了“,师傅的声音开始颤抖,”我朋友经常说我太拼了,为了父母,为了孩子,我也得继续拼搏啊!”

“尽力而为,不留遗憾”,我说道。

“生活就是这样啊,但不还得继续努力嘛,总不能就这么放弃了。我妈都那么坚强,我也要继续努力。话说回来,我还是挺喜欢上海的,我能在这赚不少,让他们活的好些……”

车快到酒店了,司机放慢了开车速度,直到把车停在酒店大厅旁。他还在说,似乎没有喊我下车的意思,我也就继续听着。

“还是要买保险啊,有机会多了解些,这还是很有用的”,“多谢师傅,加油!”

这是我跟师傅最后的对话,此后我便下车,径直走向酒店。师傅也开车离去,继续他的人生旅程。放下行李后,我直奔健身房。跑了半小时步,我的心情好似才没有那么堵了,多亏运动帮我发泄一番。

Untitled

尾声

就是这么一次再普通不过的打车经历,两个青年相互交换了各自生活中一个又一个的故事,这是每个普通人都会遇到的日常,也是每个普通家庭都可能会面对的生活难题。

虽然他口口声声说不再为自己而活,但我仍能感受出,他对自己奋斗目标的在意与上心,对平淡、幸福生活的向往。我跟师傅这辈子可能也不再会有机会见面,不知道他的家庭生活未来会去向何方,他的母亲病情会如何发展,他的两个孩子长大会做什么工作。

但我想,我应早已知道这些答案。这样一个个真实而努力的身影,每天都在我们周围发生,他正是千千万万个普通人的缩影。

为了赚钱补贴家用深夜跑滴滴的司机;

不论刮风下雨仍坚守岗位的建设工人;

牺牲自己睡眠坚守夜班以保障城市基本运转的服务人员;

起个大早为了路面清洁的环卫工人;

精心备菜在食堂为大家准备放心食物的厨师;

以及,每一个为生活努力的你我。

为每一个认真生活、奋斗拼搏的身影加油,愿每一个像他般努力、坚持且热爱生活的人,都能幸福。

冬日打车日记

作者 Joe Jiang
2024年1月27日 00:00

今晚打车,司机停在一个靠近上车点拐弯口的路边,一直没开进来,期间他一直跟我站内信确认“出来了吗”,我和往常一样,快速回复说我就在定位点等他。回复完,貌似司机也没有动弹。

过了一阵他发来消息,问我能不能出去找他。他给我的理由是门口不让他开车进来。由于天气特别冷,我不太想动,于是文字回复他,“车子需要绕商场一圈才能进来,入口那是单行道”。回复完,对话框又陷入了沉默。

其实没有啥事,但我就是有点急,于是主动问他,到底是我出去找他还是他开进来,我说我可以出去,让他告诉我上车点。隔了一阵,他回复我,“我进来找你”。

由于绕行进来的这段路在下班点很堵,于是我又回到了室内大厅,那里会暖和点。期间我还在跟家人打电话,聊天过程中我带着一丝抱怨的语气提到,今天这师傅感觉对路不熟使我在外面等了很久,冷死了。

/

我期间也有一丝疑惑,司机跟我文字沟通这么多,为什么没直接打电话直接问我呢。过了好一会,车终于来了,我照常报了一下手机尾号,就全程沉默,直到快下车。

我发现临近目的地,司机还没有要停的意思,于是我赶紧说已经到了,但他似乎没听到,车仍旧向前多开了一会儿。

收拾好行李,正当我开门下车时,我发现他半侧着转过身来,双手合十,面带微笑,反复对我点头示意。

啊,我才反应过来,原来他是一个聋哑人。

/

在互联网企业工作久了,貌似自己的耐心都被削弱了不少,针对一些看似不寻常、不高效的事情,我甚至会在缺少观察和理解的前提下,直接下意识的设定立场与抱怨,不知道司机师傅有没有感觉到我的不耐烦。

从防止资本无序扩张、加速信息茧房、奶头乐理论到拉大贫富差距,互联网企业这些年一直没落得个好名声。但我想,他确实通过不断推出创新产品,给人们的生活带来便捷,从线上聊天、手机购物、扫码支付到方方面面,这都在深切的改变着我们的生活。线上打车不就给予了先天残障人士另一种更体面、适当、不风吹日晒的赚钱方式吗?

所以,互联网还是挺好的。

拔牙日记

作者 Joe Jiang
2023年11月11日 00:00

上两周去拔牙,遇到一个操作非常仔细的医生,不仅细心交待,还给我分析牙齿生长情况,以及可能存在的术后问题。

好景不长,拔完不到5小时,嘴中开始大量渗血,浑身疼痛,在吐了几大口鲜红的液体后,急忙请假赶到医院,找到了上午给我看病的大夫。

谁能想到呢,接下来医生在我嘴里简单捅了几刀,我就开始血流不止了。医生没有过多考虑,便开始给我止血,直到材料塞满了嘴巴,等到开始缝针才想起没有给我打麻药,而我已经疼到有点晕厥,旁边的护士姐姐还提醒道:“要不让他喝了这葡萄糖吧,我看他脸色不好”。

但医生本着专业素养,在动完刀后,立马把自己的老师叫来验收成果,老师看着我满眼的泪珠,语重心长的说:“你这没打麻药,小伙子受不了吧”,我听闻后赶忙应和点点头,随后他叮嘱该医生,以后一定记得先打麻药再……

随后,医生还留了我一会,本以为是要叮嘱些注意事项,没想到是想在病历上把这突如其来的遭遇仔仔细细记录一番。我明明已说不出话了,但为了记录下这个“疑难杂症”,他还是让我努力说一说,最后促成了一大段文字描述作为补充病情???能看出来,这是一位非常好学的医生。

接下来,由于嘴巴塞满材料且无法闭合,我跟粥汤以及水饺度过了两周,肉眼可见的瘦了。由于担心过久没让医生观察我的牙齿情况,于是我提前约定时间两天加挂了号,同时也做好了准备让医生拆线。果不其然,就在医生给我拆完线之后,又继续血流不止了。

医生紧急给我止血,往我嘴里塞了些材料,还让我继续咬着纱布呆上半小时观察,期间那种疼痛感仿佛又回来了……

临走前记得医生说要等塞入的胶原蛋白棉片自行溶解在牙槽内,可能要持续一到两周,但,好景不长,第二天吃饭的时候,也不知道是不是太饿了,直接一咕噜,整个棉片随着一口汤全给我吞到肚子里去了。

这苦涩的人生啊。

虽拔牙遇到插曲,但仍然感激医生们的辛勤付出,希望大家都健健康康,远离病痛。

网络安全科普:详解 HTTPS 与 TLS

作者 Joe Jiang
2022年12月25日 00:00

引言

现在的网站都推荐使用 HTTPS 来确保用户数据的安全,验证网站的所有权,防止攻击者创建虚假网站版本,以及将信任传达给用户。如果网站要求用户登录、输入个人详细信息(例如其信用卡号)或查看机密信息(例如,健康福利或财务信息),则必须对数据保密。

作为普通用户,当我们上网冲浪时,是否想过为什么越来越多的域名输入时是 HTTPS 开头而非 HTTP 么?HTTPS 相比 HTTP 多出来的 S 到底多了些什么?TLS 和 SSL 又是什么,握手机制是如何进行的?其在七层协议中处于什么位置,与 HTTPS 相关的概念比如 CA 证书、Keyless、DTLS、mTLS 又分别是些啥?当我们使用 wireshark 时又该怎么抓包分析……种种疑问,希望能通过这篇文章的介绍为大家解答其中的部分解惑。

背景与介绍

什么是 HTTPS

超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是设计用于在 Web 上传输内容的协议。 HTTP 是一种简单协议,它利用可靠的传输控制协议 (Transmission Control Protocol, TCP) 服务来执行其内容传输功能。由于数据在传输过程中是明文传输,因此无法保证网络通信在传输过程中不被篡改,安全性受到限制。

超文本传输安全协议 (HTTPS) 是 HTTP 的安全版本,但 HTTPS 并不是独立于 HTTP 的协议。它只是在 HTTP 协议的基础上使用 TLS/SSL 加密。HTTPS 经过加密,以提高数据传输的安全性。

为什么 HTTPS 可以保证安全

HTTPS 使用加密协议对通信进行加密。该协议称为传输层安全性 (TLS),但以前称为安全套接字层 (SSL)。该协议通过使用所谓的非对称公钥基础架构来保护通信。这种类型的安全系统使用两个不同的密钥来加密两方之间的通信:

  1. 私钥 - 此密钥由网站所有者控制,并且如读者所推测的那样,它是私有的。此密钥位于 Web 服务器上,用于解密通过公钥加密的信息。
  2. 公钥 - 所有想要以安全方式与服务器交互的人都可以使用此密钥。用公钥加密的信息只能用私钥解密。

HTTPS安全是由一套安全机制来保证的,主要包含这4个特性:机密性、完整性、真实性和不可否认性

  • 机密性是指传输的数据是采用 Session Key(会话密钥)加密的,在网络上是看不到明文的。
  • 完整性是指为了避免网络中传输的数据被非法篡改,使用 MAC 算法来保证消息的完整性。
  • 真实性是指通信的对方是可信的,利用了 PKI(Public Key Infrastructure 即「公钥基础设施」)来保证公钥的真实性。
  • 不可否认性是这个消息就是你给我发的,无法伪装和否认,是因为使用了签名的技术来保证的。

什么是 SSL/TLS

SSL(Secure Socket Layer)是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料。TLS(Transport Layer Security,传输层安全)是更为安全的升级版 SSL。

TLS 1.0 版实际上最初作为 SSL 3.1 版开发,HTTPS 是在 HTTP 协议基础上实施 TLS 加密,所有网站以及其他部分 web 服务都使用该协议。因此,任何使用 HTTPS 的网站都使用 TLS 加密。

使用了 SSL/TLS 之后,因为数据被非对称加密手段加密了,即使被截获,也是获取不到信息的。

TLS 协议实现的功能有三个主要组成部分:加密、认证和完整性。

  • 加密: 隐藏从第三方传输的数据。
  • 身份验证: 确保交换信息的各方是他们所声称的身份。
  • 完整性: 验证数据未被伪造或篡改。

为什么 SSL/TLS 可以保证安全

网站或应用程序要使用 TLS,必须在其源服务器上安装 TLS 证书(由于上述命名混淆,该证书也被称为 SSL 证书),而 TLS 连接是通过一个称为 TLS 握手的流程启动的,在这个过程中用户设备会和服务器交换确定信息,这些信息包括要使用的 TLS 版本、密码套件、TLS 证书、会话密钥等等。

而在浏览器端,当用户访问服务器页面的时候,浏览器会检查服务器的 SSL/TLS 许可是不是可用的,不可用的话,会提醒用户,这个网站不安全,也就是访问的数据可能被黑客截获;此时用户可以根据判断来不访问这个界面;许可都齐全的话,便可以安全的进行数据交互。

具体来说,SSL/TLS 在工作流程中通过如下三个方面保证安全性:

  • 通过 CA 体系交换 public key
  • 通过非对称加密算法,交换用于对称加密的密钥
  • 通过对称加密算法,加密正常的网络通信

术语表

为了方便大家阅读,特在此章将全文涉及到的一些专业术语进行整理,整理此术语表供大家查阅。

简称 英文全称 中文全称
CA Certificate Authority / Certification Authority 证书颁发机构
SSL Secure Sockets Layer 安全套接字层协议
TLS Transport Layer Security 传输层安全性协议
PKI Public key infrastructure 公钥基础设施
PCA Private Certificate Authority 私有证书颁发机构,又名私有 CA
HTTP Hypertext Transfer Protocol 超文本传输协议
HTTPS Hypertext Transfer Protocol Secure 超文本传输安全协议
- Public key 公钥
- Private key 私钥
OSI Open Systems Interconnection 开放网络互联模型
TCP Transmission Control Protocol 传输控制协议
DTLS Datagram Transport Layer Security 数据包传输层安全性协议
mTLS Mutual Transport Layer Security 双向 TLS
DH Diffie-Hellman key exchange 迪菲-赫尔曼密钥交换
- premaster secret 预主密钥

TLS 相关协议详解

HTTPS 协议组成

HTTP 协议是用于从网络传送超文本数据到本地浏览器的传送协议,HTTPS 协议简单讲是 HTTP 的安全版,在 HTTP 协议的基础上加入 SSL 层。

其中,HTTP的端口号为80, HTTPS的端口号为443,两者均为应用层协议,在 OSI 七层模型的最上层。

Untitled

HTTPS 与 CA 证书

在 HTTPS 的工作流程中,一个重要的角色便是证书,他的正常运行需要有一个证书(CA 证书):由专门的证书机构颁发。在知道了 TLS 的握手流程后,我们来看看证书在其中所起到的作用。

当客户端向服务端发送请求,请求中会向服务器提供以下信息:客户端支持的协议版本,比如TLS 1.0 版,此后,服务器返回经过 CA 认证的数字证书,证书里面包含了服务器的 public key,接下来证书在客户端的工作流程如下:

  • 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
  • 客户端然后验证证书相关的域名信息、有效时间等信息;
  • 客户端会内置信任 CA 的证书信息(此处一般指顶级 CA 的自签根证书,包含公钥),如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法;此外,客户端还会通过 OCSP 对证书状态进行查询;
  • 客户端在完成对数字证书的验证后,用自己浏览器内置的 CA 证书解密得到服务器的 public key;
  • 客户端用服务器的 public key 加密一个预主密钥(这个密钥将在之后结合随机数等信息被用于客户端和服务端各自生成用于网络通信的对称密钥),传给服务器。因为只有服务器有 private key 可以解密,所以不用担心中间人拦截这个加密数据而获取其中的密钥信息;
  • 服务器拿到这个加密的密钥,解密获取信息,再依据双方约定好的参数生成对称加密密钥,并以此和客户端完成接下来的网络通信;

关于 TLS 证书/CA 证书的更多细节,可以参见文章《奇妙的 SSL/TLS 证书》,本文不再深入探讨。

TLS/SSL 握手与密钥交换

HTTPS 连接建立过程和 HTTP 差不多,区别在于 HTTP(默认端口 80) 请求只要在 TCP 连接建立后就可以发起,而 HTTPS(默认端口 443) 在 TCP 连接建立后,还需要经历 SSL 协议握手,成功后才能发起请求。

Untitled

TLS 1.2 握手流程

在 TLS1.2 以前,需要2-RTT时间进行握手,我们具体来看每一步操作:

  1. 第1步:整个连接是从客户端向服务器发送“Client Hello”消息开始。该消息由加密信息组成,与此同时客户端也会将本身支持的所有密码套件(Cipher Suite)列表发送过去,包括支持的协议和支持的密码套件,也包含一个随机值或随机字节串。
  2. 第2步:响应客户端的“客户端问候”消息,服务器以“Server Hello”消息响应。此消息包含服务器已从客户端提供的 CipherSuite 中选择的 CipherSuite。服务器还会将其证书以及会话ID和另一个随机值一起发送。
  3. 第3步:客户端验证服务器发送的证书。验证完成后,它会发送一个随机字节字符串,也称为“预主密钥”,并使用服务器证书的公钥对其进行加密。客户端向服务器发送“ChangeCipherSpec”消息,通过会话密钥的帮助让它知道它将切换到对称加密。与此同时,它还发送“客户端已完成”消息。
  4. 第4步:一旦服务器收到预主密钥,客户端和服务器都会生成一个主密钥以及会话密钥(临时密钥)。这些会话密钥将用于对称加密数据。在答复客户端的“更改密码规范”消息时,服务器执行相同操作并将其安全状态切换为对称加密。服务器通过发送“服务器已完成”消息来结束握手。

在客户端和服务器之间进行了两次往返(2-RTT)以完成握手。 平均而言,这需要0.25秒到0.5秒之间的时间。而这只是握手过程,实际的数据传输还没有开始。我们绘制示意图如下解释如上流程:

Untitled

TLS 1.3 握手流程

TLS1.3 在握手上做了优化,只需要一次时延往返就可以建立连接(1-RTT),其握手基本步骤为:

  • 客户端问候:客户端发送客户端问候消息,内含协议版本、客户端随机数和密码套件列表。由于已从 TLS 1.3 中删除了对不安全密码套件的支持,因此可能的密码套件数量大大减少。客户端问候消息还包括将用于计算预主密钥的参数。
  • 服务器生成主密钥:此时,服务器已经接收到客户端随机数以及客户端的参数和密码套件。它已经拥有服务器随机数,因为它可以自己生成。因此,服务器可以创建主密钥。
  • 服务器问候和“完成”:服务器问候包括服务器的证书、数字签名、服务器随机数和选择的密码套件。因为它已经有了主密钥,所以它也发送了一个“完成”消息。
  • 最后步骤和客户端“完成”:客户端验证签名和证书,生成主密钥,并发送“完成”消息。
  • 实现安全对称加密:依据双方约定好的参数生成的对称加密主密钥,将被用在接下来客户端和服务端的网络通信中;

TLS 1.3 的核心宗旨是简单性。在新版本中,除去了 Diffie-Hellman(DH)密钥交换以外的所有密钥交换算法。简而言之,DH 算法(Diffie-Hellman 算法)可以保证在双方不直接传输原始密钥的情况下,完成双方密钥交换。

TLS 1.3 还定义了一组经过测试的 DH 参数,无需与服务器协商参数。由于只有一个密钥交换算法(具有内置参数)和少数支持的密码,因此设置 TLS 1.3 通道所需的绝对带宽比早期版本要少得多。示意图流程如下:

Untitled

基于 UDP 的 TLS 协议:DTLS

DTLS 介绍

DTLS 是基于 UDP 场景下数据包可能丢失或重新排序的现实情况下,为 UDP 定制和改进的 TLS 协议。

Untitled

DTLS 协议由两层组成: Record 协议 和 Handshake 协议

  1. Record 协议:使用对称密钥对传输数据进行加密,并使用 HMAC 对数据进行完整性校验,实现了数据的安全传输。
  2. Handshake 协议:使用非对称加密算法,完成 Record 协议使用的对称密钥的协商。

DTLS 与 TLS 握手差异

与 TLS 的握手流程相比,DTLS 的握手流程存在如下几点差异(左为 TLS 握手,右为 DTLS 握手):

Untitled

  1. HelloVerifyRequest 用于服务端对客户端实现二次校验;DTLS 的 RecordLayer 新增了 SequenceNumber 和 Epoch,以及 ClientHello 中新增了 Cookie,以及 Handshake 中新增了 Fragment 信息(防止超过 UDP 的 MTU),都是为了适应 UDP 的丢包以及容易被攻击做的改进;
  2. Certificate 是交换的证书,由协商后的算法确定是否需要传输;
  3. TLS 没有发送 CertificateRequest,这个也不是必须的,是反向验证即服务器验证客户端;当服务端要求验证客户端身份时,发起 CertificateRequest,此时客户端需要发送证书;
  4. ChangeCipherSpec 是一个简单的标记,标明当前已经完成密钥协商,可以准备传输;
  5. Finished 消息表示握手结束,通常会携带加密数据由对端进行初次验证。

DTLS 的握手防护、加密方式与应用场景

在实现机制上,DTLS 还存在几个特点,首先是握手防护机制,在这个机制中,除了上文说到的防止被攻击等在握手阶段引入的改进措施外,还有一个机制叫重传:

  • DTLS 每一方在每次握手中传送的第一个消息总是有 message_seq = 0。每当有新消息产生时,message_seq 的值就会增加1。
  • DTLS需兼容多种出错场景,出错时往往直接丢弃处理,而在 TLS 中,如果出错,则会中断连接;

以握手的第一阶段举例,客户端发送 Client Hello(不带 Cookie,区别于握手流程中的第二次 Client Hello)之后,启动一个定时器,等待服务端返回 HelloVerifyRequest,如果超过了定时器时间客户端还没有收到 HelloVerifyRequest,那么客户端就会知道要么是 Client Hello 消息丢了要么是 Hello Verify Request 消息丢了,客户端就会再次发送相同的 Client Hello 消息,即使服务端确实发送了 Hello Verify Request 还是收到了 Client Hello 消息,它也知道是需要重传,并再次发送 Hello Verify Request 消息,同样地,服务端也会启动定时器来等待下一条消息。

由于 DTLS 依赖 UDP,而 SSL/TLS 依赖 TCP,所以两者在加密方式上存在如下差异:

  1. SSL/TLS 不能独立解密单个封包,SSL/TLS 对于封包的认证需要序号作为输入,在 SSL/TLS 中并未直接传递序号,因为 TCP 是可靠的,所以 SSL/TLS 的两端各自维护自身的收发序号;
  2. DTLS 支持独立解密,其通过在每条记录中显式携带的序号作为解码的输入;此外,由于算法加解密的限制,DTLS所支持的加密算法为 TLS 的子集。

DTLS 主要被用在 WebRTC 协议中,以保证媒体传输的安全性。

客户端身份校验与 mTLS

在基础的 TLS 认证流程中,大量的场景都是确保用户访问的是真正的服务方,如:银行、电商网站等等,即保证用户不会被钓鱼网站或是中间人攻击,此时我们只需要在客户端侧对服务端身份进行校验。

SSL 连接中的客户端身份校验

在典型的 SSL 连接场景中,通过 HTTPS 连接到服务器的客户端会检查服务器的有效性,它会在启动 SSL 握手时检查服务器返回证书的有效性。但是,有时你可能希望将服务器配置为对与其连接的客户端进行身份验证。这样,你便可以只允许使用证书进行身份验证的用户访问 web 服务器上的资源。

启用客户端身份校验的两个基本步骤:

  1. 客户端需要获取、并安装经过 CA 认证的 SSL/TLS 证书
  2. 服务端需要开启客户端身份验证选项

Untitled

由于客户端安装证书的不方便性、成本高以及双因素身份验证的快速推行,客户端身份验证并没有得到广泛使用。

mTLS 介绍

很多时候,比如在一些支付场景下,我们和支付机构、商户构成的三者关系中,在商户和支付机构间需要保证相互的身份认证,以保证支付信息在两者间正常流转,这时便需要我们使用双向认证,即相互 TLS。

相互 TLS,简称 mTLS,是一种相互身份验证的方法。mTLS 通过验证他们都拥有正确的私人密钥来确保网络连接两端的各方都是他们声称的身份。他们各自的 TLS 证书中的信息提供了额外的验证。

mTLS 与 TLS 流程的区别

一个典型的 TLS 流程应该包含如下几步:

  1. 客户端连接到服务器
  2. 服务器出示其 TLS 证书
  3. 客户端验证服务器的证书
  4. 客户端和服务器通过加密的 TLS 连接交换信息

相比之下,mTLS 会在客户端验证服务器证书后加上几步,以保证服务端可以对客户端身份进行验证,并授予访问权限,一个完整的 mTLS 流程如下:

  1. 客户端连接到服务器
  2. 服务器出示其 TLS 证书
  3. 客户端验证服务器的证书
  4. 客户端出示其 TLS 证书
  5. 服务器验证客户端的证书
  6. 服务器授予访问权限
  7. 客户端和服务器通过加密的 TLS 连接交换信息

mTLS 的应用场景与安全性

由于公共互联网上亟待解决的问题是防止被访问的网站内容被篡改,保证用户不会访问到钓鱼网站;此外,再加上将 TLS 证书分发到所有终端用户设备上是非常困难的现状,mTLS 并没有被运用到整个互联网。mTLS 对于较小范围内的组织验证和通信非常有用,除了验证信息外,他还可以防止各种类型的攻击,比如在途攻击、网络钓鱼攻击以及恶意 API 请求等等。

mTLS 通常被用于零信任安全框架,以验证组织内的用户、设备和服务器。它也可以帮助保持 API 的安全。

HTTPS 与 Keyless SSL

虽然 HTTPS 可以解决传输的安全性但是引入了私钥的安全和管理问题。只要拿到了私钥,HTTPS 就如同虚设。尤其是在传统 CDN 加速场景下,需要将私钥证书同步给 CDN,无形中增加了风险,所以诞生了 Keyless 技术。这项技术可以使得客户在使用 CDN 进行 HTTPS 加速时保留其自身 SSL 的私钥,在仅有公钥的场景下顺利完成 SSL 握手。

在 Keyless 的作用下,服务端不解密密文,而是将经加密后的预主密钥(premaster secret)等数据打包发送给远端 key server,由其进行加工并返回数据;针对 DH 协商密钥的流程,服务端则负责将 DH 参数、服务端随机数、客户端随机数等数据传给 key server,由 key server 处理后返回 DH 数据以及证书等信息。

以 CloudFlare 为例,我们看看 Keyless 在部署时有设计哪些额外的流程以保证安全。为了使 Keyless SSL 安全,CloudFlare 边缘到 key server 的连接也需要安全。key server 可以为所有能够访问它的人提供私钥操作,就像一个密码数据库。保证只有 CloudFlare 可以访问 key server 来执行操作对 Keyless SSL 至关重要。

CloudFlare 通过相互认证的 TLS 机制来保证 CloudFlare 和 key server 之间的连接安全。在握手环节一章,我们提到了客户端对服务端的单方向身份认证,是通过验证 CA 证书来进行的,而后我们也提到了客户端身份校验,这在这里便派上了用场。在 TLS 双向认证中,客户端和服务端都由对方的证书并相互认证。

在 Keyless SSL 中,key server 仅允许携带 CloudFlare 内部签发的证书的连接。CloudFlare 使用我们自己签发的证书来进行双向认证。

在这里,我们以 RSA 为例,如下两图展示了在接入 Keyless 前后,TLS 握手过程的变化差异。

Untitled

Untitled

RFC 协议标准

本文介绍的各类协议均有对应的 RFC 标准,罗列于此供读者参考:

  1. TLS1.3 https://www.rfc-editor.org/rfc/rfc8446
  2. DTLS1.2 https://www.rfc-editor.org/rfc/rfc6347.html
  3. HTTPS https://www.rfc-editor.org/rfc/rfc2818.html
  4. MTLS https://www.rfc-editor.org/rfc/rfc8705

HTTPS 流量抓包与分析

利用 wireshark 我们可以对 https 流量进行抓包分析,下载地址见 https://www.wireshark.org/#download

操作与步骤

通过 Wireshark 我们可以很好的过滤 HTTPS 流量,比如如下常见的几个过滤条件:

// TLS加密传输数据的过滤器
ssl.record.content_type == 23  and tcp.dstport == 443

// TLS 建立连接
ssl.handshake.type == 1

// 在知道 IP 地址为A时的指定 TLS 流量
ip.addr == A && tcp.port == 443

但对于 HTTPS 流量,如果需要解密,我们还需要增加如下几个步骤来达成目的:

  1. 在终端打开你的 chrome 浏览器,并指定你的 SSL key 的 log 日志存放地址,假设地址为A;
  2. 在 WireShark 中,通过路径 Wireshark - Preferences - Protocols - TLS ,在 (Pre)-Master-Secret log filename 输入同样的地址 A,并保存;
  3. 然后通过第一步打开的浏览器访问 https 协议的网站地址,并在 wireshark 中指定 filter 例如 tls && ip.addr=1.1.1.1 来过滤指定 tls 流量;

通过 Wireshark 抓包,以一个 TLS1.2 版本的 ClientHello 消息报文内容为例,我们可以看到其中包含了客户端支持的 TLS 版本、加密套件、以及用于连接的 SNI 等信息

Untitled

同样的,以一个 TLS1.2 版本的建立连接为例,我们可以看到 Server 在返回 Server Hello 之后还返回了证书、Server Key Exchange 以及 Server Done 等信息

Untitled

应用与拓展场景

实现 Charles 抓包代理

用过抓包工具的人都知道,比如 Charles,Fiddler 是可以抓取 HTTPS 请求并解密的,它们是如何做到的呢?

简单来说,Charles 作为一个“中间人代理”,当浏览器和服务器通信时,Charles 接收服务器的证书,然后动态生成一张证书发送给浏览器,也就是说 Charles 作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被 Charles 拦截并解密,这包括服务器证书公钥和 HTTPS 连接的对称密钥。

由于 Charles 更改了证书,浏览器校验不通过会给出安全警告,所以 Charles 可以正常工作的前提在于必须安装 Charles 的证书,使系统信任。

为开发环境启动 HTTPS

在本地开发功能模块时,可能有些 Web API 前置要求环境为 HTTPS,这要求我们在本地开发环境也能够配置 HTTPS,OpenSSL 是 SSL 和 TLS 协议的开放式源代码实现,使用它,我们可以在本地生成一个自签名证书,以方便开发。如下一行命令可以帮助我们生成一个 HTTPS 证书以及私钥:

openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem

社区里有一个开源库叫 mkcert,可以更便捷的为你生成 TLS 证书,这里不深入介绍,感兴趣可以移步 https://github.com/FiloSottile/mkcert 查看更多。

注:为了能够正常使用,本地生成的证书需要被加入信任列表才能正常使用。

参考

  1. https://www.cloudflare.com/zh-cn/learning/ssl/what-happens-in-a-tls-handshake/
  2. https://tech.bytedance.net/articles/7166221771396349982
  3. https://blog.csdn.net/qzcsu/article/details/72861891
  4. https://tinychen.com/20200602-encryption-intro/
  5. https://comodosslstore.com/blog/what-is-ssl-tls-client-authentication-how-does-it-work.html
  6. https://web.dev/i18n/zh/how-to-use-local-https/
  7. https://blog.cloudflare.com/announcing-keyless-ssl-all-the-benefits-of-cloudflare-without-having-to-turn-over-your-private-ssl-keys/
  8. https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/
  9. https://tech.bytedance.net/articles/6915326021995200519
  10. https://www.cloudflare.com/zh-cn/learning/access-management/what-is-mutual-tls/
❌
❌