使用 AndroidKeyStoreProvider 生成证书签名请求的最佳方法是什么?

2023-12-01

I read 本文.

它说如何生成KeyPair,但是它没有指定如何根据生成的密钥生成证书签名请求。

根据我的研究,要在 Java 中生成 CSR,网络上的示例通常使用该包sun.*或 BouncyCastle 库。似乎没有办法生成符合标准的 CSRjava.securityAPI。我读this它似乎说的是同样的事情。

我别无选择只能使用 BouncyCastle 吗?很难想象Android开发者不考虑这种用法。

顺便说一句,文章还提到:

生成新的 PrivateKey 还需要您指定 自签名证书将具有的初始 X.509 属性。 您可以稍后用证书替换该证书 由证书颁发机构签署

假设我最终获得了由证书颁发机构签名的证书。 “稍后更换证书”具体应该怎么做?


在 Android 上创建 CSR 的最佳方法是使用海绵城堡,这是一个实现充气城堡对于安卓。 SpongyCastle 已经为您完成了很多繁重的工作,因此它将让您的生活变得更加轻松。


我的实现很大程度上基于找到的答案here,但使用 Android KeyStore 来确保安全,并使用 SpongyCastle 的JcaContentSignerBuilder()而不是习惯ContentSigner.

将 SpongyCastle 添加到您的build.gradle file:

compile 'com.madgag.spongycastle:core:1.51.0.0'
compile 'com.madgag.spongycastle:pkix:1.51.0.0'

在中创建密钥对Android 密钥库:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); // store the key in the Android KeyStore for security purposes
keyGen.initialize(new KeyGenParameterSpec.Builder(
                  "key1",
                  KeyProperties.PURPOSE_SIGN)
                  .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                  .setDigests(KeyProperties.DIGEST_SHA256,
                                KeyProperties.DIGEST_SHA384,
                                KeyProperties.DIGEST_SHA512)
                  .build()); // defaults to RSA 2048
KeyPair keyPair = keyGen.generateKeyPair();

使用所述密钥对创建 CSR:

private final static String CN_PATTERN = "CN=%s, O=Aralink, OU=OrgUnit";

//Create the certificate signing request (CSR) from private and public keys
public static PKCS10CertificationRequest generateCSR(KeyPair keyPair, String cn) throws IOException, OperatorCreationException {
        String principal = String.format(CN_PATTERN, cn);

        ContentSigner signer = new JcaContentSignerBuilder(DEFAULT_RSA_SIGNATURE_ALGORITHM).build(keyPair.getPrivate());

        PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(
                new X500Name(principal), keyPair.getPublic());
        ExtensionsGenerator extensionsGenerator = new ExtensionsGenerator();
        extensionsGenerator.addExtension(Extension.basicConstraints, true, new BasicConstraints(
                true));
        csrBuilder.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest,
                extensionsGenerator.generate());
        PKCS10CertificationRequest csr = csrBuilder.build(signer);

        return csr;
    }
}

就是这样,现在你有一个PKCS10CertificationRequest您可以发送到您的服务器。

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

使用 AndroidKeyStoreProvider 生成证书签名请求的最佳方法是什么? 的相关文章

随机推荐

  • 用ggplot中的函数定义的两条线之间的阴影区域[重复]

    这个问题在这里已经有答案了 我试图找到如何对 ggplot 中由函数定义的两条线之间的区域进行着色的可能性 我找到了一些使用 geom area 或 geom ribbon 的解决方案 但在这两种情况下 您都需要一个定义 ymin 和 ym
  • Google 地图动画相机位置 iOS 7 问题

    我正在尝试将 Google Maps API 安装到 iOS7 的应用程序中 在遵循 Google 的指南和视频后 我最终遇到了以下错误 GMSMapView animateToCameraPosition unrecognized sel
  • 如何在 Eclipse 中将控制台参数传递给应用程序?

    我在批处理文件中有以下行 java Client 127 0 0 1 9876 它包含我的 java 类的名称和两个参数 我的应用程序需要这些参数才能正常运行 在 Eclipse 中运行应用程序时有什么方法可以传递这些参数吗 这将使调试变得
  • 如何最好地控制迭代方向?

    我有一个装有大型对象的容器 复制这些对象的成本很高 我有时必须正常迭代整个容器 有时则必须反向迭代 一旦确定了迭代方向 我就不需要在飞行中更改 即不需要随机访问 我希望做这样的事情 include
  • Application_Start 未在 IIS 中触发

    在我的网络应用程序中 我在Global asax 中的 APPLICATION START 文件 当我在开发服务器上运行它时它一直在工作 然而 当我在 IIS 中托管它时 Application Start 事件未触发 任何人都可以帮我摆脱
  • 如何确定矩形何时重叠或相交?

    我找到了如何绘制矩形和一些代码来查找两个矩形何时重叠 但我无法连接这些过程 我有我想要的两个矩形 但无法确定它们是否相交 然后将此信息添加到列表框 这是我的代码 public partial class Form1 Form Graphic
  • 交替行颜色ListView xamarin表单

    我在 ListView 上绑定了一个 ObersvableCollection 我想改变我的 ListView 的行颜色 我找到了很多代码 但对我不起作用 如果你可以分享一个示例 样本 像这样 但我不知道我该怎么做 我使用 Visual S
  • R 中的历史方差误差分解图

    我在下面的链接中找到了如何估计 R 中 VAR 模型的历史方差分解 历史方差误差分解 Daniel Ryback Daniel Ryback 在 Excel 绘图中显示了结果 但我想用 ggplot 来准备它 所以我创建了一些行来获取它 尽
  • 打印给定元素排列的程序[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我最近参加了 ACM 认证的编程竞赛 这是我当时做不到的问题 给定一个包含 n 个元素的整数数组 编写一个程序来打印所有排列 请告诉我这道题该怎么做 有什么算法可以做这类题吗 假
  • 如何追踪 SIGABRT 的原因

    我出于示例目的展示了该问题的代码 但实际上我的问题是 我应该如何追踪和理解 SIGABRT 错误 我读过这个问题 sigabrt 没有错误消息 但是我认为这与我的问题无关 我下面将展示的示例显然不是 xib 问题 之前获得 SIGABRT
  • 如何在 Hyperledger Composer 中处理资产的表单、图像、视频

    在 Hyperledger Composer 模型文件中定义资产时 我们如何处理表单 图像 视频 有哪些可用的数据类型 例如 如果我的资产是房屋 并且我想存储房屋的图像 如何在资产中定义它 我已经参考过文档 它说可用的原始数据类型是字符串
  • 在 Magento 后端添加自定义仪表板“框”而不编辑默认模板的正确方法是什么?

    我正在努力创建一个我希望有一天能成为公开可用的 Magento 扩展的东西 我提到这一部分是因为我在这里做 正确的事 对我来说很重要 我想做的一件事是在默认的 Magento 仪表板中添加一个框 基本上是一个新的 框 与 前 5 个搜索词
  • 如何将输出对齐到屏幕中心 - C++?

    我正在开发 C 控制台应用程序 我想执行并打印应用程序窗口屏幕中心的所有内容 水平 垂直 如下所示 User xyz Pass 我想按照上面指出的那样运行我的整个程序 有什么办法可以做到吗
  • Angular 2.0 Material MdDialog 与 Angular 2.0 的工作示例

    我正在开发一个 POC 应用程序 我正在尝试获取MdDialog组件工作 有谁有一个可以传递给的工作示例MdDialog开放方法 角度 2 0 https github com Angular Angular 角度 2 材质 https g
  • 为什么 document.cookie 不显示该站点的所有 cookie?

    我去一个使用 vBulletin 3 8 的论坛 当我登录时 我使用 firebug 查看设置了哪些 cookie 我看到这些饼干 utmb utmc utma utmz bbsessionhash vbseo loggedin bbpas
  • 根据流星中选定的值从集合和过滤器中填充选择字段

    我是 Meteor 的新人 我有选择框 我想从 mongo 集合本身填充 我尝试按如下方式执行此操作 但不起作用
  • Eager TensorFlow 中的加载现在是否已损坏?

    从 tf keras Model 继承的类中的权重目前似乎无法加载 我无法使用检查点从类外的 Example 加载权重 因此我尝试在类内执行此操作 这从所有角度来看都应该可行 它能够保存权重 就像保存Example 时一样 但它仍然无法加载
  • NumPy:以 n 为底的对数

    来自关于对数的 numpy 文档 我找到了以底数取对数的函数e 2 and 10 import numpy as np np log np e 3 3 0 np log2 2 3 3 0 np log10 10 3 3 0 但是 如何以底数
  • 如何将scala代码块转换为字符串?

    我需要实现一个测试函数 用于检查 splain 插件的编译时错误信息 该函数的一部分需要将代码块转换为字符串 例如 def convert fn gt Unit String for testing val code convert obj
  • 使用 AndroidKeyStoreProvider 生成证书签名请求的最佳方法是什么?

    I read 本文 它说如何生成KeyPair 但是它没有指定如何根据生成的密钥生成证书签名请求 根据我的研究 要在 Java 中生成 CSR 网络上的示例通常使用该包sun 或 BouncyCastle 库 似乎没有办法生成符合标准的 C