- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
调用 InitializeSecurityContext
时,我应将什么值传递给TargetName
参数?
修改后的背景
我正在调用 InitializeSecurityContext
函数:
InitializeSecurityContextA(
@pAS.hcred, //[in] credentials
phContext, //[in] optional] Context handle structure
pszTargetName, //[in, optional] Target name
0, //[in] context requirements
0, //[in] reserved1, must be zero
SECURITY_NATIVE_DREP, //[in] target data representation
pInput, //[in] optional] SecBufferDescription
0, //[in] reserved2, must be zero
@pAS.hctxt, //[in, out] pointer to context handle structure
@OutBuffDesc, //[in, out] pointer to SecBufferDesc
ContextAttributes, //[out] context attributes
@lifetime); //[out] expiration timestamp
pszTargetName
吗?
null
:InitializeSecurityContextA(@pAS.hcred, phContext, null, ...);
""
:InitializeSecurityContextA(@pAS.hcred, phContext, "", ...);
"spn/HOSTNAME"
:InitializeSecurityContextA(@pAS.hcred, phContext, "spn/HOSTNAME", ...);
spn/HOSTNAME.DOMAIN.COM
:InitializeSecurityContextA(@pAS.hcred, phContext, "spn/HOSTNAME.DOMAIN.COM", ...);
"cargocult/PROGRAMMING"
:InitializeSecurityContextA(@pAS.hcred, phContext, "cargocult/PROGRAMMING", ...);
"http/TFS.DOMAIN.COM"
:InitializeSecurityContextA(@pAS.hcred, phContext, "http/TFS.DOMAIN.COM", ...);
"http/HOSTNAME"
:InitializeSecurityContextA(@pAS.hcred, phContext, "http/HOSTNAME", ...);
"qwertyasdf"
:InitializeSecurityContextA(@pAS.hcred, phContext, "qwertyasdf", ...);
"AuthSamp"
:InitializeSecurityContextA(@pAS.hcred, phContext, "AuthSamp", ...);
domain.com
,甚至
hostname.domain.com
,甚至
qwertyasdf
。因此,对于这些尝试失败我并不感到惊讶。但是人们说尝试
http/HOSTNAME
之类的东西,所以我放入
http/HOSTNAME
。
InitializeSecurityContext
(Negotiate)函数具有可选的
TargetName
参数:
pszTargetName [in, optional]
A pointer to a null-terminated string that indicates the service principal name (SPN) or the security context of the destination server.
Applications must supply a valid SPN to help mitigate replay attacks.
Boolean ValidateCredentials(String username, String password, String domain)
{
...
}
InitializeSecurityContext
。
InitializeSecurityContext
的参数之一是“TargetName”字符串。
VERIFIER STOP 00005003: pid 0xF08:
InitializeSecurityContext uses NULL target or malformed target for Kerberos service.
Please see pszTargetName for the value of the target.
00000000 : Not used.
00000000 : Not
Negotiate
提供程序将尝试使用
Kerberos
会有所帮助,但会回退到
NTLM
。对于
Negotiate
,
Kerberos
或
NTLM
,
TargetName
参数
is documented to be:
Service principal name (SPN) or the security context of the destination server.
NULL
):
How to validate user credentials on Microsoft operating systems
ss = _InitializeSecurityContext(
&pAS->hcred,
pAS->fInitialized ? &pAS->hctxt : NULL,
NULL, //<-------pszTargetName
0,
0,
SECURITY_NATIVE_DREP,
pAS->fInitialized ? &sbdIn : NULL,
0,
&pAS->hctxt,
&sbdOut,
&fContextAttr,
&tsExpiry);
NULL
)不起作用。
"AuthSamp"
作为目标,但也失败了。
service principal name
(SPN) The name by which a client uniquely identifies an instance of a service. If you install multiple instances of a service on computers throughout a forest, each instance must have its own SPN. A given service instance can have multiple SPNs if there are multiple names that clients might use for authenticationsecurity context
The security attributes or rules that are currently in effect. For example, the current user logged on to the computer or the personal identification number entered by the smart card user. For SSPI, a security context is an opaque data structure that contains security data relevant to a connection, such as a session key or an indication of the duration of the session.
The Verifier plug detects the following errors:
The NTLM package is directly specified in the call to AcquireCredentialsHandle (or higher level wrapper API).
The target name in the call to InitializeSecurityContext is NULL.
The target name in the call to InitializeSecurityContext is not a properly-formed SPN, UPN or NetBIOS-style domain name.
The latter two cases will force Negotiate to fall back to NTLM either directly (the first case) or indirectly (the domain controller will return a “principal not found” error in the second case causing Negotiate to fall back).
The plug-in also logs warnings when it detects downgrades to NTLM; for example, when an SPN is not found by the Domain Controller. These are only logged as warnings since they are often legitimate cases – for example, when authenticating to a system that is not domain-joined.
null
(因为我不知道计算机的域名,甚至没有域)。但是,如果硬编码我的开发计算机的域名,结果是相同的。
null
""
"AuthSamp"
"qwertyasdf"
"avatopia.com"
)"avatopia.com"
)"avatopia.com"
)"http/HOSTNAME"
"http/TFS.DOMAIN.COM"
"frob/GROBBER"
"cargocult/PROGRAMMING"
"spn/HOSTNAME"
"spn/HOSTNAME.DOMAIN.COM"
"ian"
"pass1"
ian
可以是
本地帐户,也可以是
域帐户。您需要先确定
ian
是本地帐户还是域帐户,然后才能提出要求。这是因为
ian
可以拥有
两个帐户:
ian
stackoverflow.com
ian
stackoverflow.com
)或"."
)Username Password Domain Machine on domain? Validate as
======== ======== ================= ================== ==============
iboyd pass1 . No Local account
iboyd pass1 (empty) No Local account
iboyd pass1 stackoverflow.com No Domain account
iboyd pass1 . Yes Local account
iboyd pass1 (empty) Yes Domain account
iboyd pass1 stackoverflow.com Yes Domain account
TURBOENCABULATOR
。我指定了我想通过对我的用户名加上前缀作为
TURBOENCABULATOR
域的身份验证:
TURBOENCABULATOR\ian
pszTarget
参数?几乎可以肯定,我输入的凭据将无效。
Windows 如何确定它们是否有效?
Windows 将调用什么API来验证credentails?
TURBOENCABULATOR
域,而是尝试通过将该域添加到我的用户名
turboencabulator.com
来连接到
turboencabulator.com\ian
域:
pszTargetName
参数传递什么?
turboencabulator.com
域,而是尝试连接到
turboencabulator.net
域:
turboencabulator.net
域,而是尝试通过用
.\
为我的用户名添加前缀来验证用户是否为本地(计算机)帐户:
pszTargetName
传递什么值?
TargetName
来验证一组凭据时,我使用什么
InitializeSecurityContext
?
Why the NTLM Plug-in is Needed
NTLM is an outdated authentication protocol with flaws that potentially compromise the security of applications and the operating system. The most important shortcoming is the lack of server authentication, which could allow an attacker to trick users into connecting to a spoofed server. As a corollary of missing server authentication, applications using NTLM can also be vulnerable to a type of attack known as a “reflection” attack. This latter allows an attacker to hijack a user’s authentication conversation to a legitimate server and use it to authenticate the attacker to the user’s computer. NTLM’s vulnerabilities and ways of exploiting them are the target of increasing research activity in the security community.
Although Kerberos has been available for many years many applications are still written to use NTLM only. This needlessly reduces the security of applications. Kerberos cannot however replace NTLM in all scenarios – principally those where a client needs to authenticate to systems that are not joined to a domain (a home network perhaps being the most common of these). The Negotiate security package allows a backwards-compatible compromise that uses Kerberos whenever possible and only reverts to NTLM when there is no other option. Switching code to use Negotiate instead of NTLM will significantly increase the security for our customers while introducing few or no application compatibilities. Negotiate by itself is not a silver bullet – there are cases where an attacker can force downgrade to NTLM but these are significantly more difficult to exploit. However, one immediate improvement is that applications written to use Negotiate correctly are automatically immune to NTLM reflection attacks.
By way of a final word of caution against use of NTLM: in future versions of Windows it will be possible to disable the use of NTLM at the operating system. If applications have a hard dependency on NTLM they will simply fail to authenticate when NTLM is disabled.
How the Plug-in Works
The Verifier plug detects the following errors:
The NTLM package is directly specified in the call to AcquireCredentialsHandle (or higher level wrapper API).
The target name in the call to InitializeSecurityContext is NULL.
The target name in the call to InitializeSecurityContext is not a properly-formed SPN, UPN or NetBIOS-style domain name.
The latter two cases will force Negotiate to fall back to NTLM either directly (the first case) or indirectly (the domain controller will return a “principal not found” error in the second case causing Negotiate to fall back).
The plug-in also logs warnings when it detects downgrades to NTLM; for example, when an SPN is not found by the Domain Controller. These are only logged as warnings since they are often legitimate cases – for example, when authenticating to a system that is not domain-joined.
NTLM Stops
5000 – Application Has Explicitly Selected NTLM Package
Severity – Error
The application or subsystem explicitly selects NTLM instead of Negotiate in the call to AcquireCredentialsHandle. Even though it may be possible for the client and server to authenticate using Kerberos this is prevented by the explicit selection of NTLM.
How to Fix this Error
The fix for this error is to select the Negotiate package in place of NTLM. How this is done will depend on the particular Network subsystem being used by the client or server. Some examples are given below. You should consult the documentation on the particular library or API set that you are using.
APIs(parameter) Used by Application Incorrect Value Correct Value
===================================== =============== ========================
AcquireCredentialsHandle (pszPackage) “NTLM” NEGOSSP_NAME “Negotiate”
最佳答案
伊恩(Ian),我想我们仍然不明白您要做什么。为了帮助您向我们提供有关您要执行的操作的更多信息,以下是有关SSPI的一些背景知识。您可能已经知道这一点,但只是为了确保我们在同一页面上。
SSPI通常用于通过网络对用户进行身份验证。客户端调用AcquireCredentialsHandle
以获得凭据句柄,然后通过调用InitializeSecurityContext
创建安全上下文。将安全缓冲区传递给服务器。请注意,SSPI并不决定如何传递安全缓冲区。您可以随意使用http,tcp,命名管道。服务器收到安全缓冲区后。同样,它首先调用AcquireCredentialsHandle
。然后,它将接收到的安全缓冲区传递给AcceptSecurityContext
并生成新的安全缓冲区。在某些情况下,新生成的安全缓冲区需要发送回客户端,然后客户端将其传递给InitializeSecurityContext并再次生成另一个新的安全上下文。此SSPI握手过程将继续进行,直到InitializeSecurityContext
和AcceptSecurityContext
都返回SEC_E_OK
尽管SSPI是为通过网络进行身份验证而设计的,但实际上许多应用程序都在进行环回SSPI握手,这意味着客户端和服务器都在同一盒中。这实际上只是网络身份验证的一种特殊情况。回送SSPI握手的最终结果是经过身份验证的SSPI安全上下文。使用此经过身份验证的SSPI,应用程序可以执行QueryContextAttributes
和ImpersonateSecurityContext
。由于您似乎不知道targetName
是什么意思,我猜您正在尝试进行回送握手。虽然我可能是错的,但您需要告诉我们您要做什么。
要了解为什么在Kerberos中需要targetName
而不在NTLM中需要credentials
,则需要了解一些其他基础实现。
有两种不同的方式来获取凭据句柄。通常,人们会指定使用当前的安全上下文。 (即您用来登录计算机的帐户)。您还可以提供另一组用户名/密码。不同的安全软件包对InitializeSecurityContext
的含义不同。 NTLM表示它将保存密码的哈希值。 Kerberos意味着它将保存票证授予票证(TGT)。对于SSPI程序员而言,您不必为此担心。
现在,当客户端将获取的凭据句柄传递到InitializeSecurityContext
时,类似地,不同的安全包将做不同的事情。 NTLM将在第一个InitializeSecurityContext
调用上生成一个NEGOTIATE数据包。生成NEGOTITATE数据包的过程中没有其他机器。 Kerberos软件包非常不同。将与KDC对话以请求所请求服务的服务票证。该服务由Kerberos中的服务主体名称(SPN)标识。我无法在这里涵盖所有细节。网络是针对NTLM的服务请求未定目标,而针对Kerberos的服务请求则定目标。您可以使用NTLM身份验证方法将相同的NTLM NEGOTIATE数据包用于不同的服务。但是,对于使用Kerberos身份验证方法的不同服务,您需要使用不同的Kerberos服务票证。这就是为什么在为Kerberos / Negotiate调用targetName
时,需要提供servicePrincipalName
的原因。
当KDC收到服务票证请求时,它将在其LDAP数据库上进行搜索,并找出哪个帐户与指定的AcquireCredentialsHandle
关联。该帐户可以是AD用户帐户或AD计算机帐户。 KDC将使用目标服务帐户的主密钥(由帐户密码生成)来加密 session 密钥。此加密的 session 密钥将稍后从客户端传递到服务器。
现在,还记得我说过服务器还需要执行domain\jane
的问题,并且我说过有两种主要方法来获取凭据处理吗?我想您正在使用第一种方法来获取凭据句柄。这意味着它将使用当前的安全上下文。在正常的网络身份验证情况下,可以通过以下示例进行说明。如果您的服务器是HTTP服务器,它将是IIS服务器的服务帐户。 IIS服务器将使用其服务帐户主密钥来解密加密的 session 密钥。一旦获得 session 密钥,客户端和服务器就可以使用 session 密钥继续进行通信以进行加密和解密。
如果是环回SSPI方案,则比较棘手。如果您正在运行AcquireCredentialsHandle
并自己循环回去。您需要为domain \ jane指定一个SPN。什么是domain \ jane的SPN。如果检查AD用户对象,则默认情况下没有任何对象。您需要手动修复它。
曾经有一件事情对我有用,但是没有记载。您可以将用户的UPN(即jane@domain.com)指定为SPN。这对我有用。你可以尝试一下。
如果那不起作用,另一种解决方法是使用第二种方法来处理服务器部分domain\jane
。您可以指定另一个服务帐户凭据,而不是使用InitializeSecurityContext
凭据句柄。您可以确保该服务帐户设置了正确的SPN。然后,您可以在ojit_code中使用该服务帐户的SPN。当然,这也意味着您需要在代码中对服务帐户的密码进行硬编码。您需要小心并确保完全锁定此服务帐户,以便即使密码被盗,您的AD环境也不会受到很大的威胁。
关于security - 调用InitializeSecurityContext(协商)时要使用什么TargetName?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9788318/
问题 调用 InitializeSecurityContext 时,我应将什么值传递给TargetName参数? 修改后的背景 我正在调用 InitializeSecurityContext 函数:
尝试让信号器启动并运行。我不断从服务器返回 2 个错误: GET negotiate url 返回 500 内部服务器错误 XMLHttpRequest 无法加载 http://localhost:1
我使用的是 Windows XP Pro SP3。我想在我的代码中使用 SSPI 函数。我编译了我的代码,没有错误。 我将安全包设置为用于协商,这是推荐的。 当我启动我的程序时,Negotiate 无
我正在尝试使用 C++ 和 QT 作为 GUI 来实现 Telnet 客户端。我不知道如何处理 telnet 协商。每个 telnet 命令都以 IAC 开头,例如 IAC WILL SUPPRESS
我正在使用 SignalR 2.0。在我的 VS 2012 上本地运行时一切正常。但是当我在 IIS 上发布站点时,它会中断。该站点已加载,但其中一个脚本返回 404 Not Found。脚本有点像。
我在 MS Azure 上配置了一个实例,并为域实现了 SSL 证书。当我测试性能(在 3G 上)时,我注意到 SSL 协商同时发生在两个请求上,这(不必要地)延长了过程并导致 0.6 秒的时间完成。
我有以下问题。 操作系统:CentOS 6.6 PHP:5.5 Curl: 7.43 编译 当我执行“curl -V”时,我得到以下信息: curl 7.43.0 (x86_64-unknown-li
有一个私有(private)网络服务器(支持 https),我需要经常在上面读取/设置一些信息。我做了一些java代码来自动完成。当我使用 Chrome 访问它时,第一次连接很慢(可能 5 秒),但持
我使用的是 IIS7,我们所有的文件都是通过 HTTPS 提供的。在查看瀑布 View (WebPageTest) 时,我注意到对每个文件进行 SSL 协商需要一些时间。有没有一种方法可以配置服务器或
我有一个简单的 SMTP 客户端,我正在尝试向其添加 TLS 支持。我不确定客户端发出“STARTTLS”命令后会发生什么。大多数来源(包括 RFC 本身)将其描述为 TLS session 的协商,
我一直在尝试在 IIS 托管的网站中使用 service worker 来缓存站点的一些静态内容。该站点是使用 Windows 身份验证的内部应用程序。我已经能够在没有太多麻烦的情况下注册和运行 se
我开始修补 Azure SignalR,并遇到了协商触发器问题。我关注了this微软官方指南: 这是我的代码: 本地.settings.json { "IsEncrypted": false,
Index.cshtml @{ ViewBag.Title = "Index"; } $(function () { var connection = $.connection('
Index.cshtml @{ ViewBag.Title = "Index"; } $(function () { var connection = $.connection('
我正在使用 openssl 正常连接到 SMTP 服务器(未加密),发送 STARTTLS 命令,协商 SSL 加密,然后与加密 session 交互。 这是我正在使用的命令(通过 telnet):
我正在为 iOS 进行 unix 服务器 ssh 模拟。在谈判过程中,我遇到了很多障碍,并且仍在与这些障碍作斗争。最新的一个是关于 SSH2_MSG_KEX_DH_GEX_REPLY 数据包数据,我在
我们有两个连接(作为 .NET/Windows 客户端)到 IBM MQ 端点(假设是非 Windows)。 我们使用 SSL,它由一对证书(客户端和服务器)支持并在 Windows 证书存储中正确标
我读到 ejabberd 建议使用 STARTTLS 协商来实现通信实体之间的安全连接。当我安装 ejabberd 时,默认情况下它带有 TLS 证书。 那为什么要买证书安装呢?既然我们有默认证书,从
您好,我正在尝试使用 JAVA 和 spring 设置 SSO。为此,我正在使用此文档:http://docs.spring.io/spring-security-kerberos/docs/1.0.
从阅读 Microsoft docs在使用 SignalR 进行身份验证时,使用不记名 token 进行身份验证的唯一方法似乎是将其发送到 WebSocket 连接上的查询字符串中。 在检查 Sign
我是一名优秀的程序员,十分优秀!