使用Dotnet CLI发布.NET MAUI iOS应用时出现ASN1损坏数据错误
执行的发布命令:
dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64 -p:CodesignKey="Apple Distribution: XXXXXXXXX (123456789)" -p:CodesignProvision="myprofile"
报错信息:
/usr/local/share/dotnet/packs/Microsoft.iOS.Sdk/17.2.8022/tools/msbuild/iOS/Xamarin.Shared.targets(1805,3): error : ASN1 corrupted data. [/Users/david/RiderProjects/App/App.Mobile/App.Mobile.csproj::TargetFramework=net8.0-ios]
已知背景:
- 具备iOS部署及Xamarin开发经验,证书、配置文件已配置完成
- CI/CD流水线使用相同命令和证书可正常构建发布
- 本地Mac M1设备,测试不同IDE均出现相同问题
- 模拟器构建测试及Android发布无异常,推测问题与签名流程相关
调试解决建议
检查本地证书存储完整性
打开Keychain Access,找到对应的Apple Distribution证书,右键选择「显示简介」,确认证书无有效性警告(如“此证书的有效性未知”)。若存在异常,删除证书后重新导入CI/CD使用的相同证书文件,确保导入过程无密码错误或文件损坏。验证配置文件与证书匹配性
双击打开myprofile配置文件(通过Xcode),确认配置文件关联的发布证书与本地Keychain中的证书完全匹配(核对证书序列号、组织ID)。若配置文件是旧版本,重新从Apple Developer Portal下载最新版本替换本地文件。清理本地构建缓存
删除以下目录的缓存文件,避免损坏缓存干扰流程:- 项目根目录下的
bin和obj文件夹 ~/.nuget/packages中对应Microsoft.iOS.Sdk的17.2.8022版本目录~/Library/Caches/Xamarin/mtbs目录
清理完成后重新执行发布命令。
- 项目根目录下的
用证书哈希值替代名称参数
证书名称中的特殊字符可能导致解析问题,尝试用SHA-1哈希值替换CodesignKey参数:- 在Keychain Access中找到目标证书,右键选择「获取信息」
- 复制「指纹」栏的SHA-1值(去掉空格)
- 修改发布命令:
dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64 -p:CodesignKey="SHA-1哈希值" -p:CodesignProvision="myprofile"
启用详细构建日志排查
在发布命令中添加-v diag参数获取完整日志:dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64 -p:CodesignKey="Apple Distribution: XXXXXXXXX (123456789)" -p:CodesignProvision="myprofile" -v diag重点查看日志中与
codesign、security命令相关的输出,定位签名流程中具体出错的环节。对齐本地与CI环境的SDK版本
确认本地安装的.NET SDK、Microsoft.iOS.Sdk版本与CI/CD环境完全一致。若版本存在差异,升级或降级本地SDK包,消除版本不匹配导致的签名逻辑差异。手动测试codesign命令签名
导出一个测试IPA包(可基于模拟器构建包修改),手动执行签名命令验证本地工具链:codesign -fs "Apple Distribution: XXXXXXXXX (123456789)" --entitlements Entitlements.plist YourApp.app若手动签名也报错,说明本地证书或签名工具存在问题;若手动签名成功,则问题可能出在.NET MAUI的构建脚本逻辑中。
内容的提问来源于stack exchange,提问作者TaiT's

