- PR -

クライアント認証

1
投稿者投稿内容
さっくん
会議室デビュー日: 2002/10/22
投稿数: 3
投稿日時: 2002-10-22 18:02
はじめまして。

サーバ(Win2kServer)、クライアント(win2k)間で
SSL(サーバ認証&クライアント認証)を実装したいと考えています。
クライアント側はブラウザではなく実行形式のアプリ(.exe)です。

msdnを見る限り、NetworkCredentialクラスでは
「公開キーに基づく認証方式はサポートしていません。」とあります。

これは”独自にSSLプロトコルは実装してね”ということでしょうか?

クライアント証明書はセキュリティの関係から
クライアントPCのディスク上ではなく、同PCに接続する
外部トークン等に格納しています。

クライアント認証の実装方法をご存知の方が
いらっしゃいましたら、是非ともご教授下さい。
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2002-10-23 10:48
HTTPSであれば、HttpWebClientProtocolクラスのClientCertificatesプロパティにX509Certificateクラスのインスタンスをセットできます。外部デバイスから証明書をバイト配列として取り出すか、またはCryptoAPIでハンドルを取り出せば、そこからX509Certificateクラスのインスタンスを作成できます。
さっくん
会議室デビュー日: 2002/10/22
投稿数: 3
投稿日時: 2002-10-23 14:58
NothingBut.NETFXさん、ご回答ありがとうございます。

私の方でもX509Certificateクラスのコンストラクタで
証明書ハンドルを渡せるのを見落としていました。

X509Certificate.CreateFromCertFile()でしか
証明書を作れないわけではないのですね。

早速、CryptAPI共々試したいと思います!
情報ありがとうございます。
さっくん
会議室デビュー日: 2002/10/22
投稿数: 3
投稿日時: 2002-11-07 23:03
C#からのwin32API(CryptAPI)呼び出しで悩んでいます。

証明書ストア内の全ての証明書の中から希望の証明書を取得しようと
while()文でCertEnumCertificatesInStore()を複数回コールする部分です。
戻り値のcontextに期待する新しい証明コンテキストのポインタを得られず
0x00が返されてしまいます・・。
---------------------------------------------------------------------
// API宣言部抜粋
[DllImport("Crypt32.dll")]
public static extern IntPtr CertOpenSystemStore(IntPtr hProv, string szSubsystemProtocol);
[DllImport("Crypt32.dll")]
public static extern IntPtr CertEnumCertificatesInStore(ref IntPtr CertStore, ref IntPtr pPrevCertContext);

// 呼び出し部抜粋
// 証明書ストアのオープン
IntPtr handle = CertOpenSystemStore(hProv, "MY");

IntPtr context = IntPtr.Zero;
while (true)
{
// 証明書の列挙
// 第一引数:証明書ストアのハンドル
// 第二引数:一つ前に本関数により呼び出された証明コンテキストのポインタ
context = CertEnumCertificatesInStore(ref handle, ref context);
}

VC++で動作確認済のソース抜粋はこちらです。↓
---------------------------------------------------------------------
#include <wincrypt.h>

HCERTSTORE handle = NULL;
PCCERT_CONTEXT context = NULL; // 新しい証明コンテキストのポインタ

// 証明書ストアのオープン
handle = CertOpenSystemStore(hProv, "MY"); // hProv:CSP Handle

while (true)
{
// 証明書の列挙
context = CertEnumCertificatesInStore(handle, context);
}

PCCERT_CONTEXTがwincrypt.hでconst定義されており
これに起因?しているのではと思うのですが、対策方法が不明です。
#知識不足故に、もちろん別の原因かも知れないのですが・・・

何卒、皆様のお知恵を拝借出来ればと思います。
あみゅせる
常連さん
会議室デビュー日: 2004/07/08
投稿数: 33
お住まい・勤務地: 神奈川県
投稿日時: 2004-12-10 11:11
こんにちは。
もう一ヶ月以上経ってますが、
この記事を参考に実験させていただいたので
レスさせていただきます。

CertEnumCertificatesInStoreの引数を両方ref定義されてますが、
修飾なしで良いようです。

コード:
[DllImport("Crypt32.dll")] 
public static extern IntPtr CertEnumCertificatesInStore(IntPtr CertStore, IntPtr pPrevCertContext); 



ここでの戻り値でX509Certificateクラスの生成ができました。


_________________
1

スキルアップ/キャリアアップ(JOB@IT)