标签: schannel

Microsoft Windows上的DisabledByDefault和Enabled SSL/TLS注册表项之间有什么区别?

Microsoft提供传输层安全性(TLS)的最佳实践指南.本文档介绍了可以启用或禁用特定协议的注册表项.

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-schannel-protocols-in-the-windows-registry

例如,要启用TLS 1.2,您可以添加以下注册表项.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:FFFFFFFF

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

DisabledByDefault和之间有什么区别Enabled?他们似乎多余.

windows ssl schannel

11
推荐指数
2
解决办法
5705
查看次数

如何将OpenSSL密钥文件导入Windows证书库

我有一个OpenSSL生成的PEM格式的X.509证书和它的关联密钥文件.连接到原型服务器时,此证书是身份验证所必需的.这在Linux上运行良好.我一直在使用Microsoft SChannel API来驱动Windows平台上的SSL/TLS连接,但我想使用相同的测试证书.我可以右键单击证书文件并将其导入我的证书库,但我相信私钥不会随之导入(即使我已将它们连接到同一文件中).

当我去运行SChannel代码时,我在初始化安全上下文时(通过InitializeSecurityContext)收到'SEC_E_NO_CREDENTIALS'错误.我怀疑这意味着缺少私钥.

有谁知道如何测试位于个人(或"我的")证书存储区中的证书中是否存在私钥,通过'certmgr.msc'进行访问?是否可以在商店中导入证书的新密钥文件?

任何见解或建议将不胜感激.

windows openssl schannel x509

10
推荐指数
1
解决办法
5万
查看次数

使用SCH_CRED_FORMAT_CERT_HASH时,AcquireCredentialsHandle在内核模式下失败

我叫AcquireCredentialsHandle在内核驱动程序,传递SCHANNEL_CREDdwCredFormat设置为SCH_CRED_FORMAT_CERT_HASH.它失败了SEC_E_NO_CREDENTIALS.这是我的代码:

BYTE certHashBytes[20] = { 0x6d,0x64,0xed,0x56,0xd2,0x94,0x15,0xf4,0x49,0x08,0xaf,0x18,0xf1,0xca,0xf5,0xa2,0xc8,0x01,0x20,0x96 };
CredHandle credHandle;
RtlZeroMemory(&credHandle, sizeof(CredHandle));

SCHANNEL_CRED schannelCred;
RtlZeroMemory(&schannelCred, sizeof(SCHANNEL_CRED));
schannelCred.dwVersion = 4;
schannelCred.cCreds = 1;
schannelCred.paCred = certHashBytes;
schannelCred.dwCredFormat = 1;

UNICODE_STRING unispName;
RtlUnicodeStringInit(&unispName, L"Microsoft Unified Security Protocol Provider");
TimeStamp ts;

SECURITY_STATUS res = AcquireCredentialsHandle(NULL, &unispName, SECPKG_CRED_INBOUND, NULL, &schannelCred, NULL, NULL, &credHandle, &ts);
DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_INFO_LEVEL, "AcquireCredentialsHandle %x\n", res);
Run Code Online (Sandbox Code Playgroud)

我的证书哈希肯定是正确的,并且在MY商店中正确安装,用于用户帐户和本地计算机.我知道这是因为它在用户模式下工作正常,如下所示:

HCERTSTORE certStore = CertOpenSystemStore(NULL, L"MY");
BYTE certHashBytes[20] = { 0x6d,0x64,0xed,0x56,0xd2,0x94,0x15,0xf4,0x49,0x08,0xaf,0x18,0xf1,0xca,0xf5,0xa2,0xc8,0x01,0x20,0x96 };
CERT_NAME_BLOB certHash { 20, …
Run Code Online (Sandbox Code Playgroud)

c c++ schannel wdk kmdf

8
推荐指数
1
解决办法
257
查看次数

SChannel 从内存存储发送中间证书链

我正在使用 SChannel TLS 的服务器。我使用 SCHANNEL_CRED 和 AcquireSecurityCredentials 创建安全凭证,然后将这些凭证传递给 AcceptSecurityContext。似乎一切正常,但如果最终证书不在系统或用户证书存储中,SChannel 将不会发送中间证书。我希望它从内存存储发送证书,但这似乎不起作用。有没有办法指定临时中间证书而不将其添加到永久存储中?

ssl schannel

7
推荐指数
0
解决办法
231
查看次数

Libcurl停止工作,SSL连接错误

我正在制作个人使用的程序,定期擦除几个网页.其中一个需要使用SSL,其主URL实际上是一个负载均衡器,每次重定向到一个不同的域,从少数列表中(不确定这是否相关).我对libcurl和SSL很新,所以我可能会遗漏一些明显但我不这么认为的东西.

该程序运行良好一段时间(到目前为止,从不超过一个小时),但一旦它第一次得到SSL连接错误,它将每次都给出相同的错误.在开始失败之前,它总是一个不同的时间量和不同数量的成功请求.

错误缓冲区始终包含以下内容: schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326) - This error usually occurs when a fatal SSL/TLS alert is received (e.g. handshake failed). More detail may be available in the Windows System event log.

没有什么用处eventvwr.对该错误代码的搜索会返回有关早期版本的Windows Server上的自签名证书问题的结果,但很少有其他问题.我不控制我正在连接的服务器,但我怀疑它是一个Windows框.

我在这里已经没有想法,所以我只是要提供任何可能相关的细节.我不能真正发布任何实际的源代码,因为我已经在几个类中抽象了所有的curl调用,所以我必须粘贴很多样板代码才能让别人理解它.我已经使用Visual Studio调试器确认这是实际调用的结果.

在创建任何其他线程之前,我在主线程中初始化libcurl,如下所示: curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

然后我在第二个线程中创建并初始化实际的curl句柄,并且仅在该线程中,如下所示:

m_handle = curl_easy_init();
curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, write);
curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, this);
curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, debug);
curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(m_handle, CURLOPT_ERRORBUFFER, &m_errormsg[0]);
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_handle, CURLOPT_COOKIEFILE, "");
Run Code Online (Sandbox Code Playgroud)

我已经尝试过同时设置CURLOPT_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYPEER为0,但是这并没有帮助.

我内置的libcurl从curl-7.43.0.tar.gz …

c++ ssl winapi schannel libcurl

7
推荐指数
1
解决办法
1485
查看次数

在访问SSRS管理时,可以选择0个客户端证书.

环境:

在安装了.Net 4.6.1并启用.Net 3.5的Windows 2008服务器上运行SQL Server 2008 R2 SP3上运行的Reporting Services.本地计算机中的IIS,数据库和报告服务(不同计算机中的自定义登录URL,但似乎不相关).

完成的更改:

出于安全原因,我们强制转向TLS 1.2,因此我们使用IISCrypto启用了TLS 1.2

结果:

从这一刻起,我们只在尝试访问报表管理站点时才会出错.在浏览器上我们收到错误500说:

底层连接已关闭:接收时发生意外错误

在SSRS日志中,我们可以看到以下异常:

System.Net.WebException:基础连接已关闭:接收时发生意外错误.---> System.ComponentModel.Win32Exception:客户端和服务器无法通信,因为它们没有通用的算法

callstack在ReportServer OnInit()上启动,因此它开始失败并且在Reporting Services初始化时发生错误.

在.Net Framework上启用跟踪我发现以下消息,其中显示当SSRS调用其自己的Web服务时发生故障:

System.Net Information: 0 : [5076] HttpWebRequest#38854310 - Request: POST /ReportServer/ReportService2010.asmx HTTP/1.1

System.Net Information: 0 : [4124]

SecureChannel#52830003::.ctor(hostname=themachineshostname, #clientCertificates=0)

System.Net Information: 0 : [4124] Enumerating security packages:

System.Net Information: 0 : [4124]     Negotiate

System.Net Information: 0 : [4124]     NegoExtender

System.Net Information: 0 : [4124]     Kerberos

System.Net Information: 0 : [4124] …
Run Code Online (Sandbox Code Playgroud)

ssl schannel reporting-services ssrs-2008-r2 tls1.2

7
推荐指数
1
解决办法
632
查看次数

.NET 中非常奇怪的 SSL 错误:仅针对特定 URL 无法解密指定数据

我正在使用 .NET 从 URL 下载数据。对于大多数 URL,它都没有问题,但对于一个特定的 URL,当我尝试建立连接时,我收到一个非常奇怪的错误。此外,该错误仅在第二次(及后续)尝试发出请求时发生。第一次似乎总是有效。

这是一些演示该问题的示例代码:

string url = "https://health-infobase.canada.ca/src/data/covidLive/covid19.csv";

for (int i = 1; i <= 10; i++)
{
    var req = (HttpWebRequest)WebRequest.Create(url);

    // Just in case, rule these out as being related to the issue.
    req.AllowAutoRedirect = false;
    req.ServerCertificateValidationCallback = (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => true;

    try
    {
        // This line throws the exception.
        using (req.GetResponse()) { }
    }
    catch (Exception ex) {
        Console.WriteLine(ex.ToString());
        Console.WriteLine($"Failed on attempt {i}.");
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意事项 …

.net ssl https schannel .net-core

7
推荐指数
1
解决办法
3313
查看次数

调用SSPI失败,请参阅内部异常。不支持请求的功能

在我公司中,我们有一个用C#开发的Windows服务,用于使用SSLStream和Tls12以及服务器和客户端证书来处理来自客户端的请求消息。该服务在Windows Server 2012(包括Windows 10 PC)上都运行良好,无论是以发布模式执行还是调试以检查代码,但是最近执行AuthenticateAsServer时会引发异常。一段代码是:

ServicePointManager.SecurityProtocol = SslProtocols.Tls12;
SslStream secureClient = new SslStream(networkStream, false);
secureClient.AuthenticateAsServer(serverCertificate);
Run Code Online (Sandbox Code Playgroud)

networkStream是具有服务的IP和端口的NetworkStream的实例。serverCertificate是X509Certificate2,它以自签名的方式安装在本地计算机存储中。客户端具有相同的证书。异常详细信息如下:

System.Security.Authentication.AuthenticationException
  HResult=-2146233087
  Message=A call to SSPI failed, see inner exception.
  Source=System
  StackTrace:
       at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
       at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
       at …
Run Code Online (Sandbox Code Playgroud)

.net c# ssl sspi schannel

6
推荐指数
0
解决办法
1349
查看次数

使用 Schannel 的 DTLS

我正在尝试在 Windows 下使用 Schannel 创建 DTLS“连接”(我正在最近的 Windows 10 版本下进行测试,因此 Schannel 支持的所有 DTLS 版本都应该可用)

我尝试从工作代码开始,按照文档建立常规 TLS 连接:

  1. 在第一遍中使用 null 输入初始化SecurityContext,在输出上使用 SECBUFFER_TOKEN 和 SECBUFFER_ALERT
  2. AcceptSecurityContext 输入上带有 SECBUFFER_TOKEN 和 SECBUFFER_EMPTY,输出上带有 SECBUFFER_TOKEN 和 SECBUFFER_ALERT。
  3. 重复这两个步骤直到成功,然后继续使用 Encrypt/DecryptMessage

这在流模式下工作得很好(ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM

如果我尝试用 ISC/ASC_REQ_DATAGRAM 替换 STREAM,我的 InitializeSecurityContext 将按预期成功,并显示 SEC_I_CONTINUE_NEEDED,但我的第一个 AcceptSecurityContext 然后会失败,并显示 SEC_E_INVALID_PARAMETER。

我尝试将 SCHANNEL_CRED 的 grbitEnabledProtocols 设置为 0 以使用双方记录的默认值,我还尝试将其设置为 SP_PROT_DTLS1_X,但我仍然从第一个 ASC 返回无效参数。我还尝试了 DTLS_1_0 常量以防万一。

此外,我的注册表设置中默认启用所有安全协议。

根据我对 DTLS RFC 的理解,我的代码在 HelloVerifyRequest 步骤失败,并且,再次根据我对 RFC 的理解,这部分要求安全提供程序从 ClientHello 消息的几个部分以及源的IP地址。但是,我找不到任何记录的方法将此信息传递给 ASC 函数。

(我认为?:))我在整个互联网上搜索了 …

windows winapi sspi schannel dtls

6
推荐指数
1
解决办法
1194
查看次数

如何增加 .NET 中的 TLS 握手大小?

我在尝试与 .NET 客户端建立双向身份验证时遇到连接协商失败。

这种情况发生在远程服务器显着增加授权 CA 列表之后。

虽然通过设置更高的值可以在任何 Java 客户端中轻松解决此问题jdk.tls.maxHandshakeMessageSize,但我找不到针对 .NET 的相同解决方法。

(.NET Framework 4.7.2) 和 Internet Explorer 11会出现此问题System.Net.HttpClientSystem.Net.Security.SslStream

.net c# schannel mtls

6
推荐指数
1
解决办法
759
查看次数

标签 统计

schannel ×10

ssl ×6

.net ×3

windows ×3

c# ×2

c++ ×2

sspi ×2

winapi ×2

.net-core ×1

c ×1

dtls ×1

https ×1

kmdf ×1

libcurl ×1

mtls ×1

openssl ×1

reporting-services ×1

ssrs-2008-r2 ×1

tls1.2 ×1

wdk ×1

x509 ×1