项目需要使用.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);