(我是加密事物的新手。) 我有一个用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
。
答案 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);