Https C# 双向认证的问题

zklsdfd 2017-03-22 01:43:54
C#这边网上找的资料都不行 , 就是把下面Java代码转换成C#代码 , 有两个证书,有没有懂这个的麻烦指教一下,最好有一些核心代码步骤,感激不尽
  // 1 导入自己的证书
KeyStore selfCert = KeyStore.getInstance("pkcs12");
selfCert.load(new FileInputStream(SELFCERTPATH),
SELFCERTPWD.toCharArray());

X509Certificate2 myX509Certificate2 = new X509Certificate2(
@"D://cert//ca.jks", //证书路径
"Huawei@123", //证书的私钥保护密码
X509KeyStorageFlags.Exportable //表示此证书的私钥以后还可以导出
);

//密钥管理工厂 注册密钥
KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(selfCert, SELFCERTPWD.toCharArray());

// 2导入服务器CA证书,
KeyStore caCert = KeyStore.getInstance("jks");
caCert.load(new FileInputStream(TRUSTCAPATH), TRUSTCAPWD.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
tmf.init(caCert);

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

// 3 设置域名不验证
// ((非商业物联网平台,没有使用域名访问一般。)y.)
SSLSocketFactory ssf = new SSLSocketFactory(sc,
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

//如果平台已经申请了与证书信息中的域名相匹配的域名,则证书
//域名检查可以启用(默认打开)
// SSLSocketFactory ssf = new SSLSocketFactory(sc);

ClientConnectionManager ccm = this.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 8743, ssf));

httpClient = new DefaultHttpClient(ccm);
...全文
511 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcyhjx 2017-07-06
  • 打赏
  • 举报
回复
你用的是不是.cer证书? 双向认证要使用.pfx/.p12证书
zklsdfd 2017-03-24
  • 打赏
  • 举报
回复
单向认证的有一个论坛里的小伙伴已经解决了,就是按照上面那些代码就可以了,我这边的问题应该就是厂商那边的问题了。
zklsdfd 2017-03-23
  • 打赏
  • 举报
回复
引用 12 楼 foren_whb 的回复:
你的代码有问题,搞不懂你那些认证是什么意思? 为什么要双向认证?? 给你看看我我刚调试成功的一个例子: 1. 封装的访问方法

using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace WuHanHouse
{
    public class HttpsRequest
    {
        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;     
        }

        public static string PostHttpsRequest(string url, Dictionary<string, string> parameters)
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            var request = WebRequest.Create(url) as HttpWebRequest;
            request.ProtocolVersion = HttpVersion.Version10;
            request.CookieContainer = new CookieContainer();
            request.AllowAutoRedirect = true;
            request.Timeout = 1000 * 60;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.Referer = url;

            if (!(parameters == null || parameters.Count == 0))
            {
                var param = "";
                foreach (var key in parameters.Keys)
                {
                    param += "&" + key + "=" + parameters[key];
                }
                using (var sw = new StreamWriter(request.GetRequestStream()))
                {
                    sw.Write(param.Trim('&'));
                    sw.Close();
                }
            }
            var res = request.GetResponse() as HttpWebResponse;
            var st = res.GetResponseStream();
            var sr = new StreamReader(st);
            return sr.ReadToEnd();
        }

    }
}
2. 调用的例子

            var parameters = new Dictionary<string, string>();
            parameters.Add("PostType", "FOOD");
            parameters.Add("Category", "");
            parameters.Add("PageIndex", "1");
            parameters.Add("PageSize", "8");
            var res = HttpsRequest.PostHttpsRequest("https://www.myvivaplan.com/Blog/List", parameters);
您的代码我试了一下,对于您那个接口是ok的,但是如果是要添加证书认证的,肯定是少了一步,能不能提供一个双向认证的demo,不管行不行都是非常感谢你们的热心帮助
zklsdfd 2017-03-23
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
[quote=引用 8 楼 z1090891028 的回复:] [quote=引用 6 楼 shingoscar 的回复:] 问的是你说 C#这边网上找的资料都不行 是怎么个不行 不是来帮你转代码的
我的重点是那些代码步骤该如何实现,不要纠结于那些文字。[/quote] 步骤无非就是 1、创建HttpWebRequest 2、设置ClientCertificates 3、设置ServicePointManager.ServerCertificateValidationCallback 4、GetResponse 如果服务器关掉你的连接,那么需要去服务器上检查究竟是握手阶段,还是请求阶段,具体原因[/quote] 恩 谢谢了,如果请求没问题,只能去协调服务器那边的工作人员了帮忙看下了
引用 11 楼 shingoscar 的回复:
[quote=引用 8 楼 z1090891028 的回复:] [quote=引用 6 楼 shingoscar 的回复:] 问的是你说 C#这边网上找的资料都不行 是怎么个不行 不是来帮你转代码的
我的重点是那些代码步骤该如何实现,不要纠结于那些文字。[/quote] 步骤无非就是 1、创建HttpWebRequest 2、设置ClientCertificates 3、设置ServicePointManager.ServerCertificateValidationCallback 4、GetResponse 如果服务器关掉你的连接,那么需要去服务器上检查究竟是握手阶段,还是请求阶段,具体原因[/quote]恩 谢谢了,只能找服务器那边工作人员帮忙看下了。
丰云 2017-03-22
  • 打赏
  • 举报
回复
你的代码有问题,搞不懂你那些认证是什么意思? 为什么要双向认证?? 给你看看我我刚调试成功的一个例子: 1. 封装的访问方法

using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace WuHanHouse
{
    public class HttpsRequest
    {
        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;     
        }

        public static string PostHttpsRequest(string url, Dictionary<string, string> parameters)
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            var request = WebRequest.Create(url) as HttpWebRequest;
            request.ProtocolVersion = HttpVersion.Version10;
            request.CookieContainer = new CookieContainer();
            request.AllowAutoRedirect = true;
            request.Timeout = 1000 * 60;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.Referer = url;

            if (!(parameters == null || parameters.Count == 0))
            {
                var param = "";
                foreach (var key in parameters.Keys)
                {
                    param += "&" + key + "=" + parameters[key];
                }
                using (var sw = new StreamWriter(request.GetRequestStream()))
                {
                    sw.Write(param.Trim('&'));
                    sw.Close();
                }
            }
            var res = request.GetResponse() as HttpWebResponse;
            var st = res.GetResponseStream();
            var sr = new StreamReader(st);
            return sr.ReadToEnd();
        }

    }
}
2. 调用的例子

            var parameters = new Dictionary<string, string>();
            parameters.Add("PostType", "FOOD");
            parameters.Add("Category", "");
            parameters.Add("PageIndex", "1");
            parameters.Add("PageSize", "8");
            var res = HttpsRequest.PostHttpsRequest("https://www.myvivaplan.com/Blog/List", parameters);
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
引用 8 楼 z1090891028 的回复:
[quote=引用 6 楼 shingoscar 的回复:] 问的是你说 C#这边网上找的资料都不行 是怎么个不行 不是来帮你转代码的
我的重点是那些代码步骤该如何实现,不要纠结于那些文字。[/quote] 步骤无非就是 1、创建HttpWebRequest 2、设置ClientCertificates 3、设置ServicePointManager.ServerCertificateValidationCallback 4、GetResponse 如果服务器关掉你的连接,那么需要去服务器上检查究竟是握手阶段,还是请求阶段,具体原因
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
引用 9 楼 xdashewan 的回复:
你不需要接受应答吗?
using (Stream reqstream = req.GetRequestStream()) 这一步报错,应该是那边没有认证通过,所以 我想问下C#有没有搞过这个的,具体的步骤是什么。
xdashewan 2017-03-22
  • 打赏
  • 举报
回复
你不需要接受应答吗?
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
问的是你说 C#这边网上找的资料都不行 是怎么个不行 不是来帮你转代码的
我的重点是那些代码步骤该如何实现,不要纠结于那些文字。
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
这个是我写的请求,报错 : 基础链接已关闭
   HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
                var sbString = new StringBuilder();
                //导入自己的证书
                var selfCert = new X509Certificate2(SelfCertPath, SelfCertPwd,
                    X509KeyStorageFlags.MachineKeySet);

                //服务器证书
                var trustCert = new X509Certificate2(TrustcaPath, TrustcaPwd,
                  X509KeyStorageFlags.MachineKeySet);

                req.ClientCertificates.Add(selfCert);
                //req.ClientCertificates.Add(trustCert);
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

                req.Headers.Add("SOAPAction", url);
                string message = "";
                if (req != null)
                {
                    if (!(dicParam == null) || dicParam.Count == 0)
                    {

                        int i = 0;
                        foreach (var key in dicParam.Keys)
                        {
                            if (i > 0)
                            {
                                sbString.AppendFormat("&{0}={1}", key, dicParam[key]);
                            }
                            else
                            {
                                sbString.AppendFormat("{0}={1}", key, dicParam[key]);
                            }
                            i++;
                        }
                    }
                    byte[] bs = Encoding.GetEncoding("utf-8").GetBytes(sbString.ToString());

                    req.Method = "POST";
                    req.ContentType = "application/x-www-form-urlencoded";
                    req.ContentLength = bs.Length;
                    using (Stream reqstream = req.GetRequestStream())
                    {
                        reqstream.Write(bs, 0, bs.Length);
                        reqstream.Close();
                    }
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
问的是你说 C#这边网上找的资料都不行 是怎么个不行 不是来帮你转代码的
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
都不行是什么不行?
一个是自己的证书,一个是服务器的证书
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
都不行是什么不行?
C# 请求的时候怎样做到 SSLContext sc = SSLContext.getInstance("TLS"); sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 这一步
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
都不行是什么不行?
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
@娃都会打酱油了
zklsdfd 2017-03-22
  • 打赏
  • 举报
回复
@starfd

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧