gpt4 book ai didi

c# - 以编程方式安装证书吊销列表 C#

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:10 25 4
gpt4 key购买 nike

我正在使用 C#/WCF。我有一个应由客户端调用的 Web 服务。这是服务定义:

<service behaviorConfiguration="WCFInterface.CommonBehavior" name="WCFInterface.Content">
<endpoint address="" binding="ws2007HttpBinding" bindingConfiguration="wsHttpUserName"
contract="ABB.fTunes.WCFInterface.IContent">
<identity>
<dns value="fTunesTestServer" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

这是绑定(bind):

<ws2007HttpBinding>
<binding name="wsHttpUserName">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</ws2007HttpBinding>

如果我理解正确的话,从服务器发送到客户端的消息是用证书加密的。目前我仍在使用开发人员证书。我在服务器上创建了一个根证书、一个证书吊销列表和一个 key 。

我正在使用 Windows Installer 安装客户端,并且我有一个自定义安装操作来安装证书。

以下代码显示了如何将证书添加到商店

Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClientCertificates.MyRoot.cer");
byte[] buffer = new byte[((int)(manifestResourceStream.Length - 1L)) + 1];
manifestResourceStream.Read(buffer, 0, (int)manifestResourceStream.Length);
manifestResourceStream.Close();

var cert = new X509Certificate2(buffer);
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

/*
// The CRL is also needed, no idea why
manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClientCertificates.MyRoot.crl");
buffer = new byte[((int)(manifestResourceStream.Length - 1L)) + 1];
manifestResourceStream.Read(buffer, 0, (int)manifestResourceStream.Length);
manifestResourceStream.Close();
cert = new X509Certificate2(buffer);
store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();
*/

// This is the key
manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClientCertificates.MyTestServer.cer");
buffer = new byte[((int)(manifestResourceStream.Length - 1L)) + 1];
manifestResourceStream.Read(buffer, 0, (int)manifestResourceStream.Length);
manifestResourceStream.Close();

cert = new X509Certificate2(buffer);
store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

我现在有两种行为:安装证书有效,但是当我调用 Web 服务时,我得到一个 SecurityNegotiationException。当我手动添加证书吊销列表时,与服务器的通信正常。当我尝试以编程方式执行此操作时(请参阅上面的代码),它不起作用。我收到“找不到请求的对象”异常。

我尝试使用不同的商店但没有成功。

我有两个问题:a) 为什么我需要客户端的 CRL?b) 如果我需要它,我如何以编程方式安装它?上面我的错误在哪里?

感谢您的帮助,凯

最佳答案

通常,CRL 必须在线可用并可从服务器证书中指定的吊销 URL 下载。我不知道是否有获取它的带外机制,但即使有,它也会有点违背目的(允许客户端发现服务器证书已被泄露/撤销)。也就是说,CRL 对于自签名证书来说实在是太过分了,除非您使用该证书进行真正的相互身份验证并且您担心 key 被泄露(在这种情况下,购买商业证书并让他们处理它) .

如果您无法在没有撤销 URL 的情况下生成证书,我建议您完全禁用 CRL 的客户端检查,除非您真的需要它。您可以通过将以下内容添加到 Web 服务客户端的 app.config 来完成此操作:

  <system.net>
<settings>
<servicePointManager checkCertificateRevocationList="false"/>
</settings>
</system.net>

如果您使用的是 WCF,则可能需要在 serviceCertificate->revocationMode:NoCheck 下将其与 clientCredentials endpointBehavior 连接起来。

关于c# - 以编程方式安装证书吊销列表 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1476989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com