J'utilise HttpClient
pour faire des appels WebApi en utilisant C #. Semble moyen net et rapide par rapport à WebClient
. Cependant, je suis coincé lorsque je passe des Https
appels.
Comment puis-je créer le code ci-dessous pour passer des Https
appels?
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: Le code ci-dessus fonctionne très bien pour passer des appels http. Mais lorsque je change le schéma en https, cela ne fonctionne pas. Voici l'erreur obtenue:
La connexion sous-jacente a été fermée: impossible d'établir une relation d'approbation pour le canal sécurisé SSL / TLS.
EDIT 2: Changer le schéma en https est: la première étape.
Comment puis-je fournir un certificat et une clé publique / privée avec une demande C #.
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
la source
la source
new Uri("https://foobar.com/");
Réponses:
Si le serveur prend uniquement en charge la version TLS supérieure comme TLS 1.2 uniquement, il échouera toujours à moins que votre PC client ne soit configuré pour utiliser une version TLS supérieure par défaut. Pour surmonter ce problème, ajoutez ce qui suit dans votre code.
En modifiant votre exemple de code, ce serait
la source
SecurityProtocolType.Tls12
Impossible de trouver ces valeurs d'énumération que vous avez mentionnéesSpécifiez simplement HTTPS dans l'URI.
Foobar.com devra avoir un certificat SSL de confiance ou vos appels échoueront avec une erreur non fiable.
EDIT Réponse: ClientCertificates avec HttpClient
EDIT Answer2: Si le serveur auquel vous vous connectez a désactivé SSL, TLS 1.0 et 1.1 et que vous exécutez toujours .NET Framework 4.5 (ou inférieur), vous devez faire un choix
la source
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Votre code doit être modifié de cette manière:
Vous n'avez qu'à utiliser le
https:
schéma URI. Il y a une page utile ici sur MSDN sur les connexions HTTP sécurisées. En effet:De plus, considérez que les connexions HTTPS utilisent un certificat SSL. Assurez-vous que votre connexion sécurisée possède ce certificat, sinon les demandes échoueront.
ÉDITER:
Qu'est-ce que cela signifie ne fonctionne pas? Les demandes échouent? Une exception est levée? Clarifiez votre question.
Si les demandes échouent, le problème doit être le certificat SSL.
Pour résoudre le problème, vous pouvez utiliser la classe
HttpWebRequest
, puis sa propriétéClientCertificate
. De plus, vous pouvez trouver ici un exemple utile sur la façon de faire une requête HTTPS à l'aide du certificat.Un exemple est le suivant (comme indiqué dans la page MSDN liée précédemment):
la source
Lorsque
https
je me connecte à, j'ai également cette erreur, j'ajoute cette ligne avantHttpClient httpClient = new HttpClient();
et je me connecte avec succès:Je le sais grâce à cette réponse et à une autre anwser similaire et le commentaire mentionne:
De plus, je n'ai pas essayé la méthode dans Another Answer qui utilise
new X509Certificate()
ounew X509Certificate2()
pour créer un certificat, je ne suis pas sûr que simplement créer parnew()
fonctionnera ou non.EDIT: Quelques références:
Créer un certificat de serveur auto-signé dans IIS 7
Importer et exporter des certificats SSL dans IIS 7
Convertir .pfx en .cer
Meilleures pratiques d'utilisation de ServerCertificateValidationCallback
Je trouve que la valeur de Thumbprint est égale à
x509certificate.GetCertHashString()
:Récupérer l'empreinte d'un certificat
la source
J'ai eu le même problème lors de la connexion à GitHub, qui nécessite un agent utilisateur. Il suffit donc de fournir cela plutôt que de générer un certificat
la source
123456789
??Il existe un paramètre non global au niveau de
HttpClientHandler
:Ainsi, on active les dernières versions de TLS.
Notez que la valeur par défaut
SslProtocols.Default
est en faitSslProtocols.Ssl3 | SslProtocols.Tls
(vérifiée pour .Net Core 2.1 et .Net Framework 4.7.1).la source
Le simple fait de spécifier HTTPS dans l'URI devrait faire l'affaire.
Si la requête fonctionne avec HTTP mais échoue avec HTTPS, il s'agit très certainement d'un problème de certificat . Assurez-vous que l'appelant fait confiance à l'émetteur du certificat et que le certificat n'a pas expiré. Un moyen rapide et facile de vérifier cela est d'essayer de faire la requête dans un navigateur.
Vous pouvez également vérifier sur le serveur (si c'est le vôtre et / ou si vous le pouvez) qu'il est configuré pour servir correctement les requêtes HTTPS.
la source
J'obtenais également l'erreur:
... avec une application de ciblage Android Xamarin Forms qui tente de demander des ressources à un fournisseur d'API nécessitant TLS 1.3.
La solution consistait à mettre à jour la configuration du projet pour échanger le client http «managé» (.NET) Xamarin (qui ne prend pas en charge TLS 1.3 à partir de Xamarin Forms v2.5) et à utiliser à la place le client natif Android.
C'est un simple basculement de projet dans Visual Studio. Voir la capture d'écran ci-dessous.
la source
Ajoutez les déclarations ci-dessous à votre classe:
Après:
Et:
Heureux? :)
la source
J'ai eu ce problème et dans mon cas, la solution était stupidement simple: ouvrir Visual Studio avec les droits d'administrateur. J'ai essayé toutes les solutions ci-dessus et cela n'a pas fonctionné jusqu'à ce que je fasse cela. J'espère que cela fera gagner un temps précieux à quelqu'un.
la source
Vous pouvez essayer d'utiliser le package ModernHttpClient Nuget: Après avoir téléchargé le package, vous pouvez l'implémenter comme ceci:
la source
Je suis d'accord avec felickz mais je souhaite également ajouter un exemple pour clarifier l'utilisation en c #. J'utilise SSL dans le service Windows comme suit.
Si je vais l'utiliser dans une application Web, je change simplement l'implémentation côté proxy comme ceci:
la source
Pour erreur:
Je pense que vous devez accepter le certificat sans condition avec le code suivant
comme Oppositional l'a écrit dans sa réponse à la question .NET client se connectant à l'API Web ssl .
la source