gpt4 book ai didi

c# - 问题 SSL 证书 C#

转载 作者:太空狗 更新时间:2023-10-29 22:20:31 25 4
gpt4 key购买 nike

在我的 C# 应用程序中,我必须通过 https 调用 Web 服务并使用我已有的 .crt 文件进行验证。这是满足此类需求的正确解决方案。一旦找到可行的解决方案,我就更新了这篇文章,认为它可能对像我这样的其他人有所帮助。

解决方案:以下代码在整个应用程序执行过程中只需执行一次。有了这个,我们设置了将在调用请求时使用的 ServerCertification 和 SSL 属性:

        public static void setSSLCertificate()
{
clientCert = new X509Certificate2(AUTHEN_CERT_FILE); // Pointing to the .crt file that will be used for server certificate verification by the client
System.Net.ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);
}

public static bool customXertificateValidation(Object sender, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPoicyErrors)
{
switch (sslPoicyErrors)
{
case System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors:
case System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch:
case System.Net.Security.SslPolicyErrors.RemoteCertificateNotAvailable:
break;
}

return clientCert.Verify(); // Perform the Verification and sends the result
}

请求正常完成,就像我们没有实现 SSL 一样。这是一个 Post 请求代码:

        private static String SendPost(String uri, String post_data)
{
String resData = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";

// turn request string into byte[]
byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

Stream requestStream = null;

try
{
// Send it
request.ContentLength = postBytes.Length;
requestStream = request.GetRequestStream();
requestStream.Write(postBytes, 0, postBytes.Length);
}
catch (WebException we)
{ // If SSL throws exception that will be handled here
if (we.Status == WebExceptionStatus.TrustFailure)
throw new Exception("Exception Sending Data POST : Fail to verify server " + we.Message);
}
catch (Exception e)
{
throw new Exception("Exception Sending Data POST : " + e.Message, e.InnerException);
}
finally
{
if (requestStream != null)
requestStream.Close();
}

// Get the response
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
if (response == null)
return "";
StreamReader sr = new StreamReader(response.GetResponseStream());
resData = sr.ReadToEnd().Trim();
sr.Close();
}
catch (Exception e)
{
throw new Exception("Error receiving response from POST : " + e.Message, e.InnerException);
}
finally
{
if (response != null)
response.Close();
}

return resData;
}

特别感谢 Dipti Mehta,他的解释帮助我通过接受服务器证书极大地实现了目标。她帮我解决了我的困惑。我终于找到了如何由客户端使用 .crt 文件验证服务器证书。

希望这对某人有帮助。

谢谢

最佳答案

当您浏览到 HTTPS 站点时,您可能会看到一个对话窗口,询问您是否要信任网络服务器提供的证书。因此接受证书的责任由用户处理。让我们回到 web 服务场景,如果你想调用位于使用 SSL 和 HTTPS 的 web 服务器上的 web 服务,就会出现问题。

当您从代码进行调用时,不会弹出对话窗口询问您是否信任该证书 ;可能你会得到以下异常:

An unhandled exception of type 'System.Net.WebException' occurred in system.dll

Additional information: The underlying connection was closed: Could not establish trust relationship with remote server.

但是这个问题有一个解决方案,您可以通过创建自己的 CertificatePolicy 类(它实现了 ICertificatePolicy 接口(interface))在您的代码中解决这个问题。在此类中,您将必须编写自己的 CheckValidationResult 函数,该函数必须返回 true 或 false,就像您在对话框窗口中按是或否一样。出于开发目的,我创建了以下接受所有证书的类,因此您不会再遇到讨厌的 WebException:

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy()
{}

public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,WebRequest req, int problem)
{
return true;
}
}

如您所见,CheckValidationResult 函数始终返回 true,因此所有证书都将被信任。如果你想让这个类更安全一点,你可以使用 X509Certificate 参数添加额外的检查。要使用此 CertificatePolicy,您必须告诉 ServicePointManager 使用它:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();

这必须在调用您的网络服务之前完成(在应用程序生命周期中一次)。

关于c# - 问题 SSL 证书 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5713071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com