Tag: ssl certificate

如何使用存储在.NET Core 2中的Azure Key Vault中的PFX证书中的私钥?

我在C#中编写了一个ASP.NET Core 2.0网站并启用了Facebook身份validation,因此它需要HTTPS。 我正在使用原生的Kestrel Web服务器来托管该站点,并且有一个监听器设置为每个MS文档获取PFX证书。 从Key Key召回后,我似乎找不到让Kestrel识别私钥的方法。 我知道它存在,因为我写了两个调试语句,表明它实际存在。 这是我用来检索秘密的function,它正在工作。 public static async Task GetKeyVaultCert() { X509Certificate2 pfx; try { var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken)); var secret = await kvClient .GetSecretAsync(“https://macscampvault.vault.azure.net/secrets/letsencrypt”).ConfigureAwait(false); byte[] bytes; if(secret.ContentType == “application/x-pkcs12”) bytes = Convert.FromBase64String(secret.Value); else { bytes = new byte[0]; Console.WriteLine(“secret is not PFX!!”); throw new ArgumentException(“This is not a […]

即使ServerCertificateValidationCallback返回true,也“无法为具有权限的SSL / TLS建立安全通道”

我正在与使用带有证书身份validation的传输安全性设置WCF服务(WebHttpBinding)的供应商合作。 我为供应商提供了一个类似的服务,它正常工作,所以我有一个基本的想法,它应该如何工作。 在Windows 7上运行,当我在自己的帐户下使用服务时,一切正常,我得到了回复。 当我在测试帐户下使用它时,我在mscorlib中得到一个例外,它“无法为具有权限XXXX的SSL / TLS建立安全通道”。 如果我将测试帐户添加到内置管理员组,它可以正常工作。 服务器的证书是自签名的,主题字段设置为CN = XXXX,我在个人存储中具有服务器证书,在受信任的根证书颁发机构存储中具有CA证书。 此外,如果我尝试设置System.Net.ServicePointManager.ServerCertificateValidationCallback来打印诊断并返回true,我会得到一些有趣的行为。 在我的帐户下运行,回调被调用两次,然后WCF调用成功。 在测试帐户下运行,它被调用一次,返回,然后我得到上面的例外。 我最好的猜测是,这与测试帐户缺少的某些特权有关,但我不明白Windows如何处理证书以确定无疑,而且我不知道从哪里开始查找。

C#SSL安全套接字

我有一个很好的,有效的沟通应用程序,用C#编写。 现在我需要实现与服务器的安全连接。 我已经尝试将Socket和TcpClient对象更改为SslStream,但是我遇到了一些错误。 首先,我使用makecert生成了一个.cer证书。 OpenSSL证书对我没用,因为它们不包含私钥。 接下来,我在服务器上创建了一个证书对象,并将其绑定到SslStream: X509Certificate serverCertificate = X509Certificate.CreateFromCertFile(“ca.cer”); TcpClient clientSocket = this.tcpListener.AcceptTcpClient(); SslStream ssls = new SslStream(clientSocket.GetStream(), false); ssls.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls, true); 在客户端我这样做: TcpClient client = new TcpClient(settings.IP, settings.Port); sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); sslStream.AuthenticateAsClient(settings.IP); public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == […]

WCF中SOAP消息的数字签名

我在4.0中有一个WCF服务。 我需要在SOAP响应中添加数字签名。我不太确定它应该如何实现。 我相信响应应该如下面的链接所示。 https://spaces.internet2.edu/display/ISWG/Signed+SOAP+Messages 我有什么地方可以获得这方面的细节吗? 请指教。

如何使用BouncyCastle生成根证书,然后使用由该根证书签名的站点证书?

我正在尝试构建一个使用带有SSL WebAPI的自托管服务,我需要能够自行生成要使用的SSL证书。 我希望能够从C#做到这一切。 我一直在玩BouncyCastle 。 我需要生成2个证书,一个根和一个站点证书。 然后我需要在Windows中将它们安装在正确的位置。 我无法弄清楚如何使我的第二个证书参考我的根ca. 我试过的所有东西都让我得到了一个不受信任的证书错误。 任何帮助,将不胜感激。

强制HttpClient信任单个证书

你能强迫HttpClient只信任一个证书吗? 我知道你可以这样做: WebRequestHandler handler = new WebRequestHandler(); X509Certificate2 certificate = GetMyX509Certificate(); handler.ClientCertificates.Add(certificate); HttpClient client = new HttpClient(handler); 但是这会迫使它只信任单个证书,还是会信任证书和所有证书fx。 GlobalSign可以validation吗? 基本上我想确保它只能是我的客户正在与之交谈的服务器/证书。

以编程方式使用私钥导入证书

我正在尝试在C#应用程序中使用HttpListener类,以使迷你Web服务器通过SSL提供内容。 为了做到这一点,我需要使用httpcfg工具。 我有一个带有公钥和私钥对的.pfx文件。 如果我使用mmc手动将此密钥对导入本地机器商店,一切正常。 但是,如果我使用X509Store类以编程方式导入此密钥对,则无法连接到我的迷你网络服务器。 请注意,在这两种方法中,证书都会导入到LocalMachine中的MY商店。 奇怪的是,一旦我以编程方式导入它,我就可以在mmc中查看证书,当我查看它时,UI表明私钥也可用于此证书。 深入挖掘,我注意到当我手动导入密钥对时,我可以看到一个新文件出现在C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys ,但是没有一个出现当我以编程方式导入时。 在相关的说明中,当我删除手动导入的证书时,它不会从前面提到的目录中删除相应的私钥文件。 最后,我的问题是:当我以编程方式将证书添加到商店时,存储的私钥在哪里以及为什么HttpListener类(HttpApi)无法访问它? 请注意,这个问题略有关联,但我不认为权限是问题,因为这一切都是作为同一个Windows用户完成的: 如何从.NET设置X.509证书的私钥文件的读取权限

HTTPs客户端连接到Azure Web App上没有受信任链(非受信任CA)的服务器

我已经被困了大约3天试图连接到一个没有被可信CA签名的证书的服务器 – 你可以通过Azure门户添加CA的证书 – 但是没有任何影响。 显然,HTTP使用内核模块(!)HTTP.SYS。 我所看到的所有建议都要使用: ServicePointManager.ServerCertificateValidationCallback = Communicator.CustomServiceCertificateValidation; (或者在请求本身上不那么全球化的对应物) 或类似的东西: client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.Custom, RevocationMode = X509RevocationMode.NoCheck, //TrustedStoreLocation = StoreLocation.CurrentUser, CustomCertificateValidator = new PermissiveCertificateValidator() }; 但是,都没有被调用!! 一些更重要的细节: 这有效: try { ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; using (var wc = new WebClient()) { var res = wc.DownloadString(“https://untrusted-root.badssl.com/”); […]

HttpRequestMessage.GetClientCertificate()在Web API中返回null

我有一个.NET4.5 WebAPI 2应用程序,它使用SSL客户端证书进行一些自定义安全相关检查。 调试应用程序时,无论我到目前为止尝试了什么, request.GetClientCertificate()都会为任何服务调用返回null 。 经测试的代码: 基本上,在我的服务方面,我有一个类似这样的方法: class CertificateChecker : ICertificateChecker { public bool Check(HttpRequestMessage request) { var cert = request.GetClientCertificate(); } } 我的单元使用request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert)传递附加到请求的客户端证书进行测试(证书完全符合预期,validation工作,等等)。 但是,当我使用HttpClient调用实际WebAPI应用程序的测试时,在服务端的request.GetClientCertificate()行设置断点,同一行返回null。 这是我尝试过的: 客户证书: 创建了假CA并将其放入可信CA存储(尝试使用LocalMachine和当前用户)。 创建由该假CA签名的客户端身份validation(1.3.6.1.5.5.7.3.2)证书,并将其放入个人存储(LocalMachine和当前用户)。 (基本上,按照https://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/和类似的博客) 在我使用HttpClient调用服务的测试中,以下列方式附加了客户端证书(没有一个工作): 使用WebRequestHandler ,将ClientCertificateOptions设置为Manual,并将cert添加到ClientCertificates集合中。 using (var handler = new WebRequestHandler()) { var cert = GetTestCert(); handler.ClientCertificateOptions = ClientCertificateOption.Manual; handler.ClientCertificates.Add(cert); // and so on… } […]

SslStream,禁用会话缓存

MSDN文档说 如果可能,框架会在创建SSL会话时对其进行缓存,并尝试将缓存会话重新用于新请求。 尝试重用SSL会话时,Framework使用ClientCertificates的第一个元素(如果有),或者如果ClientCertificates为空,则尝试重用匿名会话。 如何禁用此缓存? 目前我遇到了重新连接到服务器的问题(即,第一个连接工作正常,但尝试重新连接服务器会中断会话)。 重新启动应用程序有帮助(但当然仅适用于第一次连接尝试)。 我假设问题根是缓存。 我已经使用嗅探器检查了数据包,区别仅在于客户端Hello消息的单个位置: 第一次连接到服务器(成功): 第二次连接尝试(没有程序重启,失败): 区别似乎只是会话标识符。 PS我想避免使用第三方SSL客户端。 有合理的解决方案吗? 这是来自ru.stackoverflow的这个问题的翻译