【问题标题】:How to create a certificate to use with SslStream AuthenticateAsServer without importing如何在不导入的情况下创建与 SslStream AuthenticateAsServer 一起使用的证书
【发布时间】:2012-12-22 06:30:27
【问题描述】:

我迷失在证书和私钥的曲折迷宫中。

我正在用 C# 编写服务器。我希望它接受 SSL 连接。出于测试目的,我想为“localhost”生成一个证书,并将该证书用于服务器。理想情况下,我不想污染我的证书存储,所以我只需要一个或多个 C# 代码可以加载的磁盘上的文件来提供证书。

我尝试过的一切(使用网络搜索建议的说明书方法)要么给我“无​​法识别提供给包的凭据”或“服务器模式 SSL 必须使用具有关联私钥的证书。”

有没有办法生成证书和私钥,然后将它们加载到 X509Certificate 对象中,而不将它们也加载到我的机器证书存储中?

【问题讨论】:

  • 你真的需要这个证书还是只想跳过证书。检查使用它??
  • 服务器是网络服务器。我需要使用 https 协议从浏览器连接到它。所以我想我需要证书。我知道证书将不受信任,因此浏览器用户必须接受它。

标签: c# ssl x509certificate


【解决方案1】:

有许多工具可以让您充当自己的 CA 并生成证书。 XCA 就是其中之一。例如,还有许多使用 OpenSSL 命令的方法。

仅生成自签名证书似乎是最简单的选择,但使用测试 CA(和单独的服务器证书)可能是值得的。如果需要使测试更真实,这将允许您将测试 CA 导入浏览器的存储中。使用正确的工具(例如 XCA)并不难。

生成服务器证书及其私钥后,将其转换为 PKCS#12 文件 (.p12/.pfx)。

然后您应该可以使用X509Certificate2.import(...) 加载它。 (参见this answer 中的示例。)

【讨论】:

  • 对于那些想要使用这个解决方案的人。我认为我的回答可以补充@Bruno 所说的,here 我向您展示了使用 OpenSSL 生成有效证书的方式。
【解决方案2】:

最后,我运行以下命令来创建 server.pfx 文件:

makecert.exe -r -pe -n "CN=localhost" -sky exchange -sv server.pvk server.cer
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx

然后我在代码中加载它:

certificate = new X509Certificate2("server.pfx", "password");

(我实际上并没有像那样硬编码密码 :-)

诀窍是知道我需要一个 pfx 文件,并且我需要使用 X509Certificate2 类而不是 X509Certificate 来加载它。

【讨论】:

  • 救了我的命。我使用这种方法通过代理服务器应用程序向客户端的浏览器提供证书。我知道这不是一个正确的方法,但仍然一切正常。
  • 但是这种方法对代理服务器效果不好。你知道怎么解决吗?
  • 不起作用。我收到CryptographicException 说“指定的网络密码不正确。”这显然是错误的,因为我使用了密码x,很难打错。有什么解决办法吗?
  • 无能为力,除非说上面的代码对我有用。您可以使用任何其他工具打开 pfx,使用密码“x”吗?
  • 对于其他无法使其工作的人,请参阅:stackoverflow.com/a/19719140/103959
【解决方案3】:

Niki Loche 方法有效。

如果你得到The specified network password is not correct.,那么你应该在C#中尝试不使用密码。 makecert 中的输入密码无关紧要。

certificate = new X509Certificate2("Server.pfx", "");

但是如果你想使用密码(这是有原因的,它就在那里:)),尝试将 pvk2pfx.exe 命令更改为:

pvk2pfx.exe" -pi 密码 -pvk Server.pvk -spc Server.cer -pfx Server.pfx

在 C# 中输入:

certificate = new X509Certificate2("Server.pfx", "password");

密码必须与创建cer文件时的密码相同。

这对我有用。我希望它会对某人有所帮助。

【讨论】:

    【解决方案4】:

    【讨论】:

    • 没有 IIS,但这可能对有的人有用,谢谢。
    【解决方案5】:

    从机器存储(不是用户存储)导入机器证书时,我遇到了同样的问题。我通过以管理员身份运行 Visual Studio 解决了这个问题,因为访问机器存储证书的私钥需要管理员权限。

    【讨论】:

      【解决方案6】:

      我最近开发了一个带有 TLS 的 SMTP 服务器。我需要将服务器作为 Windows 服务安装在 Windows Server 2012 机器上。我为我的域使用了 Let's Encrypt SSL 证书(* 通配符)。在“在服务器上”开发时,我必须以管理员身份运行 Visual Studio,我的代码才能使用“new X509Certificate("cert.pfx", "{password}") 运行,并且运行良好。但是,一旦作为服务安装,该方案不起作用。原来更简单/更安全的方法是使用 X509Store。这是解决问题的代码......

      private X509Certificate GetSslCertificate()
      {
          X509Certificate cert = null;
          string certname = "*.mydomain.com";
      
          try
          {
              X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
              store.Open(OpenFlags.OpenExistingOnly);
      
              foreach (X509Certificate certificate in store.Certificates)
              {
                  if (certificate.Subject.ToLower().Contains(certname))
                  {
                      cert = certificate;
                      break;
                  }
              }
          }
          catch (Exception) { /* Handle Exception */ }
          return cert;
      }
      

      另请注意,我使用“LocalMachine”作为 StoreLocation。如果您安装了 SSL 证书,则需要更改为 CurrentUser。

      【讨论】:

        猜你喜欢
        • 2021-02-19
        • 2014-05-28
        • 2021-10-23
        • 1970-01-01
        • 2020-06-01
        • 2013-06-02
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        相关资源
        最近更新 更多