如何使用一个证书创建truststore.jks?

时间:2014-11-10 16:59:03

标签: certificate c#-3.0

(我是加密事物的新手。) 我有一个用C#编写的安装程序。这要求用户输入服务器URL。然后,它连接到此服务器并将此服务器证书存储到已安装的Java REST服务使用的信任库文件中。

信任库文件由 keytool.exe 创建:

keytool.exe -alias anAlias -import -file cert.cer -noprompt -keystore truststore.jks -storepass aPassword

现在我们不想使用 keytool.exe 。我们想用C#创建密钥库。我的第一次尝试如下:

class AddCertToTruststore
  {
    public static void Do()
    {
      ServicePointManager.ServerCertificateValidationCallback += Validate;

      X509Certificate2 cert = new X509Certificate2("cert.cer");
      cert.Archived = true;

      bool ok = cert.Verify(); // always false

      X509Certificate2Collection certs = new X509Certificate2Collection();
      certs.Add(cert);
      byte[] bytes = certs.Export(X509ContentType.Pkcs12);

      File.WriteAllBytes("truststore.jks", bytes);

      ServicePointManager.ServerCertificateValidationCallback -= Validate;
    }

    private static bool Validate(object sender, X509Certificate certificate, X509Chain chain,
                                 SslPolicyErrors sslPolicyErrors)
    {
      return true;
    }
  }

此代码创建了一个信任库,但我在其中缺少证书。如果我使用 KeyStore Explorer 5.1 打开truststore.jks,则其中没有任何证书。我究竟做错了什么?

证书是自签名证书。 cert.Verify()始终返回false

1 个答案:

答案 0 :(得分:1)

只缺少一行:

cert.FriendlyName = "anAlias";

它也可以在没有验证处理程序且没有设置Archived属性的情况下工作。所以最短的代码是:

X509Certificate2 cert = new X509Certificate2(@"cert.cer");
cert.FriendlyName = "anAlias";

X509Certificate2Collection certs = new X509Certificate2Collection();
certs.Add(cert);
byte[] bytes = certs.Export(X509ContentType.Pkcs12);

File.WriteAllBytes(@"truststore.jks", bytes);