Microsoft提供传输层安全性(TLS)的最佳实践指南.本文档介绍了可以启用或禁用特定协议的注册表项.
例如,要启用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?他们似乎多余.
我有一个OpenSSL生成的PEM格式的X.509证书和它的关联密钥文件.连接到原型服务器时,此证书是身份验证所必需的.这在Linux上运行良好.我一直在使用Microsoft SChannel API来驱动Windows平台上的SSL/TLS连接,但我想使用相同的测试证书.我可以右键单击证书文件并将其导入我的证书库,但我相信私钥不会随之导入(即使我已将它们连接到同一文件中).
当我去运行SChannel代码时,我在初始化安全上下文时(通过InitializeSecurityContext)收到'SEC_E_NO_CREDENTIALS'错误.我怀疑这意味着缺少私钥.
有谁知道如何测试位于个人(或"我的")证书存储区中的证书中是否存在私钥,通过'certmgr.msc'进行访问?是否可以在商店中导入证书的新密钥文件?
任何见解或建议将不胜感激.
我叫AcquireCredentialsHandle在内核驱动程序,传递SCHANNEL_CRED与dwCredFormat设置为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) 我正在使用 SChannel TLS 的服务器。我使用 SCHANNEL_CRED 和 AcquireSecurityCredentials 创建安全凭证,然后将这些凭证传递给 AcceptSecurityContext。似乎一切正常,但如果最终证书不在系统或用户证书存储中,SChannel 将不会发送中间证书。我希望它从内存存储发送证书,但这似乎不起作用。有没有办法指定临时中间证书而不将其添加到永久存储中?
我正在制作个人使用的程序,定期擦除几个网页.其中一个需要使用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_VERIFYHOST和CURLOPT_SSL_VERIFYPEER为0,但是这并没有帮助.
我内置的libcurl从curl-7.43.0.tar.gz …
环境:
在安装了.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) 我正在使用 .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)
注意事项 …
在我公司中,我们有一个用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) 我正在尝试在 Windows 下使用 Schannel 创建 DTLS“连接”(我正在最近的 Windows 10 版本下进行测试,因此 Schannel 支持的所有 DTLS 版本都应该可用)
我尝试从工作代码开始,按照文档建立常规 TLS 连接:
这在流模式下工作得很好(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 函数。
(我认为?:))我在整个互联网上搜索了 …
我在尝试与 .NET 客户端建立双向身份验证时遇到连接协商失败。
这种情况发生在远程服务器显着增加授权 CA 列表之后。
虽然通过设置更高的值可以在任何 Java 客户端中轻松解决此问题jdk.tls.maxHandshakeMessageSize,但我找不到针对 .NET 的相同解决方法。
(.NET Framework 4.7.2) 和 Internet Explorer 11会出现此问题System.Net.HttpClient。
System.Net.Security.SslStream