Request.HttpContext.Connection.ClientCertificate始终为空。

10
我是一位有用的助手,可以为您翻译文本。

我在Azure Linux应用服务上部署了一个ASP.Net核心网站。

在控制器中,我正在尝试获取客户端证书,如下所示:

var callerCertificate = Request.HttpContext.Connection.ClientCertificate;

我经常得到callerCertificatenull。我尝试使用相同结果nullawait Request.HttpContext.Connection.GetClientCertificateAsync()
我的网站webhost创建如下:
WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseStartup<Startup>()
                .UseSerilog();

我还为网站(在 Azure 上)设置了以下 SSL 设置:

enter image description here

客户端调用方是一个net462项目,使用Microsoft.Rest.CertificateCredentials设置证书以进行HTTP请求。
var cred = new CertificateCredentials(_deviceCertificate)
...
await this.cred.ProcessHttpRequestAsync(_httpRequest, cancellationToken).ConfigureAwait(false);

我通过交换证书文件解决了这个问题。请查看此处的描述:https://stackoverflow.com/questions/54833178/client-certificate-is-always-null/55279563#55279563 - narlee
@Tany,你能解决这个问题吗? - Ajay Yadav
@AjayYadav 是的。看看我下面的答案。 - Tany
是的,我已经参考了,但仍然得到证书为空。 - Ajay Yadav
.net 5 可与以下内容一起使用: webBuilder.ConfigureKestrel(o => { o.ConfigureHttpsDefaults(o => o.ClientCertificateMode = ClientCertificateMode.AllowCertificate); }); - Cenarius
2个回答

4

您可以尝试直接使用HttpClient添加证书,而不是使用Microsoft.Rest.CertificateCredential

var clientHandler = new HttpClientHandler();
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(_deviceCertificate);

var client = new HttpClient(clientHandler);
var result = client.GetAsync("https://yourservice").GetAwaiter().GetResult();

您可能还需要配置SSL协议(SSL2、SSL3、TLS等):
clientHandler.SslProtocols = SslProtocols.Tls;

1
我需要实现的目标是保持客户端不变,并将现有的asp.net webapi网站迁移到asp.net core网站。要求客户端进行更改将是一个重大的破坏性变化,我正在尝试避免这种情况。尽管如此,我将尝试您建议的方法,看看是否可行。 - Tany
是的,至少它可能会给你更多有关潜在问题的信息。让我知道进展如何... - Isma
3
没用。控制器仍未获得证书。 :( - Tany

3
回答我的问题: 我能够从头部获取客户端证书。
“string clientCertFromHeader = Request.Headers [“X-ARR-ClientCert”];”
尽管如此,为什么“Request.HttpContext.Connection.ClientCertificate”不能提供证书仍然是一个谜。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接