项目需要使用.Net调用api,并且需要使用客户端证书,上网搜了一圈,按照搜到的方法导入:

//配置HttpClient选项
var clientHandler = new HttpClientHandler();
//使用客户端证书
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(new X509Certificate2("client.crt.pem"));

var client = new HttpClient(clientHandler);

但是印象中使用客户端证书需要有私钥,代码里并没有涉及私钥,调用也果然出错了,于是把添加的语句改成了:

clientHandler.ClientCertificates.Add(X509Certificate2.CreateFromPemFile(
    "client.crt.pem",
    "client.key.pem"
));

结果还是报错:

Win32Exception: No credentials are available in the security package

查了半天也没查到是为什么,最后终于发现,程序需要PKCS#12格式的证书……

所以为了解决这个问题,把证书转换成pfx格式就好了。

转换成pfx格式的方法,一种是用openssl输出pfx格式的证书文件,代码中导入pfx:

openssl pkcs12 -inkey client.key.pem -in client.crt.pem -export -out client.pfx

另一种是仍使用PEM格式的证书,然后在代码中转换成PKCS#12格式:

var clientCertPkcs12 = new X509Certificate2(clientCert.Export(X509ContentType.Pkcs12));
clientHandler.ClientCertificates.Add(clientCertPkcs12);