2

我有一个 Apache (xampp/wamp) 服务器,它在端口 443 上提供 SSL 连接。它使用两个证书文件:server.cert 和 server.key 当后者包含私钥时。

我有另一台服务器配置为侦听端口 843 上的请求(闪存策略的东西),并使用 C# 编写的一些文本回复来响应某个请求,这些文本回复单独运行。

为了实现 SSL 连接,我使用了一个名为 SecureSocket 的弹性对象,它允许这样做,但是,它使用原始服务器证书来加密请求。

我的目标是教我的 843 C# 服务器解密发送的数据并加密回复,为此我在 C# 中使用 X509Certificate 对象。

但是,由于 pub 和 priv 密钥位于不同的文件上,我在以下方面得到了 FALSE:

string text = System.IO.File.ReadAllText(@"C:\xampp\apache\conf\ssl.crt\server.crt");
UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] byteCert = encoding.GetBytes(text);
X509Certificate2 uberCert = new X509Certificate2();
uberCert.Import(byteCert);
Console.WriteLine("Has privateKey:" + uberCert.HasPrivateKey.ToString());
Console.WriteLine("PrivateKey: \n" + uberCert.PrivateKey);

显然, uberCert.HasPrivateKey 上的 False 来自于私钥位于不同文件中的事实,所以我的问题是:

1.如何使用 X509Certificate2 对象读取私钥?2.我如何使用公钥来解密收到的消息以及如何用私钥重新加密它(为了发回加密的响应)?

提前致谢,

麦克风。

4

3 回答 3

1

我创建了一个小助手 NuGet 包(基于opensslkey)来创建基于public keyprivate (rsa) key的X509 证书

// Generate with: openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt
string certificateText = File.ReadAllText("certificate_pub.crt");
string privateKeyText = File.ReadAllText("private.key");

ICertificateProvider provider = new CertificateFromFileProvider(certificateText, privateKeyText);
X509Certificate2 certificate = provider.Certificate;

// Example: use the PrivateKey from the certificate above for signing a JWT token using Jose.Jwt:
string token = Jose.JWT.Encode(payload, certificate.PrivateKey, JwsAlgorithm.RS256);

有关功能和代码示例,请参阅NuGetGithub-project

于 2017-07-17T20:25:30.193 回答
0

私钥可能是PEM 编码的 PKCS#8结构。

Mono 项目提供了在Mono.Security.dll程序集中读取这种格式(以及其他格式)的代码。这个程序集是完全托管的,可以在 Windows、Linux 或 OSX 上运行。

于 2012-02-21T13:15:06.830 回答
0

您不能直接使用 .NET。

您可以使用 BouncyCastle(请参阅此答案:如何从 .NET 读取 PEM RSA 私钥)或使用 PKCS12 容器代替用户名 + 密码,您可以使用 PEM 文件中的 OpenSSL 工具创建。

于 2012-02-21T13:18:37.493 回答