3

私は、スマート カード (具体的にはCommon Access Card )の形式で「クライアント証明書を必要とする」必要がある IIS6/ASP.NET Web サイトで作業しています。タイマーでさまざまな URL にアクセスして、検索インデックスの更新、Sharepoint ページの準備、およびその他のタスクを実行するためのサービスをいくつか作成する必要があります。

スマートカードにある証明書を持っていない限りサイトへのアクセスが許可されない場合、これを行うにはどうすればよいでしょうか? 証明書(.cer)をロードして、次のようにロードしようとしました:

HttpWebRequest request = (HttpWebRequest)
            WebRequest.Create("https://.../someURL.html");

const string certFilename = @"my.cer";
var cert = X509Certificate2.CreateFromCertFile(certFilename);
cert.Import(certFilename, "my pin", X509KeyStorageFlags.Exportable);
request.ClientCertificates.Add(cert);
HttpWebResponse response = (HttpWebResponse)
       request.GetResponse();

しかし、403 Forbidden が表示されます。

4

4 に答える 4

1

これは答えではありませんが、コメントするのに十分な担当者がいません。.cerは秘密鍵を保持していません。これは単なる公開証明書であるため、使用することはできません。スマートカードから直接秘密鍵をロードする必要があります。これには、スマートカードリーダーのCSP名を使用してCSPパラメータを作成し、カードから秘密鍵を使用してx509証明書を直接ロードすることが含まれる可能性があると思います。私の知る限り、秘密鍵は現在のユーザーまたは現在のマシンのMYストアに自動的にインストールされないため、そこからロードすることはできません。申し訳ありませんが、コードはありません。

于 2010-09-22T21:49:08.213 に答える
1

次のように、個人ストアから証明書をロードできます。

 System.Security.Cryptography.X509Certificates.X509Certificate cert = FindCertByName(PART_AFTER_CN_IN_CERT_SUBJECT);
request.ClientCertificates.Add(cert);

..

        private System.Security.Cryptography.X509Certificates.X509Certificate FindCertByName(string simpleName)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            foreach (X509Certificate cert in store.Certificates)
            {
                if( cert.Subject.Contains("CN="+simpleName))
                {
                    return cert;
                }
            }

            string msg = "The '" + simpleName + "' security certificate is not installed on this system!";
            throw new ApplicationException(msg);
        }
于 2010-09-22T20:41:36.063 に答える
0

X509 を認証情報キャッシュに追加しようとしましたか? 例:

X509Certificate cert = new X509Certificate("sslCert.txt"); X509CertificateCollection certColl = new X509CertificateCollection(); certColl.Add(cert); CredentialCache credCache = new CredentialCache(); credCache.Add(new Uri(string.Concat(outputReport.reportURI)), "Basic", new NetworkCredential(NexConfig.User, NexConfig.Pass)); wr.AllowAutoRedirect = false; wr.ClientCertificates = certColl; wr.Credentials = credCache; HttpWebResponse resp = (HttpWebResponse)wr.GetResponse();

于 2010-09-22T20:41:48.547 に答える
0

SharePoint 2010 を使用している場合:

  1. SharePoint サーバーの全体管理に移動
  2. [アプリケーション管理] > [Web アプリケーションの管理] に移動します
  3. 正面向きの SharePoint サイトを強調表示します。
  4. トップメニューから「拡張」を選択します。

これにより、まったく同じ構成とコンテンツ データベースを使用する個別の SharePoint サイトが作成されますが、別の場所でホストして、個別に保護することができます。これにより、完全にロックダウンされた通常の安全な SharePoint インスタンスを稼働させることができますが、同時に別のセキュリティを持つ別のバージョンを別の場所でホストすることができます。これには、他のアクセス権を与えることができます。つまり、インデックスや他のジョブを実行する必要があるサービスです。 .

于 2010-09-16T18:23:16.130 に答える