C# https通讯

1 篇文章 0 订阅

最近项目中需要通过https对接客户的服务器API,客户给的格式为.pem和.key的证书和私钥文件,然后我没有找到C#通过证书和密钥两个文件创建证书的方法,要通过X509Certificate2创建证书只能是引入一个文件,最后找到方法如下:

代码:

    //2.定义方法:
    private static bool RemoteCertificateValidate(object sender, X509Certificate  cert, X509Chain chain, SslPolicyErrors error)
    {
        //为了通过证书验证,总是返回true
        return true;
    }
    /// <summary>
    /// Https 请求函数 暂时只支持GET PUT POST
    /// </summary>
    /// <param name="GetOrPost"></param>
    /// <param name="Url"></param>
    /// <param name="RequestInfo"></param>
    /// <param name="ResponseInfo"></param>
    /// <param name="TimeOutMs"></param>
    /// <returns></returns>
    public static int HttpRequest(string GetOrPost, string Url, string  RequestInfo, ref string ResponseInfo, int TimeOutMs)
    {
        try
        {
            ServicePointManager.ServerCertificateValidationCallback = new  System.Net.Security.RemoteCertificateValidationCallback(RemoteCertificateValidate);
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |  SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
            ServicePointManager.Expect100Continue = false;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            X509Certificate2 cer = new X509Certificate2(@".\client.pfx", "123456",  X509KeyStorageFlags.DefaultKeySet);
          
            X509Store store = new X509Store(StoreName.My,  StoreLocation.CurrentUser);    
            store.Open(OpenFlags.MaxAllowed);
            store.Remove(cer);
            store.Add(cer);
            store.Close();
            request.UseDefaultCredentials = true;
            request.PreAuthenticate = true;
            request.Credentials = CredentialCache.DefaultCredentials;
            request.ClientCertificates.Add(cer);
            request.Method = GetOrPost;
            request.KeepAlive = false;
            // request.CookieContainer = CookieContainer;
            request.ProtocolVersion = HttpVersion.Version11;
            request.AllowAutoRedirect = false;
            request.Timeout = TimeOutMs;
            //3.在WebRequest请求之前调用:
            ServicePointManager.ServerCertificateValidationCallback +=  RemoteCertificateValidate;
            if (GetOrPost == "PUT")
            {
                request.ContentType = "application/json";
                int RequestLength = Encoding.UTF8.GetByteCount(RequestInfo);
                Stream RequestStream = request.GetRequestStream();
                RequestStream.Write(Encoding.UTF8.GetBytes(RequestInfo), 0,  RequestLength);
                RequestStream.Close();
            }
            else if (GetOrPost == "POST")
            {
                request.ContentType =  "application/x-www-form-urlencoded;charset=utf-8";
                int RequestLength = Encoding.UTF8.GetByteCount(RequestInfo);
                Stream RequestStream = request.GetRequestStream();
                RequestStream.Write(Encoding.UTF8.GetBytes(RequestInfo), 0,  RequestLength);
                RequestStream.Close();
            }
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream ResponseStream = response.GetResponseStream();
            StreamReader StreamReader = new StreamReader(ResponseStream,  Encoding.UTF8);
            ResponseInfo = StreamReader.ReadToEnd();
            StreamReader.Close();
            response.Close();
            return 0;
        }
        catch (Exception ex)
        {
            ResponseInfo = "HTTPS Error Message :" + ex.Message;
            return -1;
        }
    }

函数调用方法:HTTPS.HttpRequest(“GET”, uri_GetData, null, ref ReviveData, 40000);

X509Certificate2类创建证书文件必须使用同时包含证书、公钥、私钥的证书文件格式;
客户给的.pem和.key文件,必须转化格式才可以直接使用。
.pem包含公钥和证书,.key包含私钥,需要通过OpenSSL将其转化成同时包含证书、公钥、私钥的证书文件格式。

转换方法:
打开OpenSSL,输入pkcs12 -export -out D:/client.pfx -inkey D:/client.key -in D:/client.pem,
会提示输出两次密码,此密码为生成的.pfx格式证书文件的密码;
在这里插入图片描述D:/client.key、D:/client.pem指示key和pem路径和文件名,可以根据实际情况修改,D:/client.pfx为生成文件的路径和文件名;
密码输入完成之后,按下enter,自动转换成功:
在这里插入图片描述
X509Certificate2 cer = new X509Certificate2(@".\client.pfx", “123456”, X509KeyStorageFlags.DefaultKeySet);
".\client.pfx"为证书文件路径和文件名,"123456"为证书密码,即通过OpenSSL转换时输入输入的密码;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用提供了一个关于Modbus RTU读写器的介绍链接,但是我无法访问该链接,因此无法提供具体的信息。但是,对于C# MODBUS通讯库,我可以提供一些一般性的信息。 C# MODBUS通讯库是用于在C#编程语言中实现Modbus通信协议的库。Modbus是一种通信协议,常用于工业自动化领域中的设备之间的通信。它定义了一系列的功能码,用于读取和写入设备的寄存器或线圈数据。 使用C# MODBUS通讯库,开发人员可以轻松地在C#应用程序中实现Modbus通信功能。这个库通常提供了一组API和方法,使开发人员能够进行Modbus数据的读取和写入操作。 具体的C# MODBUS通讯库可以根据具体的需求和场景进行选择。一些常见的C# MODBUS通讯库包括NModbus、EasyModbus、ModbusTCP.Net、Modbus Master等。这些库提供了丰富的功能和易于使用的接口,可以帮助开发人员快速地实现Modbus通信功能。 要使用C# MODBUS通讯库,开发人员通常需要先引入该库,并根据库的文档和示例代码来进行配置和调用。具体的步骤和代码示例可以根据选择的库来进行参考和学习。 总结来说,C# MODBUS通讯库是用于在C#编程语言中实现Modbus通信协议的库。通过使用这样的库,开发人员可以轻松地实现Modbus通信功能,并与相关设备进行数据的读取和写入操作。<span class="em">1</span> #### 引用[.reference_title] - *1* [C# MODBUS RTU通讯源码](https://blog.csdn.net/zhangjin7422/article/details/121944739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值