IUSR の CertOpenSystemStore() への権限

IUSR の CertOpenSystemStore() への権限

私の CGI アプリケーションは、SSPI Schannel を使用して別のサーバーとの TLS 接続を作成しようとしています。 http://www.coastrd.com/c-schannel-smtp

ハンドシェイクプロセスは、「MY」証明書ストア内の証明書を確認することから始まります。 http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

この関数はゼロを返し、GetLastError もゼロを返します。これは権限の問題だと思います。たとえば、IUSR を管理者に昇格させずにこれを動作させるにはどうすればよいですか?

追加した

ユーザー証明書にアクセスするには、特定のユーザーとして実行する必要があり、ユーザーの秘密キーにアクセスするには、ユーザーがパスワードを使用してローカルにログオンしているか、サーバーが委任に対して有効になっている必要があります。

マシン証明書は誰でも読み取り可能ですが、ACL を調整しない限り、秘密キーにアクセスするには管理者権限 (またはローカル ユーザー) が必要です。

追加した

この状況では、証明書に制約はありませんが、「MY」証明書ストアは空であり、このためだけに証明書を購入したくありません。

現在、WS2003 を使用しています。TLS を使用してメールを送信するために接続しているサーバーは gmail.com です。コードで証明書を探すことはできますが、証明書がありません。私が読んだところによると、証明書を取得するには登録、購入、インストールが必要で、大変な手間がかかるようです。そうでなければ、一時的な解決策しか得られず、役に立ちません。証明書を取得する簡単な方法をご存知でない限り、CGI アプリからメールを送信するためだけに、これほど面倒なことはしたくないでしょう。他に方法はないのでしょうか?

Joe さん、あなたの助言にとても感謝していますが、$30/年 x nServers は選択肢になりません。管理者権限で実行されている別のプロセス (サービスなど) にタスクを渡す方法はないでしょうか。特定のフォルダーから読み取り、そこに見つかった電子メールを送信するようにスケジュールされたアプリケーションを作成することもできます。それ以外では、CGI アプリケーションを管理者に昇格させる必要があります。

追加した

Goyuix さん、ご提案ありがとうございます。課題は、.NET (60MB) や ASP などの他のライブラリに頼らずに、付随する問題のないスタンドアロン ソリューションを提供することです。

あなたの言う通りです。必要なのはサーバー認証だけです。片側だけを認証できるとは知りませんでした。あなたの発言「クライアント証明書がなくても、SMTP の安全なチャネルを確立することはできます。ハンドシェイクのその部分をコード化するだけで済むかもしれません。」が解決策であることがわかりました。

これは昔の配管工のジョークを思い出させます。配管工は排水管の詰まりを解消するために呼ばれます。配管工は一目見て、ハンマーを取り出し、パイプを一回叩きます。5分間の作業で180ドルを請求し、内訳は出張費30ドル、パイプを叩く場所を知るための費用150ドルです。

お二人ともありがとう。本当に長い道のりでした。

答え1

schannel コードが「MY」ストアをクラックしようとする唯一の理由は、最初のハンドシェイクの一部としてクライアント認証に使用できる潜在的な証明書を探すことです。あなたの例では、サーバー認証のみを気にしていると思います (たとえば、クライアントが想定しているサーバーと通信していることを確認するなど)。クライアント証明書がなくても、SMTP 用の安全なチャネルを確立できないわけではありません。ハンドシェイクのその部分についてコードを書くだけでよいかもしれません。

クライアント認証も必要な場合は、次のいずれかを行う必要があります。

  • IUSR アカウントを昇格し、マシン ストアに証明書をインストールする
  • APPプールを別のユーザーとして実行するように変更し、それを解決します

リンクされたコードを修正する方法としては、.NET フレームワークに付属する SmtpClient コードを試すことをお勧めします (可能な場合)。暗号化された通信をサポートしており、理論上は「そのまま動作する」はずです。マネージド C++ も選択肢になるのでしょうか? あるいは、これに対して ASP.NET ハンドラーを記述する方がよいのでしょうか?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

また、関連するコードに関する質問をしてみるのも良いでしょう。スタックオーバーフローそこにいる人たちも助けてくれるかもしれません。

答え2

最良の選択肢確認すべきことは、マシン証明書を使用し、証明書の秘密キーを読み取る権限を IUSR アカウントに付与することです。これは手動の手順ですが、一度だけ実行すれば済む非常に簡単な手順です。

あなたの状況では、証明書のアクセス許可の変更を妨げる他の要件はありますか?


始めるための手順

まず、証明書が必要です。自分で生成することもできますが、証明書の使用方法や証明書を検証する相手側によっては、証明書を購入する必要があるかもしれません。証明書の生成方法については説明しません。これまで証明書や証明機関を扱ったことがない場合は、まずそれらについて学習することをお勧めします。

特にコメントがない限り、Windows Server 2003 を使用しているものと想定します。

1) 証明書をマシン ストアにインストールします。[スタート] | [実行] に移動し、MMC と入力して空の MMC コンソールを取得します。[ファイル] | [スナップインの追加と削除] に移動します。[追加] ボタンをクリックしてスナップインを選択します。リストから [証明書] を選択し、[追加] をクリックします。[コンピューター アカウント] オプションを選択し、[次へ]、[完了]、[閉じる]、[OK] の順にクリックします。

2) 証明書をマシン ストアにインポートします。ツリーを展開し、個人用フォルダーを選択します。個人用を右クリックし、[すべてのタスク]、[インポート] の順に選択します。ウィザードに従ってプロセスを完了します。これで、証明書がマシン ストアに保存されます。

3) 秘密鍵の権限の調整。Windows 2008では、証明書マネージャのGUIに追加されます。Windows 2003では、Windows Server 2003 リソース キット ツール権限を設定するには、次のコマンドの形式を使用します。

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

ここで、「LOCAL_MACHINE\My」はローカルマシンの個人証明書ストア、「mycert」は証明書の名前、USER_ACCOUNT は秘密キーの読み取り権限が付与されるアカウントです。IUSR アカウントを試すこともできますが、CGI アプリが実行される正確なコンテキストによっては、「NETWORK SERVICE」を使用する必要がある場合があります。変更を有効にするには、IIS を再起動する必要があります。WinHttpCertCfg のドキュメントそれが何をしているかを説明します。

これで、秘密鍵にアクセスする権限が付与されます。引き続き、MY フラグ付きの CertOpenSystemStore を使用します。

お役に立てれば幸いです。


編集2:

認定機関の証明書を簡単に入手できる場所は GoDaddy です。1 年間有効な SSL 証明書を 30 ドルで入手できます。少し探してみると、もっと安い場所が他にもあるかもしれません。それほど難しいことではありません。ほとんどのサイトは非常にユーザー フレンドリーで、証明書の購入も簡単です。

相互認証を行っているため、有効な認証局による証明書が必要になります。Gmail サーバーには検証方法がないため、自分で作成できる自己署名証明書だけでは不十分です。

関連情報