Eu tenho usado HttpClient
para fazer chamadas WebApi usando c #. Parece maneira limpa e rápida em comparação com WebClient
. No entanto, estou atolado ao fazer Https
chamadas.
Como posso fazer o código abaixo para fazer Https
chamadas?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
EDIT 1: O código acima funciona bem para fazer chamadas http. Mas quando eu mudo o esquema para https, ele não funciona. Aqui está o erro obtido:
A conexão subjacente foi fechada: Não foi possível estabelecer relação de confiança para o canal seguro SSL / TLS.
EDIT 2: Alterar o esquema para https é: etapa um.
Como forneço certificado e chave pública / privada, juntamente com a solicitação de C #.
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
fonte
fonte
new Uri("https://foobar.com/");
Respostas:
Se o servidor suportar apenas uma versão TLS superior, como o TLS 1.2, ele ainda falhará, a menos que o PC cliente esteja configurado para usar uma versão TLS superior por padrão. Para superar esse problema, adicione o seguinte no seu código.
Modificando seu código de exemplo, seria
fonte
SecurityProtocolType.Tls12
não poderia encontrar esses valores de enumeração que você mencionouSimplesmente especifique HTTPS no URI.
Foobar.com precisará ter um certificado SSL confiável ou suas chamadas falharão com erro não confiável.
EDIT Answer: ClientCertificates with HttpClient
EDIT Answer2: Se o servidor ao qual você está se conectando tiver desativado o SSL, TLS 1.0 e 1.1 e ainda estiver executando o .NET framework 4.5 (ou abaixo), será necessário fazer uma escolha
fonte
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Seu código deve ser modificado desta maneira:
Você precisa apenas usar o
https:
esquema de URI. Há uma página útil aqui no MSDN sobre as conexões HTTP seguras. De fato:Além disso, considere que as conexões HTTPS usam um certificado SSL. Verifique se sua conexão segura possui este certificado, caso contrário, as solicitações falharão.
EDITAR:
O que significa que não funciona? Os pedidos falham? Uma exceção é lançada? Esclareça sua pergunta.
Se as solicitações falharem, o problema deverá ser o certificado SSL.
Para corrigir o problema, você pode usar a classe
HttpWebRequest
e, em seguida, sua propriedadeClientCertificate
. Além disso, você pode encontrar aqui uma amostra útil sobre como fazer uma solicitação HTTPS usando o certificado.Um exemplo é o seguinte (conforme mostrado na página do MSDN vinculada anteriormente):
fonte
Ao conectar-
https
me, também recebi esse erro, adiciono esta linha antesHttpClient httpClient = new HttpClient();
e conecto com sucesso:Eu conheço esta resposta e outra resposta similar e o comentário menciona:
Além disso, não tentei o método em Outra resposta que usa
new X509Certificate()
ounew X509Certificate2()
para fazer um certificado, não tenho certeza de que simplesmente criar pornew()
funcionará ou não.EDIT: Algumas referências:
Criar um certificado de servidor autoassinado no IIS 7
Importar e exportar certificados SSL no IIS 7
Converter .pfx em .cer
Práticas recomendadas para usar ServerCertificateValidationCallback
Acho que o valor da impressão digital é igual a
x509certificate.GetCertHashString()
:Recuperar a impressão digital de um certificado
fonte
Eu tive o mesmo problema ao conectar-me ao GitHub, que requer um agente de usuário. Portanto, é suficiente fornecer isso em vez de gerar um certificado
fonte
123456789
??Há uma configuração não global no nível de
HttpClientHandler
:Assim, é possível ativar as versões mais recentes do TLS.
Observe que o valor padrão
SslProtocols.Default
é realmenteSslProtocols.Ssl3 | SslProtocols.Tls
(verificado para .Net Core 2.1 e .Net Framework 4.7.1).fonte
Apenas especificar HTTPS no URI deve fazer o truque.
Se a solicitação funcionar com HTTP, mas falhar com HTTPS, isso certamente é um problema de certificado . Verifique se o chamador confia no emissor do certificado e se o certificado não está vencido. Uma maneira rápida e fácil de verificar isso é tentar fazer a consulta em um navegador.
Você também pode verificar no servidor (se é seu e / ou se puder) se está configurado para atender às solicitações HTTPS corretamente.
fonte
Eu também estava recebendo o erro:
... com um aplicativo de segmentação do Xamarin Forms Android tentando solicitar recursos de um provedor de API que exigia o TLS 1.3.
A solução foi atualizar a configuração do projeto para trocar o cliente http "gerenciado" (.NET) do Xamarin (que não suporta o TLS 1.3 a partir do Xamarin Forms v2.5) e, em vez disso, usar o cliente nativo do Android.
É um projeto simples de alternância no visual studio. Veja a captura de tela abaixo.
fonte
Adicione as declarações abaixo à sua classe:
Depois de:
E:
Feliz? :)
fonte
Eu tive esse problema e, no meu caso, a solução era estupidamente simples: abra o Visual Studio com direitos de administrador. Eu tentei todas as soluções acima e não funcionou até fazer isso. Espero que poupa a alguém um tempo precioso.
fonte
Você pode tentar usar o pacote Nuget ModernHttpClient : Depois de baixar o pacote, você pode implementá-lo assim:
fonte
Concordo com felickz, mas também quero adicionar um exemplo para esclarecer o uso em c #. Eu uso o SSL no serviço Windows da seguinte maneira.
Se eu vou usá-lo em um aplicativo Web, estou apenas alterando a implementação no lado do proxy assim:
fonte
Para erro:
Eu acho que você precisa aceitar certificado incondicionalmente com o seguinte código
como Oppositional escreveu em sua resposta à pergunta cliente .NET conexão com SSL Web API .
fonte