过去,我一直在通过导出带有密码的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);
最后我这样做了,它工作正常:
...
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);
...
你要求的有几件不同的事情,轻松程度不同。
从. 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)如果您的私钥是RSACryptoServiceProvider
或DSACryptoServiceProvider
,您可以使用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