Visual Studio Android ApkSigner 在密钥库中找不到密钥

2024-04-11

我在 Visual Studio 中创建 APK 时收到此错误:

Failed to load signer "signer #1": C:\...\googleplay.keystore entry "googleplay" does not contain a key

我是一名资深 ASP.NET 开发人员,熟悉 Visual Studio,但这是我的第一个 Xamarin 项目。 (我没有使用 Android Studio。)我正在尝试将 Android 版本部署到 Google Play。我从未将 APK 上传到 Google Play,因此无法使用 Visual Studio 的自动部署;我必须首先按照 Google 和 Microsoft 的说明执行手动部署。

我正在使用 JDK 1.8 运行 Visual Studio 2017 15.7.5(最新)。我的项目使用 NETStandard.Library 2.0.3、Xamarin.Forms 3.1.0 和 Microsoft.EntityFrameworkCore 2.1.1。

这个问题类似于这个没有答案的问题 https://stackoverflow.com/questions/50438908/apk-signer-entry-does-not-contain-a-key但我从 Visual Studio 中收到错误。如果这是重复的,我很抱歉,但我无法添加有关该问题的更多详细信息。

我正在使用 Google Play 应用签名。我已通过 Google Play 创建了密钥。我下载了 .der 格式的证书。我使用 keytool (来自 c:\Program Files\Java\jdk1.8.0_172\bin)通过以下命令将 .der 文件转换为 .keystore:

keytool -importcert -alias googleplay -file "C:\...\deployment_cert.der"

我已重新运行此实用程序几次,更改了选项,认为可能存在别名或 keytool 提示的密码中的特殊字符区分大小写的问题。在本例中,别名全部是字母、小写,密码是字母数字和小写。 keytool 要求信任此证书,我按“y”。

这会产生一个名为.keystore。我将其重命名为googleplay.keystore我把它移到了一个更合适的地方。

我可以仔细检查googleplay通过运行以下命令,别名出现在密钥库文件中:

C:\Program Files\Java\jdk1.8.0_172\bin>keytool -v -list -keystore "C:\...\googleplay.keystore" -alias googleplay
Enter keystore password:
Alias name: googleplay
Creation date: Jul 23, 2018
Entry type: trustedCertEntry

Owner: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Issuer: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Serial number: e8************************************8a
Valid from: Thu Jul 19 14:18:56 EDT 2018 until: Sun Jul 19 14:18:56 EDT 2048
Certificate fingerprints:
         MD5:  0D:**:**:**:**:**:**:**:**:**:**:**:**:**:**:C8
         SHA1: 11:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:CD
         SHA256: D0:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:74
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 4096-bit RSA key
Version: 3

Extensions:

#1: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

“googleplay”别名绝对存在!证书指纹与 Google 给我的密钥(已编辑)相匹配。

在 Visual Studio 中,我将解决方案配置设置为发布模式,清理了整个解决方案(成功),重建了整个解决方案(成功),然后右键单击我的 Android 项目并单击Archive... per 这些说明 https://learn.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/?tabs=vswin#archive.

顺便说一句,微软的这篇文章非常令人沮丧,因为它没有提到签名或这个问题,而且他们的articles https://learn.microsoft.com/en-us/xamarin/android/deploy-test/publishing/publishing-to-google-play/index?tabs=vswin on signing https://learn.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/?tabs=vswin与 Google Play 的运作方式不符,并且似乎假设您已经将正确的 APK 上传到 Google Play(绕过先有鸡还是先有蛋的 Catch-22)。

起初我得到的只是The archiving process has failed. Please see the Errors section for more details.错误列表面板为空。输出面板只是说"java.exe" exited with code 2.我去了Tools -> Options -> Projects and Solutions -> Build and Run并改变了MSBuild project build output verbosity from Minimal to Diagnostic并重复最后几个步骤(清理、重建、存档)。现在,输出面板(稍作编辑)显示:

Using "AndroidApkSigner" task from assembly "C:\...\MSBuild\Xamarin\Android\Xamarin.Android.Build.Tasks.dll".
Task "AndroidApkSigner"
AndroidApkSigner:
  ApkSignerJar: C:\Program Files (x86)\Android\android-sdk\build-tools\27.0.3\lib\apksigner.jar
  ApkToSign: bin\Release\com.mycompany.myproject.apk
  ManifestFile: obj\Release\android\AndroidManifest.xml
  AdditionalArguments: 
C:\Program Files\Java\jdk1.8.0_172\\bin\java.exe -jar "C:\Program Files (x86)\Android\android-sdk\build-tools\27.0.3\lib\apksigner.jar" sign --ks "C:\...\googleplay.keystore" --ks-pass pass:******** --ks-key-alias googleplay --key-pass pass:******** --min-sdk-version 19 --max-sdk-version 27  C:\...\myproject.Android\bin\Release\com.mycompany.myproject.apk 
Failed to load signer "signer #1": C:\...\googleplay.keystore entry "googleplay" does not contain a key
"java.exe" exited with code 2.
Done executing task "AndroidApkSigner" -- FAILED.
Done building target "_Sign" in project "myproject.Android.csproj" -- FAILED.
Done building project "myproject.Android.csproj" -- FAILED.
Build FAILED.

从上面的输出中,您可以看到我的项目属性的 Android Package Signing 选项卡中的(经过编辑的)值是什么。经过反复试验,我发现密钥库密码、别名和别名密码都是必需的。我将密钥库密码和别名密码设置为相同,因为只有一个密码与该密钥库关联。如上所述,密码是小写字母数字(没有特殊字符,遵循另一个 SO 问题的建议)。

当 keytool 毫无问题地找到密钥时,为什么 AndroidApkSigner 无法在密钥库中找到提供的别名的密钥?

而且,我不可能是唯一有这个问题的人吧?从 Visual Studio 部署到 Google Play 应该是一个相当常见的工作流程,但我没有找到其他人(除了这是另一个未回答的问题 https://stackoverflow.com/questions/50438908/apk-signer-entry-does-not-contain-a-key)谁遇到了这个问题。我究竟做错了什么?


我已经找到了我的问题的答案。这Android 开发者网站上的文档 https://developer.android.com/studio/publish/app-signing不适用于 Visual Studio。 Xamarin 自带的 ApkSigner 不知道该怎么办。相反,使用它来创建您自己的发布密钥:

keytool -v -list -keystore c:\temp\myreleasekey.keystore -alias myalias -storetype pkcs12

请注意-storetype pkcs12在最后。该命令还被修改为(1)将文件写入程序文件之外的某个位置,(2)使用.keystore根据我的阅读,(3) 避免了别名中出现 Visual Studio 不喜欢的特殊字符。 (密码中也应避免使用特殊字符。)

Note, keytool位于c:\Program Files\Java\jdk[version]\bin.

The Clue

当我按照说明进行操作时文档 https://developer.android.com/studio/publish/app-signing,我收到了警告keytool:

警告: JKS 密钥库使用专有格式。建议迁移到 PKCS12,这是一种行业标准格式,使用keytool -importkeystore -srckeystore c:\temp\myreleasekey.jks -destkeystore c:\temp\myreleasekey.jks -deststoretype pkcs12.

当验证密钥是否正确时,我也收到此警告:

keytool -v -list -keystore c:\temp\myreleasekey.jks -alias myalias

如果您有现有密钥并需要转换它,请按照警告中的命令进行操作。

谢谢你:

我要感谢尼克解释签名和区分所有密钥背后的原因。

乔恩,谢谢你指导我如何创建自己的私钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio Android ApkSigner 在密钥库中找不到密钥 的相关文章

  • MySQL C++ 连接器未解决的依赖关系(VS 2015)

    我正在尝试在 Windows Visual Studio 2015 上编译 MySQL Connector C 我根据以下内容使用CMake生成了项目文件官方说明 https dev mysql com doc connector cpp
  • 我可以在不创建 DLL 的情况下使用同一项目中的 UserControl 吗?

    我制作了一个用户控件 并且已经能够通过将其添加到 C 代码中的表单来使用它 用户控件与主窗体位于同一 VS2005 项目中 问题是我无法通过此实现在 gui 编辑器 Design 窗口 中看到用户控件 我尝试了很多方法 但无法将用户控件添加
  • C++ 在循环中创建线程时出错

    我在 Visual Studio 2015 中运行以下命令时遇到问题 include
  • 在源代码管理中管理我的数据库

    由于我正在处理一个新的数据库项目 在 VS2008 中 而且我从未从头开始开发数据库 因此我立即开始研究如何在源代码管理 在本例中为 Subversion 中管理数据库 我找到了一些关于SO的信息 包括这篇文章 保持多个环境中的开发数据库同
  • 字符串到数组,按第三个字/列排序

    我有一个包含数字 单词和换行符的字符串 我将其拆分为一个数组 如果我跑Array Sort lines 它将按第 1 列对数组进行数字排序 Number 我怎样才能按第 3 列的字母顺序对数组进行排序 Color 注意 它们不是真正的列 只
  • 如何从 powershell 中设置 bash 的环境变量?

    使用powershell我该如何设置 https askubuntu com q 1205227 45156 the 环境 https stackoverflow com q 5327495 262852变量 这里 特别 https sta
  • 使用VS2019创建WebService

    我想使用 Visual Studio 2019 使用 C 在现有 NET 项目中创建 WebService 在互联网上搜索 我能找到的只是旧 VS 版本的教程 如何创建它 使用 Visual Studio 2019 接收 POST 数据的最
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 为什么代码分析不警告 NotImplementedException?

    我非常确定 Visual Studio Code Analysis 的早期版本会警告有关 NotImplementedException 的使用 即包含此异常的任何成员 throw new NotImplementedException 会
  • 如何从 Visual Studio 中的网站项目中删除项目引用?

    那么 如果我的网站项目 Foo 引用了类库项目 Bar 我该如何删除该引用 该引用存储在 Visual Studio 解决方案文件中 在解决方案资源管理器中右键单击网站的项目项 然后选择 属性页 出现的对话框中的第一项是 参考 您可以从此处
  • 找不到“C:\Microsoft.Cpp.Default.props”

    我在 Visual Studio 2013 中创建了一个项目 项目文件具有以下属性 工具版本 12 0 平台工具集 v120 我安装了 Visual Studio 2013 和 Microsoft Build Tools 2015 该项目使
  • Home 键转到 Visual Studio 中的行首吗?

    Visual Studio 中的哪个选项可以让 Home 键转到行首 现在你必须做 Home Home or Home Ctrl Left Arrow 我希望 home 位于该行的开头 我以前见过 但现在找不到了 在 工具 自定义 键盘 中
  • 我可以在 Android Market 上出售我的 SL4A 应用程序吗?

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用 SL4A 在 Android 上使用 Python 开发一个应用程序 并且我想知道是否可以将其作为应用程序在 Android Market
  • Visual Studio 和 VS Express 版本有什么区别?

    Visual Studio 和 VS Express 版本有什么区别 可能非常适合谷歌搜索 但我再次读到 StackOverflow 中的报道是一件好事 You can 下载比较 http download microsoft com do
  • VB SQL 语句未选择正确的行

    我试图使用 SELECT 语句在我的数据库中 选择 一个人 但它没有选择正确的人 我也不确定为什么 我正在使用访问数据库 数据库连接代码 Imports System Data OleDb Module Database Connectio
  • 直接在应用程序中评价 Google Play 应用程序 [重复]

    这个问题在这里已经有答案了 我需要在我的 Android 应用程序中设置费率选项 我找到了这个link http www androidsnippets com prompt engaged users to rate your app i
  • 如何为 C++ Visual Studio 2019 指定应用程序图标?

    我见过本文档 https learn microsoft com en us visualstudio ide how to specify an application icon visual basic csharp view vs 2
  • 关闭文件后未保存展开/折叠状态

    在 Visual Studio 中 您可以在不使用区域的情况下展开和折叠代码 例如在代码隐藏页面中您可以折叠方法等 而在 ASPX 页面中您可以折叠标签 标签等 当您的页面很长并且您希望将开发重点放在特定部分时 它非常有用 它的一个很酷的地
  • Xamarin Forms WebView 打开外部链接

    我的应用程序中有一个网络视图 当单击外部链接 在普通浏览器中在新选项卡中打开 时 我无法返回我的网站 当打开一个新标签时 有可能像 Gmail 一样关闭该标签的菜单吗 目的是 每当单击链接时 用户都可以选择使用哪个选项来查看内容 例如单击链
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L

随机推荐

  • iOS 7 完成处理程序永远不会被调用

    在以下代码中 没有任何完成处理程序被执行 我能找到的唯一解释是这样的使用 UIManagedDocument 的 Xcode 4 5 中的 iPhone Simulator 5 1 中的错误 https stackoverflow com
  • 将WPF窗口背景设置为资源字典画笔用户设置

    我在 ResourceDictionary 中声明了两个画笔 我希望用户选择他们想要在主窗口上看到的背景 资源词典画笔 x Key LightBlueMainWindow x Key DarkBlueMainWindow Window Ba
  • 使用curl下载时如何跳过已经存在的文件?

    我想要curl下载链接 但我希望它跳过已经存在的文件 现在 无论如何我的代码行都会继续覆盖它 curl url o home outputfile gt dev null 如何实现这一目标 您可以使用curl选项 C 此选项用于恢复中断的下
  • PDFsharp 与 MigraDoc 支持 HTML 语法吗?

    PDFsharp 与 MigraDoc 支持 HTML 语法吗 a strong etc 如果是的话 我该如何在文档中实现它 不 它不直接支持 HTML 您必须编写一段代码来读取 HTML 并使用 MigraDoc 或 PdfSharp 创
  • 以最少的磁盘空间开销进行版本控制

    我一直在考虑使用像 SVN 这样的版本控制系统作为我使用的几台 PC 之间的通用备份和同步工具 这适用于各种数据 包括 MP3 和翻录 DVD 大量数据 120GB 我的主要问题是 SVN 创建每个版本化文件的副本 svn目录 虽然我可以看
  • 如何使用List.fold_left?

    我仍在尝试了解如何fold left完全有效 它是否像这样迭代列表List iter 或者我的代码还有其他问题吗 我认为 e 是列表中的元素 所以它是一个元组 并且fst e获取元组的第一个元素并且snd e获取元组中的第二个元素 let
  • 如何将 JToken 转换为 string[]?

    我正在尝试将 JObject 中的数组读取到 string 中 但我不知道如何操作 代码非常简单 如下所示 但不起作用 失败并出现错误无法将 JToken 转换为 string JObject Items jsonSerializer De
  • NiFi:ExtractText 中的正则表达式获取 CSV 标头而不是数据

    我正在开发一个获取 CSV 文件的流程 我想根据 CSV 记录中的第一个字段将记录放入不同的目录中 例如 CSV 文件看起来像这样 country firstname lastname ssn mob num US xxxx xxxxx x
  • 如何使用其内容识别图像文件格式?

    如果图像文件的格式为 png那么它将包含 PNG 位于文件的开头 当读入Text mode 如果图像文件的格式为 bmp那么它将包含BM 位于文件的开头 当读入Text mode 我知道图像格式在文件开头包含一定大小 字节 的文本 数据 这
  • 无法安装kivy。为 kivy 构建轮子失败 (pyproject.toml)

    我不知何故搞砸了我的 pip 或我的 kivy 文件 我的也安装不了我试过了pip install kivy并且git clone https github com kivymd KivyMD git depth 1 我使用的是 macos
  • 实时工作流程的自定义工作流程活动中缺少跟踪日志

    我已经针对 CRM 2013 编写了一个自定义工作流活动 您不需要了解它的作用 我遇到的问题是 尽管实例化了ITracingService 我使用生成的任何跟踪内容Trace 方法在运行时被混淆仅适用于实时工作流程 换句话说 如果我异步运行
  • 如何从线性渐变中获取当前颜色?

    我有一个搜索栏 其值范围为 1 到 10 THUMB 停止在 1 2 3 4 5 10 如果 SeekBar 是线性渐变 则背景颜色 颜色从红色开始 然后是黄色 最后是绿色 如何获取拇指所在位置的当前颜色 pskink的建议 https s
  • OAuth 2 承载授权标头

    随着客户端 API 的更新 HTTPBasicAuthication 方法已替换为 OAuth2Bearer授权标头 使用旧的 API 我会执行以下操作 NSURLCredential credential NSURLCredential
  • 让 R 停止正在运行的 EC2 机器

    我有一些工作流程 我希望 R 在完成脚本后停止正在运行的 Linux 机器 我可以想到两种类似的方法来做到这一点 以 root 身份运行 R 然后调用system halt 从 root shell 脚本运行 R 可以以任何用户身份运行 R
  • 指数时间复杂度的真实示例

    我正在寻找一个直观的 现实世界的问题示例 该问题需要 最坏情况 指数时间复杂度来解决我正在做的演讲 以下是我提出的其他时间复杂度的示例 其中许多取自这个问题 https stackoverflow com questions 1592649
  • 检查表单是否已提交 - PHP

    检查表单是否已提交以确定是否应该将表单的变量传递给我的验证类的最佳方法是什么 首先我想也许 isset POST 但这总是会返回 true 因为超全局变量在任何地方都被定义 我不想使用以下方式迭代表单的每个元素 if isset POST
  • 如何重现错误“由于暂停纯视频背景媒体以节省电量,播放()请求被中断”?

    介绍 作为我项目的一部分 我有一个接收视频流的播放器 我希望它在流开始和结束时自动播放和自动停止 因此我引入了一个检查来查看流是否处于活动状态并在每种情况下启动和 或停止播放器 这是一个企业网站 有时有多达 3000 名用户同时观看视频流
  • PyTorch 教程错误训练分类器

    我刚刚开始 PyTorch 教程使用 PyTorch 进行深度学习 60 分钟闪电战我应该补充一点 我之前没有编写过任何 python 但其他语言 如 Java 现在 我的代码看起来像 import torch import torchvi
  • java 的地理图表

    谁能推荐一个 Java 组件 它可以让您创建一个漂亮的世界地图图像 突出显示某些国家 基于一些统计数据 与此图像类似的东西 类似于 Google 地理图表 但适用于 Java https developers google com char
  • Visual Studio Android ApkSigner 在密钥库中找不到密钥

    我在 Visual Studio 中创建 APK 时收到此错误 Failed to load signer signer 1 C googleplay keystore entry googleplay does not contain a