当前位置: 首页 > 知识库问答 >
问题:

从证书和密钥创建X509证书2,而无需制作PFX文件

弘康安
2023-03-14

过去,我一直在通过导出带有密码的PFX证书来制作安全的TcpListener,但我想知道是否可以跳过这一步。

我没有使用商业SSL证书,并且有一个根CA,用于颁发服务器证书。在C#中托管TcpListener时,这些服务器证书需要额外的步骤(我想是因为没有使用CSR)。。。但是如果我有私钥和OpenSSL生成/使用的证书呢。

sslCertificate = new X509Certificate2("myExportedCert.pfx", "1234");

这很好,但是我必须发出openssl命令,从证书和私钥生成pfx文件,然后生成一些密码。然后在我的代码中包含这个密码。

我想知道这一步是否很有必要。有没有办法从证书中组成一个X509证书2,然后应用私钥。构造函数参数只允许证书部分,但是加密失败了,因为没有私钥。

此外,我不想依赖OpenSSL或IIS导出pfx。。。。看起来很笨拙。

理想情况下,我想:

sslCertificate = new X509Certificate2("myCert.crt");
sslCertificate.ApplyPrivateKey(keyBytes) // <= or "private.key" or whatever

sslStream.AuthenticateAsServer(sslCertificate, false, SslProtocols.Default, false);

共有2个答案

梁丘远航
2023-03-14

最后我这样做了,它工作正常:

...
if (!File.Exists(pfx)) {
    // Generate PFX
    string arguments = "openssl pkcs12 -export -in " + certPath + "" + certFile + ".crt -inkey " + certPath + "" + certFile + ".key -out " + certPath + "" + certFile + ".pfx -passout pass:" + pfxPassword;
    ProcessStartInfo opensslPsi = new ProcessStartInfo("sudo", arguments);
    opensslPsi.UseShellExecute = false;
    opensslPsi.RedirectStandardOutput = true;
    using (Process p = Process.Start(opensslPsi)) {
        p.WaitForExit();
    }
    // Set Permission
    ProcessStartInfo chmodPsi = new ProcessStartInfo("sudo", "chmod 644 " + certPath + "" + certFile + ".pfx");
    chmodPsi.UseShellExecute = false;
    chmodPsi.RedirectStandardOutput = true;
    using (Process p = Process.Start(chmodPsi)) {
        p.WaitForExit();
    }
}
sslCertificate = new X509Certificate2(pfx, pfxPassword);
...
易宣
2023-03-14

你要求的有几件不同的事情,轻松程度不同。

从. NET Framework 4.7.2或. NET Core 2.0开始,您可以组合证书和密钥。它不会修改证书对象,而是生成一个知道密钥的新证书对象。

using (X509Certificate2 pubOnly = new X509Certificate2("myCert.crt"))
using (X509Certificate2 pubPrivEphemeral = pubOnly.CopyWithPrivateKey(privateKey))
{
    // Export as PFX and re-import if you want "normal PFX private key lifetime"
    // (this step is currently required for SslStream, but not for most other things
    // using certificates)
    return new X509Certificate2(pubPrivEphemeral.Export(X509ContentType.Pfx));
}

在。NET Framework(但不是。NET Core)如果您的私钥是RSACryptoServiceProviderDSACryptoServiceProvider,您可以使用cert。私钥=密钥,但这有复杂的副作用,不鼓励。

这个更难,除非你已经解决了。

在大多数情况下,答案是在不使用BouncyCastle的情况下使用c#中的数字签名,但如果您可以迁移到. NET Core 3.0,事情会变得容易得多。

从开始。NET Core 3.0您可以相对简单地做到这一点:

using (RSA rsa = RSA.Create())
{
    rsa.ImportPkcs8PrivateKey(binaryEncoding, out _);
    // do stuff with the key now
}

(当然,如果您有一个PEM,您需要对其进行“反PEM”,方法是提取开始和结束分隔符之间的内容,并通过Convert.FromBase64String运行它,以获得二进制编码)。

从开始。NET Core 3.0您可以相对简单地做到这一点:

using (RSA rsa = RSA.Create())
{
    rsa.ImportEncryptedPkcs8PrivateKey(password, binaryEncoding, out _);
    // do stuff with the key now
}

(如上所述,如果是PEM,则需要首先“de-PEM”它)。

从开始。NET Core 3.0您可以相对简单地做到这一点:

using (RSA rsa = RSA.Create())
{
    rsa.ImportRSAPrivateKey(binaryEncoding, out _);
    // do stuff with the key now
}

(如果是PEM,则为“de PEM”)。

 类似资料:
  • 我试图签署一个Android应用程序,但显然原始的keystore文件是不可用的。我所得到的只有以下几点: 私钥md5 0123456789abcdef0123456789abcdef<--虚构值,但 证书md5 fedcba9876543210fedcba9876543210<-原始为32个十六进制数字 已签署的生产Android应用程序 是否有任何方法可以从这些资产中重新创建一个keystor

  • 我是新来配置Jetty服务器的SSL。我按照digcert的步骤创建了私钥文件、证书请求CSR文件。 我向CA发送了证书请求,并拿回了我签名的CSR。但是CA给我发了一个有两个证书的捆绑包,一个是我的证书,由CA签名,第二个是CA证书。(1star_xyx_abc_comcrt文件,2.CRT文件)。现在我面临着从这些文件创建密钥库的麻烦。 当我按照Oracle文档的步骤4、5和6使用keytoo

  • 问题内容: 这是我的代码: OpenSSL能够通过命令行解码X509证书,因此我知道它是有效的证书。但是Java似乎并不喜欢它。 无论有没有尾随的\ n,我都已经厌倦了。 有任何想法吗? 问题答案: - 更新 正如评论中提到的那样,OP解决方案唯一的问题是OP 使用的是密钥,而不是证书。 这是 无需Base64转换 的代码 , 因为它本身可以读取PEM文件(它会查找块本身以知道它正在读取PEM文件

  • kubernetes 系统各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS 证书。 安装 CFSSL $ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 $

  • 前言 执行下列步骤前建议你先阅读以下内容: 管理集群中的TLS:教您如何创建TLS证书 kubelet的认证授权:向您描述如何通过认证授权来访问 kubelet 的 HTTPS 端点。 TLS bootstrap:介绍如何为 kubelet 设置 TLS 客户端证书引导(bootstrap)。 注意:这一步是在安装配置kubernetes的所有步骤中最容易出错也最难于排查问题的一步,而这却刚好是第

  • 我在java和cxf中有应用程序,它通过客户端证书连接到Web服务。 我有WebService所有者的证书 证书。p12 证书。pem 证书。crt 受信任的核证机关 根癌 我无法直接将此p12证书转换为java要求的工作jks密钥库。 我是这样做的: 但是这个jks不工作,我得到HTTP响应403:禁止使用这个certificate1.jks 但是,如果我将此p12(pfx)证书导入Intern