0

多くの URL に接続するマルチスレッド アプリケーションがあり、特定のスレッドでのみ SSL 証明書を検査する必要があります。

使用できることはわかっていますServicePointManager.ServerCertificateValidationCallbackが、非同期モードですべてのスレッドで同時に機能します。

URL に接続する関数の同期実行内の現在のスレッドで検査を行う必要があります。

何か案は?

4

1 に答える 1

1

次のように、リクエストと証明書関数の間のマッピングを定義できます。

// delegate definition for cert checking function
private delegate bool CertFunc(X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors);

// mapping between outbound requests and cert checking functions
private static readonly ConcurrentDictionary<HttpWebRequest, CertFunc> _certFuncMap = new ConcurrentDictionary<HttpWebRequest, CertFunc>();

// global cert callback
private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
  // call back into the cert checking function that is associated with this request
  var httpWebRequest = (HttpWebRequest)sender;
  CertFunc certFunc = _certFuncMap[httpWebRequest];
  return certFunc(certificate, chain, sslPolicyErrors);
}

次に、リクエストを行っているコードで:

// register the global cert callback
ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;

// create the request object
var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUri);

// cert checking function
CertFunc certFunc = (certificate, chain, sslPolicyErrors) =>
{
  // perform cert logic here
  return true;
};
_certFuncMap[httpWebRequest] = certFunc;

using (var webResponse = httpWebRequest.GetResponse())
{
  // process the response...
}

// clean up the mapping
_certFuncMap.TryRemove(httpWebRequest, out certFunc);
于 2013-02-28T19:17:49.547 に答える