使用 Bouncy Castle 在 Java 中复制“openssl smime”?

2024-04-04

我手上有个问题。我不懂 Java 的同事正在使用 OpenSSL 命令对文件进行签名,如下所示:

openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem \
  -inkey passkey.pem -in manifest.json -out signature -outform DER \
  -passin pass:12345

正如您所看到的,这里有三个文件提供给 openssl 命令来生成签名。

现在我们想使用 Java 复制相同的功能,因为我们假设要签名的内容将是动态的并且本质上是服务器端的。我读到 BouncyCastle 是最佳选择。但我不确定如何使用该库。我对密码技术也不是很熟悉。我无法理解如何使用上述所有三个文件来签署内容manifest.json.

如果有人可以引导我找到正确的代码或给我一个开始,我将非常感谢您的努力。


我还必须在 java 中复制 openssl 命令,这就是我完成它的方法。无需使用运行时。

public byte[] signMobileConfig(byte[] mobileconfig) 
            throws CertificateEncodingException, PEMException, FileNotFoundException, IOException, CertificateException, OperatorCreationException, CMSException {
    Security.addProvider(new BouncyCastleProvider());

    X509CertificateHolder caCertificate = loadCertfile();

    JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter();
    X509Certificate serverCertificate = certificateConverter.getCertificate(loadSigner());

    PrivateKeyInfo privateKeyInfo = loadInKey();
    PrivateKey inKey = new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo);
    ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(inKey);

    CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
    JcaDigestCalculatorProviderBuilder digestProviderBuilder = new JcaDigestCalculatorProviderBuilder().setProvider("BC");
    JcaSignerInfoGeneratorBuilder generatotBuilder = new JcaSignerInfoGeneratorBuilder(digestProviderBuilder.build());

    generator.addSignerInfoGenerator(generatotBuilder.build(sha1Signer, serverCertificate));
    generator.addCertificate(new X509CertificateHolder(serverCertificate.getEncoded()));
    generator.addCertificate(new X509CertificateHolder(caCertificate.getEncoded()));

    CMSProcessableByteArray bytes = new CMSProcessableByteArray(mobileconfig);
    CMSSignedData signedData = generator.generate(bytes, true);

    return signedData.getEncoded();
}

这是我加载文件的方法:

public X509CertificateHolder loadSigner() throws FileNotFoundException, IOException {
    InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.crt");
    PEMParser parser = new PEMParser(new InputStreamReader(inputStream));
    return (X509CertificateHolder) parser.readObject();
}

public PrivateKeyInfo loadInKey() throws FileNotFoundException, IOException {
    InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.key");
    PEMParser parser = new PEMParser(new InputStreamReader(inputStream));
    return (PrivateKeyInfo) parser.readObject();
}

public X509CertificateHolder loadCertfile() throws FileNotFoundException, IOException {
    InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.crt");
    PEMParser parser = new PEMParser(new InputStreamReader(inputStream));
    return (X509CertificateHolder) parser.readObject();
}

这是我的文件映射:

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

使用 Bouncy Castle 在 Java 中复制“openssl smime”? 的相关文章

随机推荐

  • Seaborn/Matplotlib 日期轴条形图小主要刻度格式

    我正在构建 Seaborn 条形图 x 轴是日期 y 轴是整数 我想格式化日期的主要 次要刻度 我希望周一的刻度线是粗体的并且是不同的颜色 即 主要刻度线 而本周的其余时间则不那么粗体 我无法在 x 轴上获得主要和次要刻度格式以使用 Sea
  • 在 jquery animate 中,如何使用自定义对象而不是 div?

    我的情况是这样开始的 我想对 div 的背景图像进行动画处理 但似乎使用 jquery 我无法检索背景图像的各个位置 背景位置 所以我想为什么不创建一个对象并为其值设置动画 然后将这些值放入 css 中 但我还不知道如何完全做到这一点 这是
  • 订阅 EnvDTE80.DTE2.Events2.PublishEvents.OnPublishBegin 的正确方法是什么?

    我正在将 VS 插件移植到 VS 包 当包初始化时 包会订阅 OnBuildBegin 和 OnPublishBegin Visual Studio 按预期触发 OnBuildBegin 但从未调用 OnPublishBegin 或多或少相
  • 从发电机生成

    我有一个生成器 它接受一个数字作为参数并生成其他数字 我想使用这个生成器生成的数字并将它们作为参数传递给同一个生成器 创建一个一定长度的链 例如 mygenerator 2 生成 5 4 和 6 将 mygenerator 应用于这些数字中
  • org.postgresql.util.PSQLException:错误:运算符不存在:整数= bytea

    我正在尝试从 Spring Boot 应用程序执行本机查询 但收到此错误 org postgresql util PSQLException 错误 运算符不存在 整数 bytea 这是我为实现此目的而编写的代码 SqlResultSetMa
  • TypeScript - 如何将索引签名表示为通用类型

    TypeScript 中的索引签名定义如下 字典 key string T Array index number T 这些可以包装成一些简单的 可重用的类型 type DictionaryIndex
  • 在 MySQL 的一个查询中使用不同值更新多行

    我试图了解如何用不同的值更新多行 但我只是不明白 解决方案无处不在 但对我来说似乎很难理解 例如 1 个查询中有 3 个更新 UPDATE table users SET cod user 622057 date 12082014 WHER
  • Application.LoadComponent 找不到资源

    我的项目中有一个 xaml 文件 位于Ns1 Ns2 myfile xaml 它的构建操作设置为Page 使用自定义工具MSBuild Compile 我正在尝试在静态构造函数中加载此文件 namespace Ns1 Ns2 interna
  • 如何使用 LINQ 合并两个列表?

    如何使用 LINQ 合并两个列表 如下所示 class Person public int ID get set public string Name get set public Person Merge Person p return
  • 如何检测字符串是否是Base64Encoded?

    检测字符串是否是 Base64Encoded 的最佳方法是什么 使用 Delphi 你能做的最好的事情就是尝试解码它 如果解码失败 则输入未经过 Base64 编码 如果字符串成功解码 则输入might已经经过base64编码
  • SOAP suds 和可怕的模式 Type Not Found 错误

    我正在使用最新版本的肥皂水 https fedorahosted org suds https fedorahosted org suds 第一次 我在第一步就停滞了 suds TypeNotFound Type not found sch
  • 使用 Maven,如何运行特定测试?

    我的项目中有数千个单元测试 我想选择其中一个或几个从命令行运行 执行此操作的命令是什么 您可以通过传递以下内容来运行类中的所有测试 Dtest
  • Symfony2:加载样式表但未在 NGINX 上应用,导致错误页面损坏

    我刚刚安装了一个全新且干净的 Symfony 应用程序 我使用 NGINX 作为我的网络服务器 样式表在 devtools 网络选项卡中不显示 http 404 错误代码 我可以在预览选项卡中正确看到它们的内容 示例图片 有人遇到过这样的问
  • Eclipse 中的 Scala 执行时间

    当我从 Eclipse 运行 Scala 程序时 出现了一些可疑的情况 我运行一个 App 对象 运行需要 7 8 秒 实际执行时间用对象中的 System nanoTime 计时 当我从命令行运行相同的 class 文件时 需要 2 5
  • 从 json_encode($phpArray) 访问 JSON 对象值

    我是 JSON Javascript 新手 遇到了这种性质的问题 在我的 php 脚本中 我将 php 数组传递给 javascript 如下所示 echo img src misc arrow right png 在我的 JavaScri
  • 有没有用于集成复杂功能的 Haskell 库?

    如何在 Haskell 中对复杂的复值函数进行数值积分 有现成的库吗 数字工具 http hackage haskell org package numeric tools仅在卷轴上运行 我知道在复平面上只有线积分 所以我感兴趣的界面是这样
  • 无法压缩分区数量不等的 RDD

    现在我有3个这样的RDD rdd1 1 2 3 4 5 6 7 8 9 10 rdd2 11 12 13 14 rdd3 15 16 17 18 19 20 我想这样做 rdd1 zip rdd2 union rdd3 我想要的结果是这样的
  • NodeJS 模块与类

    对我来说 类与 NodeJS CommonJS 模块非常相似 您可以拥有许多它们 它们可以重复使用 它们可以互相使用 并且通常每个文件一个 是什么让模块与类如此不同 使用它们的方式不同 命名空间的差异也很明显 除此之外 它们对我来说似乎非常
  • PyQt_Fit:无法导入名称路径

    我正在尝试使用 PyQt Fit 我从 pip install pyqt fit 安装了它 但是当我导入它时它不起作用并显示以下消息 ImportError Traceback most recent call last
  • 使用 Bouncy Castle 在 Java 中复制“openssl smime”?

    我手上有个问题 我不懂 Java 的同事正在使用 OpenSSL 命令对文件进行签名 如下所示 openssl smime binary sign certfile WWDR pem signer passcertificate pem i