You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose Multiplatform Windows版MSIX包API调用失败问题求助

Compose Multiplatform MSIX打包后Ktor API调用失败问题解决

问题分析

从日志可定位两个核心问题:

  • HttpRequestTimeoutException:MSIX沙箱环境下网络请求超时,大概率是权限配置不全或沙箱网络限制导致
  • SunCertPathBuilderException:JVM无法验证服务器证书,因为MSIX打包的JRE无法访问系统根证书存储

解决方案

1. 补充MSIX网络权限

仅添加internetClient权限不足以覆盖所有网络场景,需在MSIX的Package.appxmanifest中补充完整权限:

<Capabilities>
    <Capability Name="internetClient" />
    <Capability Name="internetClientServer" />
    <Capability Name="privateNetworkClientServer" />
</Capabilities>

2. 修复证书信任问题

方案A:加载自定义根证书(生产环境推荐)

将服务器根证书(.crt格式)放入项目src/main/resources目录,在Ktor客户端中加载并配置信任:

// 加载根证书文件
val certInputStream = Thread.currentThread().contextClassLoader.getResourceAsStream("root_ca.crt")
val rootCert = CertificateFactory.getInstance("X.509").generateCertificate(certInputStream) as X509Certificate

// 构建信任管理器
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
    load(null)
    setCertificateEntry("trusted_root", rootCert)
}
val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
    init(keyStore)
}

// 配置Ktor客户端
val client = HttpClient(OkHttp) {
    engine {
        config {
            sslSocketFactory(
                SSLContext.getInstance("TLS").apply {
                    init(null, trustManagerFactory.trustManagers, SecureRandom())
                }.socketFactory,
                trustManagerFactory.trustManagers[0] as X509TrustManager
            )
        }
    }
}

方案B:临时跳过证书验证(仅测试用)

若只是临时排查问题,可临时关闭证书验证(生产环境禁止使用):

val client = HttpClient(OkHttp) {
    engine {
        config {
            sslSocketFactory(
                SSLContext.getInstance("TLS").apply {
                    init(null, arrayOf<TrustManager>(object : X509TrustManager {
                        override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
                        override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
                        override fun getAcceptedIssuers() = emptyArray()
                    }), SecureRandom())
                },
                object : X509TrustManager {
                    override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
                    override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
                    override fun getAcceptedIssuers() = emptyArray()
                }
            )
            hostnameVerifier { _, _ -> true }
        }
    }
}

3. 调整Ktor超时配置

MSIX沙箱网络延迟可能更高,延长超时时间避免请求中断:

val client = HttpClient(OkHttp) {
    install(HttpTimeout) {
        requestTimeoutMillis = 60000 // 延长至60秒
        connectTimeoutMillis = 15000
        socketTimeoutMillis = 60000
    }
}

4. 完善JRE模块配置

确保打包的JRE包含加密相关模块,避免证书验证功能缺失:

compose.desktop {
    application {
        nativeDistributions {
            modules("jdk.crypto.ec", "jdk.crypto.cryptoki")
            // 其他原有配置...
        }
    }
}

5. 排查MSIX网络隔离问题

使用Windows内置工具检查MSIX的网络访问状态:

# 替换为你的MSIX包名
CheckNetIsolation.exe Debug -n=your.package.name

启动应用后查看输出,定位是否有网络请求被沙箱阻止的记录。

内容的提问来源于stack exchange,提问作者Mirco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:19:56