最近在编辑,大胆的 我使用。净 HttpListener 类但我不会上运行IIS和我不用ASP.net.此 网站 描述了什么样的代码实际用于实施与SSL asp.net 和 这个网站 介绍了如何设置的证明(虽然我不确定如果它仅适用于IIS)。

这类文件描述了各种类型的认证(基本、摘要、窗户等等) ---他们没有提到SSL。它说,如果 HTTPS用,将需要设置一个服务器证书.这将是一个一个的线性设置和 HttpListener 图出的休息吗?

总之,我需要知道如何设置的证书和如何修改的代码实施SSL。

虽然它不发生,当我试图访问HTTPS,我没有通知中的错误我的系统活动日志源"频道"以及消息的内容是:

一个致命的错误发生在尝试 访问SSL server凭证 私人钥匙。返回的错误代码 从加密模块是 0x80090016.

编辑:
迄今为止采取的步骤

  • 建立了一个工作HTTPListener在C#工作HTTP连接(例如"http://localhost:8089/foldername/"
  • 创建了一个证书的使用makecert.exe
  • 加入证书是可信的使用certmgr.exe
  • 使用Httpcfg.exe 听上的SSL连接的试验港口(例如8090)
  • 加入口8080的HTTPListener通过的监听。前缀。添加(https://localhost:8090/foldername/");
  • 测试了一种HTTP客户连接,例如(http://localhost:8089/foldername/")在浏览器和接收返回正确的
  • 测试HTTPS客户连接,例如(http://localhost:8090/foldername/")在一浏览器,并收到"数据传输中断"(Firefox)
  • visual studio进行调试显示,该监听器回收的要求从来没有被击中时HTTPS connection开始-我没看到任何地方,我可以设置一个断点赶上其他任何更早。
  • 您显示,收听的端口是开放HTTPS和HTTP。HTTPS口不去TIME_WAIT后一个连接的企图。
  • 提琴手HTTPAnalyzer 抓不到任何交通的,我猜它没有得到足够远的过程中显示出来,在这些HTTP分析工具

的问题

  • 什么问题是什么?
  • 是有一块。净码我丢失(这意味着我必须做更多的在C#他不是简单地添加一个前缀的监听器这点HTTPS,这是我做了什么)
  • 有一个错过了一个结构的步骤的地方吗?
  • 还有什么我能做的分析的问题?
  • 是的错误信息系统事件日志的一个标志的问题?如果是这样怎么会是固定的?

没有正确的解决方案

其他提示

我有一个类似的问题,并且似乎有可能是一个问题与证书本身。

这里的道路,为我工作:

makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine

然后看看达证书 拇指指纹, 复制它的剪贴板和去除空间。这将是一个参数后h在下命令:

HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755

然后运行服务的主机上 https://localhost:801/ 它完美的作品。

什么我不能做的工作是为https上运行的自身产生的证书。这里的代码我运行产生的一个(错误的处理采取了清楚起见):

LPCTSTR pszX500 = subject;
DWORD cbEncoded = 0;
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
pbEncoded = (BYTE *)malloc(cbEncoded);
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);

// Prepare certificate Subject for self-signed certificate
CERT_NAME_BLOB SubjectIssuerBlob;
memset(&SubjectIssuerBlob, 0, sizeof(SubjectIssuerBlob));
SubjectIssuerBlob.cbData = cbEncoded;
SubjectIssuerBlob.pbData = pbEncoded;

// Prepare key provider structure for self-signed certificate
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = NULL;
KeyProvInfo.dwProvType = PROV_RSA_FULL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_SIGNATURE;

// Prepare algorithm structure for self-signed certificate
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
memset(&SignatureAlgorithm, 0, sizeof(SignatureAlgorithm));
SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA;

// Prepare Expiration date for self-signed certificate
SYSTEMTIME EndTime;
GetSystemTime(&EndTime);
EndTime.wYear += 5;

// Create self-signed certificate
pCertContext = CertCreateSelfSignCertificate(NULL, &SubjectIssuerBlob, 0, &KeyProvInfo, &SignatureAlgorithm, 0, &EndTime, 0);
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");
CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0);

证书的出现和它有一个工作的私人钥匙,但https将超时,如果指纹是从来没有注册。如果有人知道为什么-请评论

EDIT1:后一些玩弄,我们发现的初始化CertCreateSelfSignCertificate其产生适当证书:

CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = _T("Microsoft RSA SChannel Cryptographic Provider");
KeyProvInfo.dwProvType = PROV_RSA_SCHANNEL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;

你只需要结合一证书为一个ip:港口,然后打开你的听众https://前缀。0.0.0.0的适用于所有知识产权。标识是任何随机的GUID,certhash是哈希证书(有时称为thumprint).

运行下面cmd.exe 使用管理员权限。

netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b  appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}

如果你想要创建一个自签发的证书,以测试这个,

  1. 打开IIS
  2. 点击计算机上的名字
  3. 击服务器证书的图标
  4. 点击产生自签证书
  5. 双击和去向的细节
  6. 你会看到的指纹没有,只是删除的空间。

    HttpListener listener = new HttpListener();
    listener.Prefixes.Add("https://+:1234/");
    listener.Start();
    Console.WriteLine("Listening...");
    HttpListenerContext context = listener.GetContext();
    
    using (Stream stream = context.Response.OutputStream)
    using (StreamWriter writer = new StreamWriter(stream))
        writer.Write("hello, https world");
    
    Console.ReadLine();
    

之后在运行这个计划我只是导航 https://localhost:1234 看到该文本的印刷。由于证书CN不相匹配的网址,它是不可信的证书店,你将获得证书的警告。该文本是加密但是你可以核实与这样的工具丝鲨鱼。

如果你想要更多的控制权创建自签署x509certificate openssl是一个伟大的工具,并且有是一个端口。我已经有很多更多的成功与它比makecert工具。


它也是非常重要到如果你是连通https服务代码,有一个ssl警告,必须设置证书的验证程序上的服务点管理绕过它用于测试目的。

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;

我没有完全实现,但这个网站似乎给一个 好的演练 设立该证书和代码。

这里是另一种方式来结合SSL certifiate到IP/口组合,而不使用 httpcfg.exe (XP)或 netsh.exe (Vista+).

http://dotnetcodebox.blogspot.com.au/2012/01/how-to-work-with-ssl-certificate.html

它的要旨是,可以使用C++ HttpSetServiceConfiguration API在建成windows做到这一通过程序,而不是通过命令行,因此,除去依赖的操作系统和具有httpcfg安装。

类文件

有这个注:

如果创建HttpListener使用 https,你必须选择一个服务器 证书的听众。否则,一个HttpWebRequest查询的 这HttpListener将失败的一个 意想不到的紧密连接。

和这个:

你可以配置服务器证书 和其他听众的选项,通过使用 HttpCfg.exe。看看 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp 更多的细节。可执行的是 附带的Windows服务器2003,或 可以建立从来源的代码 提供平台SDK。

是第一个注解释第二个吗?中概述的问题,我用httpcfg.exe 绑定的证书要一个特定的港口。如果他们想的东西除了这个,说明是模糊的。

我遇到了同样的问题。幸运的是,后搜索硬的步骤 这页 让SSL工作与我HttpListener.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top