当前位置: 首页 > news >正文

利用AI助手高效解决IBM MQ AMQ8242E密码套件配置错误

1. 项目概述:当IBM MQ遇上AMQ8242E

如果你正在部署或维护一个基于IBM MQ的消息中间件环境,并且计划启用TLS/SSL加密来保障通道通信安全,那么你极有可能在某个深夜,于队列管理器错误日志里,与这个令人头疼的错误码不期而遇:AMQ8242E: SSLCIPH definition wrong

这个错误看似简单,却像一堵墙,直接阻断了你的加密通道建立。它通常出现在你为通道(无论是消息通道还是MQI通道)配置了SSLCIPH(SSL Cipher Specification)参数之后。系统告诉你,你指定的那个密码套件定义是“错误”的。但究竟错在哪里?是拼写错误?是MQ版本不支持?还是与底层GSKit(IBM Global Security Kit)的配置不匹配?在没有明确指引的情况下,排查过程往往变成了一场在文档、命令行和无数个配置文件中进行的“盲人摸象”。

传统的解决路径依赖于深度阅读IBM官方知识库、反复比对strmqikc命令生成的SSLKeyRingDb中的密码套件列表、以及手动调整通道定义。这个过程不仅耗时,而且对操作者的经验要求极高。一个字母的大小写、一个连字符的位置,都可能导致配置失败。

而本次分享的核心,在于引入一个全新的、高效的解题思路:利用DeepSeek这类先进的AI编程助手。我们不再需要完全依赖记忆和手动检索,而是可以将错误日志、配置片段、甚至是模糊的需求描述直接“喂”给AI,让它来扮演一个经验丰富的MQ专家角色,帮助我们快速定位问题根源,生成准确的配置建议,甚至解释背后的密码学原理。这不仅仅是解决一个具体错误,更是重塑了我们处理复杂企业级软件配置问题的工作流。

2. 核心需求与问题深度解析

2.1 AMQ8242E错误的本质与影响

AMQ8242E不是一个泛泛而谈的错误,它有着非常明确的触发条件:队列管理器的通道启动器(MCA)无法识别或接受在通道定义中指定的SSLCIPH参数值。

当你在通道定义中写下SSLCIPH('TLS_RSA_WITH_AES_256_CBC_SHA256')时,MQ的底层安全服务(依赖于GSKit)会拿着这个字符串去它内部的“可用密码套件清单”中进行比对。这份清单并非凭空产生,它是由以下几个因素共同决定的:

  1. IBM MQ版本:不同版本的MQ默认支持和启用的密码套件不同。较新的版本会淘汰老旧、不安全的算法。
  2. GSKit版本:MQ使用的加密功能由GSKit提供。GSKit的版本和编译选项决定了其密码学能力的基础。
  3. 密钥数据库文件(KeyRing)的配置:通过strmqikcgsk7capicmd等工具管理密钥库时,工具会根据当前环境“注册”可用的密码套件。
  4. 操作系统与FIPS模式:如果操作系统或GSKit运行在FIPS(联邦信息处理标准)模式下,则会进一步限制仅能使用FIPS认证的算法组合。

一旦你指定的SSLCIPH值不在上述交集范围内,AMQ8242E便会抛出。其直接影响是通道无法启动,消息流中断。在微服务架构中,这可能意味着一个关键的业务服务无法连接到消息总线,引发链式故障。

2.2 传统排查流程的痛点

在DeepSeek这类工具普及之前,工程师的排查路径通常是线性的、且充满摩擦:

  1. 确认错误:在AMQERR01.LOG中找到AMQ8242E错误,记录下出错的通道名称和指定的SSLCIPH值。
  2. 手动列出可用套件:在MQ服务器上运行命令runmqckm -keydb -list -stash -db <keyring.kdb>或查看strmqikc的执行输出日志,获取一长串密码套件列表。
  3. 视觉比对:拿着出错的SSLCIPH值,在长达数十行的列表中进行人工比对,检查拼写、格式(下划线还是连字符?)、大小写是否完全一致。
  4. 查阅文档:打开IBM官方文档,查找对应MQ版本的“Supported CipherSpecs”章节,确认该套件是否被支持。
  5. 环境检查:思考GSKit版本、FIPS设置等环境因素是否导致该套件被禁用。
  6. 试错修改:根据猜测,修改通道定义中的SSLCIPH参数,重启通道,观察错误是否消除。此过程可能重复多次。

这个流程的痛点在于信息碎片化高度依赖经验。密码套件的名称规范(如IANA名称与IBM内部名称的差异)、版本兼容性列表深埋在浩如烟海的文档中。新手工程师很容易在这里耗费数小时甚至数天。

2.3 DeepSeek介入带来的范式转变

DeepSeek的引入,将上述线性、手动的流程,转变为一个交互式、智能诊断的闭环:

  • 自然语言交互:你可以直接提问:“我的IBM MQ 9.3在Linux上报AMQ8242E,SSLCIPH设的是‘TLS_RSA_WITH_AES_256_CBC_SHA256’,可能是什么问题?” AI能理解问题的上下文。
  • 知识整合:DeepSeek在训练中吸收了大量的技术文档、社区问答和代码知识。它能瞬间“回忆”起不同MQ版本支持的密码套件差异、GSKit的命名惯例,而不需要你去翻阅多个PDF。
  • 原因推理与建议:它不仅能指出“拼写错误”,更能推理出更深层的原因,例如:“您使用的‘TLS_RSA_WITH_AES_256_CBC_SHA256’是IANA标准名称,但IBM MQ 9.3的SSLCIPH参数可能需要使用IBM格式的名称,如‘TLS_RSA_WITH_AES_256_CBC_SHA256’实际上对应‘TLS_RSA_WITH_AES_256_CBC_SHA256’(注意,此处举例,实际需核实)。建议您先使用runmqckm命令列出实际可用的套件进行核对。”
  • 生成解决方案:更进一步,它可以基于你的环境描述,直接给出正确的通道定义命令示例,甚至是修改密钥库属性的命令。

核心价值:DeepSeek扮演了一个“永不疲倦的初级专家”角色,它快速处理信息检索和初步诊断,将工程师从繁琐的查找和比对中解放出来,使其能更专注于架构设计和复杂问题解决。它降低了解决此类配置问题的门槛,并显著提升了排查效率。

3. 实操:利用DeepSeek诊断与解决AMQ8242E

下面,我将以一个模拟的完整场景,展示如何与DeepSeek协作,一步步解决这个问题。

3.1 场景搭建与错误复现

假设我们有一个IBM MQ 9.3.0的队列管理器QMGR01,我们需要在服务器连接通道SYSTEM.DEF.SVRCONN上启用TLS加密。我们已使用strmqikc命令创建了密钥库key.kdb并生成了 stash 文件。

初始错误配置:我们通过runmqsc命令修改通道定义:

ALTER CHANNEL(SYSTEM.DEF.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH('TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256')

重启通道或队列管理器后,在错误日志中看到:

AMQ8242E: SSLCIPH definition wrong.

此时,我们手头的信息只有:错误码、通道名、以及我们设定的SSLCIPH值。

3.2 第一轮交互:初步诊断

我们可以向DeepSeek提出如下问题:

“我在IBM MQ 9.3上配置通道SSL加密时,命令ALTER CHANNEL ... SSLCIPH('TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256')执行后,日志报错AMQ8242E: SSLCIPH definition wrong。请问可能的原因有哪些?我应该如何开始排查?”

DeepSeek的典型回复思路会包含:

  1. 核对可用套件:首先建议运行runmqckm -keydb -list -stash -db /var/mqm/qmgrs/QMGR01/ssl/key.kdb来列出当前密钥库实际支持的密码套件列表。
  2. 解释命名规范:指出IBM MQ的SSLCIPH参数有特定的命名格式,可能与通用的IANA名称不同。例如,对于上述套件,MQ中有效的名称可能是ECDHE_RSA_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256的某种变体,并强调大小写敏感。
  3. 检查版本兼容性:提示IBM MQ 9.3默认支持哪些密码套件,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256是一个较新且安全的套件,通常被支持,但需确认。
  4. 建议操作:给出具体的检查步骤顺序。

实操心得:与AI交互时,提供尽可能多的环境信息(MQ版本、操作系统、密钥库路径)能获得更精准的回答。第一轮提问的目标是获得一个结构化的排查清单,而不是立即得到答案。

3.3 第二轮交互:基于排查结果的深入分析

根据DeepSeek的建议,我们执行了runmqckm -list命令,得到了一份冗长的列表。我们发现列表中有ECDHE_RSA_AES_128_GCM_SHA256但没有TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

我们带着新信息进行第二轮提问:

“根据你的建议,我运行了runmqckm -list命令。在我的密钥库支持的列表中,我看到了‘ECDHE_RSA_AES_128_GCM_SHA256’,但没有找到我之前配置的‘TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256’。这是否意味着我需要去掉‘TLS_’前缀和‘WITH’、‘_’连接符?另外,这个列表中的套件名称格式是固定的吗?”

DeepSeek的回复会进一步明确:

  1. 确认格式:是的,在IBM MQ的SSLCIPH参数中,通常使用一种简化的命名格式,例如ECDHE_RSA_AES_128_GCM_SHA256TLS_前缀和_WITH_部分在参数值中通常省略。
  2. 提供准确参数:直接给出正确的修改命令示例:ALTER CHANNEL(SYSTEM.DEF.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH('ECDHE_RSA_AES_128_GCM_SHA256')
  3. 解释原理:可能会简要说明runmqckm列出的名称是GSKit内部识别的标识符,而SSLCIPH参数必须与这些标识符之一完全匹配。
  4. 额外提醒:提醒修改后需要重新启动通道(STOP CHANNEL然后START CHANNEL)或刷新安全设置才能生效。

3.4 第三轮交互:处理复杂情况与安全加固

假设我们修改后通道成功启动,但安全扫描报告要求使用更安全的套件,例如要求禁用CBC模式,优先使用GCM模式。我们想确认当前环境支持的最强套件。

我们可以问:

“我的IBM MQ 9.3在Linux上,密钥库是通过strmqikc创建的。现在需要配置使用前向保密(FS)和AES GCM算法的最强密码套件。请帮我从runmqckm -list的输出中(假设列表已附上)识别出符合这个条件的、优先级最高的SSLCIPH值应该是什么?并说明选择理由。”

此时,DeepSeek可以扮演一个安全顾问的角色:

  1. 分析列表:它(如果我们提供了列表)会扫描输出,识别出像ECDHE_RSA_AES_256_GCM_SHA384ECDHE_ECDSA_AES_256_GCM_SHA384这样的套件。
  2. 给出推荐:推荐ECDHE_RSA_AES_256_GCM_SHA384,因为它提供了前向保密(ECDHE)、强加密(AES-256-GCM)和强完整性(SHA384)。如果使用ECC证书,则推荐ECDHE_ECDSA_AES_256_GCM_SHA384
  3. 排序逻辑:解释在TLS协商中,客户端和服务器会按照各自支持的套件列表顺序进行匹配,因此将更安全、性能更好的套件在SSLCIPH中靠前配置(对于服务器通道)或在客户端连接时指定,是良好的实践。

通过这三轮交互,我们不仅解决了最初的错误,还将配置优化到了更佳的安全状态。整个过程,工程师的精力主要花在了执行命令、验证结果和做出最终决策上,而繁琐的信息检索、格式比对和知识回忆工作则由AI高效完成。

4. 关键配置解析与DeepSeek辅助理解

4.1 SSLCIPH参数详解与常见“坑点”

SSLCIPH参数是连接加密配置的核心。它的值必须精确匹配GSKit密钥库中注册的密码套件标识符。以下是一些最容易出错的地方,DeepSeek可以帮助快速澄清:

  • 命名格式不统一:这是AMQ8242E最常见的根源。互联网上、各种配置文档中出现的密码套件名称可能有多种形式:

    • IANA标准格式TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    • OpenSSL格式ECDHE-RSA-AES128-GCM-SHA256
    • IBM MQ/GSKit格式ECDHE_RSA_AES_128_GCM_SHA256

    DeepSeek可以帮你:当你输入一个格式时,它可以告诉你:“在IBM MQ的上下文中,你提到的这个名称可能需要转换为‘XXX_YYY_ZZZ’的格式。请使用runmqckm -list命令的输出作为权威参考。”

  • 大小写敏感性SSLCIPH参数值通常是大小写敏感的。‘AES128’‘aes128’可能被视为不同的字符串。

    DeepSeek可以提醒你:“请注意,SSLCIPH的值需严格区分大小写。请确保与runmqckm -list输出中的大小写完全一致。”

  • 套件是否被禁用:即使套件在列表中,也可能因为安全策略(如FIPS模式、MQ的SSLFIPS属性)或算法被禁用(如旧的RC4、DES)而不可用。

    DeepSeek可以分析:“你选择的套件包含‘RSA’密钥交换,在FIPS模式下可能被限制。建议检查队列管理器的SSLFIPS属性或考虑使用‘ECDHE’系列的套件。”

4.2 密钥库(KeyRing)与密码套件的关系

密钥库(.kdb文件)不仅是存储证书和私钥的容器,它也通过工具(strmqikc,runmqckm,gsk7capicmd)与GSKit交互,“激活”了一系列密码套件。这些被激活的套件集合,就是runmqckm -list命令列出的内容。

一个关键概念是:仅仅在操作系统的TLS库或OpenSSL中可用的套件,并不意味着在IBM MQ中可用。MQ必须通过其自带的GSKit来“看到”并使用这些套件。

DeepSeek可以解释这个过程:“strmqikc命令在创建密钥库时,会调用GSKit的底层API,根据当前GSKit版本和系统策略,将一组密码套件‘注册’到该密钥库的上下文中。因此,不同的密钥库(即使在同一台服务器上)如果创建时GSKit版本或系统策略不同,其支持的套件列表也可能有细微差别。这就是为什么你必须为MQ使用的特定密钥库运行-list命令的原因。”

4.3 通道类型与SSLCIPH配置差异

  • 服务器连接通道 (SVRCONN):在通道定义中设置SSLCIPH。这个值规定了服务器端在此通道上愿意接受和使用的密码套件。客户端连接时可以协商。
  • 客户端连接通道 (CLNTCONN):在客户端通道定义表(CCDT)或环境变量中设置SSLCIPH。这规定了客户端发起连接时提议使用的密码套件。
  • 消息通道 (SDR/RCVR):发送方和接收方通道都需要定义SSLCIPH,且必须兼容。通常建议两端配置相同的值以确保连接成功。

DeepSeek可以辅助决策:“对于SVRCONN通道,你可以配置多个套件,用逗号分隔,如SSLCIPH('ECDHE_RSA_AES_256_GCM_SHA384', 'ECDHE_RSA_AES_128_GCM_SHA256'),服务器会按顺序优先协商。但请注意,过于陈旧的套件即使列出也可能被现代客户端拒绝。”

5. 进阶:使用DeepSeek编写检查与部署脚本

解决了单次问题后,我们可以利用DeepSeek的代码生成能力,将最佳实践固化下来,实现主动管理和批量检查。

5.1 生成密码套件兼容性检查脚本

我们可以要求DeepSeek编写一个Shell脚本,自动检查当前MQ环境中所有队列管理器的密钥库,并列出其支持的密码套件,同时与一个“安全基准套件列表”进行比对,标记出不安全或已过时的套件。

给DeepSeek的提示词可以是:

“请编写一个Linux Bash脚本,用于审计IBM MQ服务器的SSL配置。要求:

  1. 遍历/var/mqm/qmgrs/目录下所有队列管理器目录。
  2. 在每个队列管理器目录下查找常见的SSL密钥库文件(如ssl/key.kdb,ssl/ssl.kdb)。
  3. 对找到的每个.kdb文件,使用runmqckm -keydb -list -stash -db <kdb_file>命令获取支持的密码套件列表。
  4. 将输出与一个内置的安全推荐套件列表(例如包含 ‘ECDHE_RSA_AES_256_GCM_SHA384’, ‘ECDHE_RSA_AES_128_GCM_SHA256’)进行比对。
  5. 输出一份报告,显示每个队列管理器和密钥库文件,列出其支持的套件,并标记出哪些是推荐的(OK),哪些是不推荐或已过时的(如包含 ‘RC4’, ‘DES’, ‘3DES’, ‘MD5’, ‘SHA1’ 的套件,标记为 WARN)。
  6. 脚本需要处理错误,例如没有stash文件或密钥库不存在的情况。”

DeepSeek能够生成结构清晰、包含错误处理的脚本框架。工程师只需稍作修改(如调整密钥库路径模式、更新安全套件列表)即可投入使用。

5.2 生成通道配置批量更新脚本

当我们需要在数十个通道上统一更新SSLCIPH为更安全的套件时,手动操作容易出错。我们可以让DeepSeek生成一个runmqsc脚本。

提示词示例:

“请生成一个IBM MQrunmqsc输入脚本,用于批量更新所有类型为SVRCONN的通道(排除系统默认通道,如SYSTEM.*),将其SSLCIPH参数设置为 ‘ECDHE_RSA_AES_256_GCM_SHA384’。脚本需要:

  1. 首先查询所有符合条件的通道名称。
  2. 对每个通道执行ALTER CHANNEL命令。
  3. 考虑到生产环境,请在每条ALTER命令前添加注释,并考虑分步执行的可行性。”

DeepSeek生成的脚本会类似于:

* 查询所有非系统SVRCONN通道 DISPLAY CHSTATUS(*) WHERE(CHLTYPE EQ SVRCONN) ALL * 假设查询结果显示通道为 APP.SVRCONN.01, APP.SVRCONN.02 ALTER CHANNEL(APP.SVRCONN.01) CHLTYPE(SVRCONN) SSLCIPH('ECDHE_RSA_AES_256_GCM_SHA384') ALTER CHANNEL(APP.SVRCONN.02) CHLTYPE(SVRCONN) SSLCIPH('ECDHE_RSA_AES_256_GCM_SHA384')

注意事项:AI生成的脚本是很好的起点,但切勿直接在生产环境运行。务必先在测试环境验证,并仔细审核DISPLAY命令的实际输出,动态生成ALTER命令列表会更安全。

6. 常见问题排查与DeepSeek问答实录

在实际操作中,除了AMQ8242E,还会遇到一系列相关问题。以下是利用DeepSeek进行排查的模拟对话实录。

问题一:通道SSL握手失败,但错误日志没有AMQ8242E,只有更模糊的错误。

我的提问:“IBM MQ通道无法建立SSL连接,错误日志显示‘AMQ9639: SSL握手失败’,但没有更详细的SSLCIPH错误。可能的原因有哪些?如何启用更详细的SSL日志?”

DeepSeek的回复思路

  1. 原因枚举:证书问题(过期、不信任、CN不匹配)、协议版本不匹配(如客户端只支持TLS1.2而服务器配置了TLS1.3)、密码套件完全不匹配(但可能未触发8242E)、网络问题。
  2. 诊断步骤
    • 启用SSL详细日志:在队列管理器属性中设置SSLDEBUG=YES(需要重启),或在客户端设置环境变量MQSSLDEBUG=ON
    • 检查证书:使用runmqckmopenssl命令验证证书链、有效期和密钥用法。
    • 核对双方配置:确保服务器和客户端使用的SSLCIPH有交集,TLS协议版本兼容。
  3. 提供命令:给出检查证书有效性的示例命令,如runmqckm -cert -details -db key.kdb -stashed -label "MyCertificate"

问题二:如何为不同的应用程序通道指定不同的密码套件?

我的提问:“我有两个应用,一个旧应用只支持较老的密码套件,一个新应用要求使用更强的套件。如何在同一队列管理器上为它们各自的SVRCONN通道配置不同的SSLCIPH?”

DeepSeek的回复思路

  1. 确认可行性:完全可以。SSLCIPH是通道级属性,每个SVRCONN通道都可以独立设置。
  2. 配置示例
    • ALTER CHANNEL(OLD.APP.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH('RSA_AES_256_CBC_SHA256')(供旧应用使用)
    • ALTER CHANNEL(NEW.APP.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH('ECDHE_RSA_AES_256_GCM_SHA384')(供新应用使用)
  3. 安全建议:建议将旧应用迁移至新套件,并规划淘汰弱套件通道的时间表。可以设置队列管理器的SSLCAUTHSSLPEER属性来进一步约束客户端。

问题三:从runmqckm列表中选择密码套件的优先级策略是什么?

我的提问:“runmqckm -list输出了几十个密码套件。在配置SSLCIPH时,应该如何选择和排序?优先级应该怎么考虑?”

DeepSeek的回复思路

  1. 安全第一:优先选择提供前向保密 (FS/PFS)的套件,即以ECDHE_DHE_开头的套件。ECDHE通常优于DHE
  2. 算法强度:加密算法优先AES_GCM>AES_CBC,密钥长度优先256>128。完整性校验优先SHA384>SHA256>SHA1(避免)。
  3. 性能兼容:在满足安全要求的前提下,考虑性能。AES_GCM通常比AES_CBC性能更好。同时需考虑对端客户端(如老的Java版本、.NET Framework版本)的支持情况。
  4. 配置示例:一个兼顾安全与兼容的SSLCIPH值可以是:'ECDHE_RSA_AES_256_GCM_SHA384, ECDHE_RSA_AES_128_GCM_SHA256, RSA_AES_256_GCM_SHA384'。服务器将按此顺序协商。

通过将DeepSeek融入日常的问题排查和配置管理工作流,我们相当于拥有了一位7x24小时在线的、知识渊博的IBM MQ安全配置顾问。它不能替代你对基础原理的理解和在生产环境中的谨慎操作,但它能极大地加速你的学习曲线、提高排查效率,并将你从记忆琐碎语法和翻阅大量文档的负担中解放出来,让你更专注于架构和业务逻辑本身。从遇到AMQ8242E时的手足无措,到如今能系统化、工具化地管理和解决SSL/TLS配置问题,这个转变正是现代AI辅助运维带来的实实在在的价值。

http://www.gsyq.cn/news/1619206.html

相关文章:

  • 上海炒股升降桌可以定制的有哪些
  • web应用技术--第10次作业
  • 适配投票工具测评,公众号 / 小程序通用盘点
  • API版本管理与兼容性
  • 电动汽车革命:从出行工具到智能能源网
  • 混合Astar运动规划算法 路径规划和路径跟踪 MPC算法 LQR算法 PID算法
  • C++内存池设计实践
  • 用AI控制AI:数据偏见阻断的工程化实践
  • 飞书Aily全功能实操操作手册
  • 免费解锁Microsoft 365完整功能的终极指南:Ohook激活工具详解
  • MC6470 IMU与PIC18LF46K42的硬件集成与姿态控制实战
  • 计算机Java毕设实战-基于 SpringBoot 的校园寻物启事失物招领平台的设计与实现 基于 SpringBoot 的校园失物招领管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 安全触边安装要注意啥才能避免后期故障
  • DDD聚合根设计实践教程
  • 三节串联锂电池保护芯片,IC带均衡方案公开分享
  • 2026最新:如何高效完成知识视频总结?这5个实用方法亲测好用
  • paperxie 论文智能写作实操指南|分步填写参数,轻松产出合规学术文稿
  • DeepSeek V4代码能力评测:开源大模型的工程化落地实践
  • 树莓派再pi目录下创建虚拟环境
  • Playwright+Python实战:攻克WebRTC自动化测试核心难题
  • 工业边缘场景下的ML模型服务化实战:从LSTM到产线RUL预测
  • android app>src>main>AndroidManifest.xml comment every line
  • 办公提效工具 OpenClaw,一站式整合包部署完整步骤拆解(包含安装包)
  • 语言消亡史:被遗忘的AI词语
  • Si5351A时钟发生器与PIC18LF24K50在电子系统中的应用
  • 基于MC6470 IMU与PIC18LF25K40的嵌入式运动控制系统设计
  • 城市生活污水厂自控系统改造案例
  • CSS 实现高频出现的复杂怪状按钮 - 镂空的内凹圆角边框
  • 述职 PPT 制作怎么高效完成?5 款软件中立测评与选型指南
  • Vue 集成 ECharts 可视化全套图表开发,功能实现与页面效果展示