当前位置: 首页 > 知识库问答 >
问题:

从pem文件加载X509Certificate2。当用作客户端证书时,结果是没有可用的凭据

宋岳
2023-03-14

我需要向服务器发出请求。此请求需要证书才能访问服务器。

如果我加载P12文件并将其注册为http客户端上的证书。它工作得很好。

var clientCertificate = new X509Certificate2(pathToTestCert, passToTestCert);
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(clientCertificate );

但是,如果我使用CreateFromPemFile从pem文件加载证书。

var clientCertificate= X509Certificate2.CreateFromPemFile(purePem);
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(clientCertificate);

我在向服务器发送请求时收到。

System.IO.IOException: The read operation failed, see inner exception.
 ---> System.ComponentModel.Win32Exception (0x8009030E): No credentials are available in the security package
   at System.Net.SSPIWrapper.AcquireCredentialsHandle(ISSPIInterface secModule, String package, CredentialUse intent, SCH_CREDENTIALS* scc)
   at System.Net.Security.SslStreamPal.AcquireCredentialsHandle(CredentialUse credUsage, SCH_CREDENTIALS* secureCredential)
   at System.Net.Security.SslStreamPal.AcquireCredentialsHandleSchCredentials(X509Certificate2 certificate, SslProtocols protocols, EncryptionPolicy policy, Boolean isServer)
   at System.Net.Security.SslStreamPal.AcquireCredentialsHandle(SslStreamCertificateContext certificateContext, SslProtocols protocols, EncryptionPolicy policy, Boolean isServer)
   at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
   at System.Net.Security.SecureChannel.GenerateToken(ReadOnlySpan`1 inputBuffer, Byte[]& output)
   at System.Net.Security.SecureChannel.NextMessage(ReadOnlySpan`1 incomingBuffer)
   at System.Net.Security.SslStream.ProcessBlob(Int32 frameSize)
   at System.Net.Security.SslStream.ReceiveBlobAsync[TIOAdapter](TIOAdapter adapter)
   at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)
   at System.Net.Security.SslStream.ReplyOnReAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Byte[] buffer)
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter adapter, Memory`1 buffer)
   --- End of inner exception stack trace ---
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter adapter, Memory`1 buffer)
   at System.Net.Http.HttpConnection.InitialFillAsync(Boolean async)
   at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken
        

注意,如果在文本编辑器中打开pem文件,则其外观如下所示。

-----BEGIN PRIVATE KEY-----
.
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
.....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
................
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
.................
-----END CERTIFICATE-----

共有1个答案

翁和颂
2023-03-14

Windows上的TLS层要求将私钥写入磁盘(以特定方式)。基于PEM的证书加载不会这样做,只有PFX加载会。

使TLS层快乐的最简单方法是这样做

cert = new X509Certificate2(cert.Export(X509ContentType.Pfx));

也就是说,将证书密钥导出到PFX,然后立即再次导入(以获得密钥以SChannel可以找到的方式(暂时)写入磁盘的副作用)。您不需要费心更改PFX加载标志的默认值,尽管一些复杂的受限用户可能需要使用MachineKeySet。

 类似资料:
  • 问题内容: 我试图从下面的文件中提取RES公钥 这是我做的代码.. 但是它抛出了 java.security.InvalidKeyException:IOException:ObjectIdentifier()-数据不是对象ID 从文件中提取RES公钥的合适方法是什么。 问题答案: X.509证书和X509EncodedKeySpec具有完全不同的结构,并且尝试将证书解析为密钥是行不通的。Java

  • 我尝试将文件添加到configuration中,以访问站点。我在<code>系统中添加了以下行。属性文件: 之后,我重新启动了,但得到了相同的错误,。我使用keytool将文件转换为,并通过替换以前的行将以下行添加到同一文件中。 在这种情况下,错误消息也是相同的: 响应代码: 非 HTTP 响应代码: handshake_failure 我使用HTTP Client 4作为HTTP Sampler

  • 这是个新手问题。我正在尝试使用以下方法加载.der证书: 有效吗?我如何在代码中得到它?

  • 我想为我的REST API使用TLS,我计划为它创建自签名证书,并为我的restapi的客户端提供公钥。 我的restapi部署在tomcat catalina容器(tomcat版本8.0.42)上。 我的测试步骤如下, 服务器端 1) 我使用openssl创建了一个自签名证书 2) 已创建bundle 3) 然后将tomcat配置为启用TLS(keystoreType为“PKCS12”),并启动

  • 我有一个。p12我的应用程序需要的证书文件。Sys admin不希望将此文件存储在系统中。他们希望将文件的价值放入Azure机密中。作为一个。pem文件。 使用以下代码,我可以加载P12文件。var certHasPrivate ateKey为真,我的代码运行良好。 但是,如果我加载此导出的基于文本的版本,则var certHasPrivate ateKey为false,它不会加载私钥。 如何加载

  • 我收到了一个新的密钥库。jks文件用于ssl连接,以替换旧的但仍在工作的。jks密钥库文件,但我收到了“意外握手消息:serve_hello”错误。我被告知要确保密钥库包含客户端证书,所以我使用keytool将其证书导出到pem文件,然后使用openssl检查目的。结果显示 证书用途:SSL客户端:否SSL客户端CA:否SSL服务器:是SSL服务器CA:否... 然而,当我应用相同的过程来检查旧的