是否可以仅使用 C# 以编程方式生成 X509 证书?

2023-12-14

我们正在尝试使用 C# 和以下代码以编程方式生成 X509 证书(包括私钥)充气城堡图书馆。我们尝试使用一些代码这个样本由 Felix Kollmann 制作但证书的私钥部分返回 null。代码及单元测试如下:

using System;
using System.Collections;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Prng;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;

namespace MyApp
{
    public class CertificateGenerator
    {
        /// <summary>
        /// 
        /// </summary>
        /// <remarks>Based on <see cref="http://www.fkollmann.de/v2/post/Creating-certificates-using-BouncyCastle.aspx"/></remarks>
        /// <param name="subjectName"></param>
        /// <returns></returns>
        public static byte[] GenerateCertificate(string subjectName)
        {
            var kpgen = new RsaKeyPairGenerator();

            kpgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));

            var kp = kpgen.GenerateKeyPair();

            var gen = new X509V3CertificateGenerator();

            var certName = new X509Name("CN=" + subjectName);
            var serialNo = BigInteger.ProbablePrime(120, new Random());

            gen.SetSerialNumber(serialNo);
            gen.SetSubjectDN(certName);
            gen.SetIssuerDN(certName);
            gen.SetNotAfter(DateTime.Now.AddYears(100));
            gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
            gen.SetSignatureAlgorithm("MD5WithRSA");
            gen.SetPublicKey(kp.Public);

            gen.AddExtension(
                X509Extensions.AuthorityKeyIdentifier.Id,
                false,
                new AuthorityKeyIdentifier(
                    SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(kp.Public),
                    new GeneralNames(new GeneralName(certName)),
                    serialNo));

            gen.AddExtension(
                X509Extensions.ExtendedKeyUsage.Id,
                false,
                new ExtendedKeyUsage(new ArrayList() { new DerObjectIdentifier("1.3.6.1.5.5.7.3.1") }));

            var newCert = gen.Generate(kp.Private);
            return DotNetUtilities.ToX509Certificate(newCert).Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pkcs12, "password");
        }
    }
}

单元测试:

using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyApp
{
    [TestClass]
    public class CertificateGeneratorTests
    {
        [TestMethod]
        public void GenerateCertificate_Test_ValidCertificate()
        {
            // Arrange
            string subjectName = "test";

            // Act
            byte[] actual = CertificateGenerator.GenerateCertificate(subjectName);

            // Assert
            var cert = new X509Certificate2(actual, "password");
            Assert.AreEqual("CN=" + subjectName, cert.Subject);
            Assert.IsInstanceOfType(cert.PrivateKey, typeof(RSACryptoServiceProvider));
        }
    }
}

需要澄清的是,X.509 证书不包含私钥。这个单词证书有时被误用来表示证书和私钥的组合,但它们是两个不同的实体。使用证书的全部目的是或多或少公开地发送它们,而不发送必须保密的私钥。一个X509Certificate2对象可能有一个与之关联的私钥(通过其PrivateKey属性),但这只是作为此类设计的一部分的便利。

在您的第一个 BouncyCastle 代码示例中,newCert实际上只是证书DotNetUtilities.ToX509Certificate(newCert)仅根据证书构建。

考虑到 PKCS#12 格式需要存在私钥,我很惊讶以下部分甚至可以工作(考虑到您在不可能知道私钥的证书上调用它):

.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pkcs12,
    "password");

(gen.Generate(kp.Private)使用私钥对证书进行签名,但不将私钥放入证书中,这是没有意义的。)

如果您希望您的方法同时返回证书和私钥,您可以:

  • 返回一个X509Certificate2您已在其中初始化的对象PrivateKey财产
  • 构建 PKCS#12 存储并返回其byte[]内容(就好像它是一个文件)。您发送的链接中的第 3 步 (mirror)解释了如何构建 PKCS#12 存储。

返回byte[]X.509 证书的 (DER) 结构本身不会包含私钥。

如果您主要关心的问题(根据您的测试用例)是检查证书是否是从 RSA 密钥对构建的,则您可以检查其公钥的类型。

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

是否可以仅使用 C# 以编程方式生成 X509 证书? 的相关文章

  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • 使用遗留代码(使用reinterpret_cast)真的是一种很好的技术吗?

    下面的代码来自一篇关于C 面试问题的帖子here https www toptal com c plus plus interview questions 我从来不知道这种技术 尽管它声称是一种很好的技术 我的问题是 什么情况下需要使用它
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 集群():是否可以仅检查文件是否已锁定,而不实际获取锁定(如果没有)?

    我的用例如下 我有一个程序 它强制在任何给定时间只能运行它的一个实例 因此在启动时它总是尝试在标准位置获取锁定文件 并在该文件终止时终止已经被锁定 这一切都工作正常 但现在我想用一个新的命令行选项来增强程序 当指定该选项时 将导致程序只打印
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • 如何配置 Ninject 来注入 NodaTime IClock

    在我的 NinjectConfigurator 中我有 container Bind
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 在编译输出中添加程序集绑定 (app.config)

    如果我编译应用程序 则会在输出中自动添加程序集绑定 具体的程序集绑定不在app config在 Visual Studio 中但在创建的应用程序配置中 有什么办法可以检查为什么会自动添加程序集绑定吗 选项AutoGenerateBindin
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 在 C++ 中,为什么 const 也可以工作时编译器选择非常量函数? [复制]

    这个问题在这里已经有答案了 例如 假设我有一堂课 class Foo public std string Name m maybe modified true return m name const std string Name cons
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 绑定集合的子集

    我有一个ObservableCollection
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐

  • 如何将 cmake 与 boost asio 结合使用?

    我不明白boost asio在我的 C 程序中使用 cmake 我实际上已经尝试和谷歌搜索了很多小时 但我无法让它工作 我想包括boost asio在我的 Ubuntu 18 04 下的 c 项目中 带有一个 cmake 文件 所以我安装了
  • 如何从 Eclipse 为 javaCV 或 openCV 项目制作可运行的 jar

    我在 eclipse 中有一个 openCV 项目 现在 我试图使其可运行 Jar 但一旦尝试运行该 Jar 就无法启动它 我尝试遵循 https groups google com forum topic javacv ziqKIb7Pg
  • 如何在servlet中通过ajax获取数据?

    我想将页面上的一些数据发送到servlet 所以我写了下面的jquery来做到这一点 我用所有数据构建一个json字符串 并直接将其发送到servlet 但我不知道如何从servlet中的ajax获取全部数据 save click func
  • 优化 Sql Reporting Services 2005 中大报表的 PDF 导出

    首先 我知道运行非常大 长时间运行的报告是一个可怕的想法 我知道 Microsoft 有一条经验法则 规定 SSRS 报告的执行时间不应超过 30 秒 然而 有时 由于遵守州法律等外部力量 巨额报告是首选的祸害 在我的工作地点 我们有一个
  • Perl从命令行执行的问题

    上周我在 WinXP 上用 Strawberry Perl 替换了 ActivePerl 我发现我必须使用以下命令运行我的 Perl 脚本perl myperl pl 否则我只需要运行myperl pl在安装草莓之前 我怎么只能跑myper
  • Python:尝试使用请求发布表单

    我正在尝试使用 Python 和请求库登录网站进行一些抓取 我正在尝试以下操作 这不起作用 import requests headers User Agent Mozilla 5 0 payload username niceuserna
  • Django Forms 模板设计类

    Django Forms 框架非常出色 只需通过以下内容即可呈现整个表单 form as p 对于注册表 将上面的内容转换为 p p
  • 如何使用openjson递归解析JSON字符串

    我有以下 JSON 数据 set json N Book IssueDate 02 15 2019 Detail Type Any Type Author Name Annie Sex Female Chapter Section 1 1
  • 具有可变数量子视图的动态 UITableViewCell 高度

    我有一个UITableViewCell使用从远程源检索的数据动态填充 它具有基于单元格中表示的项目类型的可变数量的子视图 我通过使用动态计算单元格内容的大小NSMutableAttributedString和boundingRectWith
  • 无法从tomcat中自定义类加载器加载的类获取注释

    鉴于班级org popper example pages Login Page name Login public interface Login 出口到c pos example jar和以下 servlet public class P
  • JSP Servlet 会话 invalidate() 不会使会话为空

    我的 JSP 项目中有三个简单的 Http Servlet 类 LoginServlet Logout Servlet 和 Profile Servlet LoginServlet 通过为会话设置 name 属性来登录用户 LogoutSe
  • Lambda表达式编译方法

    我有几行代码 public void CreateMethod
  • 随机 MapView 强制关闭:NullPointerException com.google.googlenav.map.Tile.getTile

    我真的需要一些帮助 我有一份关于此堆栈跟踪强制关闭的报告 但我找不到任何有关如何防止的信息 也无法复制此类错误 我希望有人能够了解为什么会发生这种情况 com google googlenav map Tile getTile Unknow
  • include、include_once、require 还是 require_once?

    我有 PHP 文件 其中定义了服务器访问变量以及mysql connect and mysql select db 因为这个函数在后端的几乎每个页面中都经常使用 而我正在使用include 这现在对我来说非常有效 你会建议哪种方法或功能 我
  • 不可见元素的延迟加载

    我有一个案例 我有一个gridview listbox 任何类型的项目控件和绑定到控件的项目数量都很大 很容易在 5000 标记左右 其中每个项目都需要具有从各种 Web 服务加载的各种属性 显然 使用 Web 服务来一次性处理这么多元素是
  • 禁用 CURLOPT_SSL_VERIFYPEER (libcurl/openssl) 的安全后果

    我知道从这个线程禁用 CURLOPT SSL VERIFYHOST 时可能发生哪些攻击 我想知道禁用 VERIFYPEER 而不是 VERIFYHOST 时可能发生哪些攻击 使用信用卡付款的风险是否可以接受 我问的原因是因为我的code仅适
  • Pygame 蛇食物生成器

    我目前正在创建一个贪吃蛇游戏 我想创建一个食物生成器 根据我的游戏计时器每 10 秒生成一个苹果 计时器从 60 倒数到 0 游戏结束时 我希望每 10 秒生成一个新苹果 保留旧苹果 即使它还没有被吃掉 我不知道如何解决这个问题 需要一些帮
  • Windows Visual Studio 2008 中的 Unix Makefile

    我已经进行了不错的搜索 但似乎找不到一种方法让 Visual Studio 2008 使用 unix Makefile 甚至无法从 Makefile 创建一些与 MSVC 兼容的等效文件 有人有想法或类似的问题吗 注意 我已经知道使用 Ma
  • 在 macOS Big Sur 上将 Python 3.7 升级到 3.9

    我正在尝试在 macOS Big Sur 上将 Python 3 7 升级到 3 9 我还试图避免丢失在 Python 3 7 上安装的包并在 Python 3 9 上再次重新安装它们 我尝试使用 brew install python3
  • 是否可以仅使用 C# 以编程方式生成 X509 证书?

    我们正在尝试使用 C 和以下代码以编程方式生成 X509 证书 包括私钥 充气城堡图书馆 我们尝试使用一些代码这个样本由 Felix Kollmann 制作但证书的私钥部分返回 null 代码及单元测试如下 using System usi