我有一个ASP.NET应用程序访问证书存储区中的证书中的私钥.在Windows Server 2003上,我能够使用winhttpcertcfg.exe来授予对NETWORK SERVICE帐户的私钥访问权限.如何授予访问IIS 7.5网站中Windows Server 2008 R2上的证书存储(本地计算机\个人)中的证书中的私钥的权限?
我尝试使用证书MMC(Server 2008 R2)为"Everyone","IIS AppPool\DefaultAppPool","IIS_IUSRS"以及我能找到的每个其他安全帐户提供完全信任访问权限.但是,下面的代码演示了代码无法访问使用私钥导入的证书的私钥.每次访问私钥属性时,代码都会抛出并抛出错误.
Default.aspx的
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="repeater1" runat="server">
<HeaderTemplate>
<table>
<tr>
<td>
Cert
</td>
<td>
Public Key
</td>
<td>
Private Key
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#((X509Certificate2)Container.DataItem).GetNameInfo(X509NameType.SimpleName, false) %>
</td>
<td>
<%#((X509Certificate2)Container.DataItem).HasPublicKeyAccess() %>
</td>
<td>
<%#((X509Certificate2)Container.DataItem).HasPrivateKeyAccess() %>
</td>
</tr> …
我想通过命令行设置代理,我发现的第一件事是你必须运行具有管理员权限的命令行 - 然后基本代理集将是:
netsh winhttp set proxy SERVER:PORT
Run Code Online (Sandbox Code Playgroud)
这很好用,但我也想添加一个登录名.你可以看到我尝试过使用netsh-> winhttp,但是手册没有说明登录部分,所以我试过:
netsh winhttp set proxy user:password@SERVER:PORT
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不起作用.是否有可能在netsh-> winhttp中实现这样的目标?
如果是这样,怎么样?如果不是=>我应该遵循哪些Windows命令?
或者这更容易̶a̶c̶h̶i̶e̶v̶e̶a̶b̶l̶e̶通过一些WINDOWSAPI̶(例如,使用C/C + +̶̶)̶?̶
感谢您的帮助,如果不清楚,请随时提出任何问题.
使用:Windows 7,cmd.exe,netsh-> winhttp
编辑:这看起来像C++方式:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383144(v=vs.85).aspx,但更好的方式C++可能会去这样:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385384(v = vs.85).aspx#general_option, - 所以剩下的问题是如何在命令行中实现这一点(甚至更好的命令行 - > netsh-> winhttp)?
就在我终于理解了Msxml2.XMLHTTP和Msxml2.ServerXMLHTTP之间的区别时
http://support.microsoft.com/kb/290761
XMLHTTP专为客户端应用程序而设计,依赖于基于Microsoft Win32 Internet(WinInet)构建的URLMon.ServerXMLHTTP专为服务器应用程序而设计,依赖于新的HTTP客户端堆栈WinHTTP.ServerXMLHTTP提供可靠性和安全性,并且是服务器安全的.有关更多信息,请参阅MSXML软件开发工具包(SDK)文档.
我突然发现WinHttp.WinHttpRequest ......
http://msdn.microsoft.com/en-us/library/aa382925(VS.85).aspx
Microsoft Windows HTTP服务(WinHTTP)为开发人员提供了HTTP/1.1 Internet协议的服务器支持的高级接口.WinHTTP主要用于与HTTP服务器通信的服务器应用程序,主要用于基于服务器的方案.
那么,这与Msxml2.ServerXMLHTTP有何不同?
(好吧,隐含的问题是我应该使用哪一个...)
xmlhttprequest serverxmlhttp winhttp httpwebrequest winhttprequest
我们的应用程序使用libcurl for HTTP,我们希望能够访问Internet Explorer的代理设置.早期的Stack Overflow问题建议我们使用WinHttpGetIEProxyConfigForCurrentUser
和WinHttpGetProxyForUrl
.
遗憾的是,winhttp.h
我们的副本Visual C++ 2005或Visual Studio 2008似乎没有包含标题.显然,可以下载更新的Platform SDK并将其安装在Visual C++ 2005中,但这是一个非常痛苦的过程,它不会不一定适用于较新版本的Visual Studio.
是否有一种良好的,受到良好支持的方式从C++访问WinHTTP 5.1 API?或者我们应该避免使用这些API?
我知道如何下载html/txt页面.例如 :
//Variables
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
vector <string> vFileContent;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"nytimes.com",
INTERNET_DEFAULT_HTTP_PORT, 0);
// Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"GET", L"/ref/multimedia/podcasts.html",
NULL, WINHTTP_NO_REFERER,
NULL,
NULL);
// …
Run Code Online (Sandbox Code Playgroud) msdn上的此页面包含可能在WinHTTP中使用的HTTP状态代码的定义.有没有办法从WinHttp中的请求中检索HTTP状态代码?
我发现获取响应文本的唯一方法是调用WinHttpQueryHeaders
,它返回HTTP响应,如下所示:
HTTP/1.1 404 Not Found
Date: Wed, 28 May 2014 08:20:29 GMT
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
Run Code Online (Sandbox Code Playgroud)
我是否必须自己解析此字符串以获取状态代码,或者WinHttp已经提供了某种方法来执行此操作?
请告知Delphi XE中是否有WinHTTP包装器
按优先顺序排列:
解:
由于评论不允许格式化代码,我在问题中粘贴了解决方案:
const
winhttpdll = 'winhttp.dll';
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
WINHTTP_FLAG_REFRESH = $00000100;
WINHTTP_FLAG_SECURE = $00800000;
WINHTTP_ADDREQ_FLAG_COALESCE = $40000000;
WINHTTP_QUERY_FLAG_NUMBER = $20000000;
function WinHttpOpen(pwszUserAgent: PWideChar; dwAccessType: DWORD;
pwszProxyName, pwszProxyBypass: PWideChar; dwFlags: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpConnect(hSession: HINTERNET; pswzServerName: PWideChar;
nServerPort: INTERNET_PORT; dwReserved: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpOpenRequest(hConnect: HINTERNET; pwszVerb: PWideChar;
pwszObjectName: PWideChar; pwszVersion: PWideChar; pwszReferer: PWideChar;
ppwszAcceptTypes: PLPWSTR; dwFlags: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpCloseHandle(hInternet: HINTERNET): BOOL; stdcall; external winhttpdll; …
Run Code Online (Sandbox Code Playgroud) 我似乎遇到了这个问题,并且本着一个可以被其他人引用的通用问题的精神,我正在寻找一个使用SSL的好例子.
更具体地说,我从WinHttpSendRequest获取错误0x00002F8F,这是ERROR_INTERNET_DECODING_FAILED(这向我表明它是一个证书错误).我已经在这台机器上导入了证书,并且能够在没有证书错误的情况下在IE中启动页面.
TLDR:如何将WinHTTP与自签名证书一起使用?
我有一个.NET Windows服务,它调用cdb.exe来分析崩溃转储.我想在需要时使用以下参数自动从http://msdl.microsoft.com下载符号:
-y srv*c:\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)
如果我将应用程序作为控制台应用程序运行,它按预期工作,并为每个转储下载所需的符号.
问题是,当我将应用程序作为Windows服务启动时,符号不会被下载,如果我打开symnoisy,在cdb的输出日志中,我有一个条目,表示在http:/处找不到该符号/msdl.microsoft.com
所以,我使用嗅探器检查了它,有趣的是,当作为服务运行时,没有请求微软符号服务器.
谷歌搜索了一下,我发现我不是唯一一个有这个问题的人,似乎问题是当一个应用程序作为Windows服务运行时,它使用winHTTP库来进行http请求,而不是wininet,我认为是问题的根源:http://support.microsoft.com/kb/238425
所以,我不知道为什么,cdb无法使用winHTTP库连接到ms符号服务器,我需要一种强制cdb默认使用wininet的方法.
任何人都知道这个问题的解决方法?
我正在尝试使用vba WinHttp.WinHttpRequest向kigo的api发出请求,我能够发送请求,但WinHttpRequest在发送请求时更改添加Charset = UTF-8的内容类型,其中kigo的api返回415错误.
我像这样设置内容类型
web_Http.SetRequestHeader "Content-Type", "application/json"
Run Code Online (Sandbox Code Playgroud)
但当我在Wireshark中查看请求时,内容类型就是这样的
Content-Type: application/json; Charset=UTF-8
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我找到了这个,这与我的问题类似,但我不明白解决方案.