私の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アプリからメールを送信するためだけに行きたいよりもはるかに厄介です。他に方法はありますか?
ジョーの助けにとても感謝していますが、年間30ドルxnServersはオプションではありません。 ISおそらくサービスのように、管理者権限で実行されている別のプロセスにタスクを渡す方法があるかどうか疑問に思っていますか?私は、から読み取るようにスケジュールされたアプリケーションを作成することもできます与えられたフォルダとそこで見つかった電子メールを送信します。それ以外は、CGIアプリケーションを管理者に昇格させてみる必要があります。
[〜#〜]追加[〜#〜]
Goyuix、提案ありがとうございます。課題は、.NET(60MB)やASP)などの他のライブラリに頼らずにスタンドアロンソリューションを提供することです。
あなたは正しいです、私はサーバー認証だけが必要です。片側しか認証できないとは知りませんでした。あなたの声明:「クライアント証明書がなくても、SMTP用の安全なチャネルを確立することを妨げることはありません。ハンドシェイクのその部分をコード化する必要があるだけかもしれません。」解決策であることが判明しました。
これは私に古い配管工のジョークを思い出させます。配管工は、排水管のブロックを解除するために呼び出されます。彼は一目見て、ハンマーを引き出し、パイプを一度叩きます。彼は、5分間の作業に180ドル、コールアウト料金30ドル、パイプをどこに当てるかを知るために150ドルを要求します。
あなたがた両方に感謝します。これは長い上り坂のスローガンでした。
Schannelコードが「MY」ストアをクラックオープンしようとしている唯一の理由は、最初のハンドシェイクの一部としてクライアント認証に使用できる潜在的な証明書を探すことです。あなたの例では、あなたが本当に気にしているのはサーバー認証だけだと思います(たとえば、クライアントがサーバーと通信していることを確認してください)。クライアント証明書がなくても、SMTPのセキュリティで保護されたチャネルを確立できなくなることはありません。ハンドシェイクのその部分の周りにコーディングする必要があるかもしれません。
クライアント認証も必要な場合は、おそらく次のいずれかを行う必要があります。
リンクされたコードの修正については...まあ-それがオプションである場合は、.NETフレームワークに付属しているSmtpClientコードを試すことをお勧めします。暗号化された通信をサポートし、理論的には「正常に機能する」はずです。マネージC++はオプションでもありますか?または、さらに良いことに、このためのASP.NETハンドラーを作成するだけですか?
http://msdn.Microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx
StackOverflow.com で関連するコードの質問をしてみることもできます。そこにいる人も、助けてくれるかもしれません。
最良のオプション[〜#〜] i [〜#〜]参照は、マシン証明書を使用し、IUSRアカウントに証明書の秘密鍵を読み取るためのアクセス許可を付与することです。これは手動の手順ですが、1回だけ実行する必要がある非常に簡単な手順です。
あなたの状況で、証明書のアクセス許可の変更を妨げる他の要件はありますか?
開始するための指示
まず、証明書が必要です。独自に生成することもできますが、使用方法や検証する相手によっては、購入が必要になる場合があります。証明書の生成方法については説明しません。これまでに証明書や認証局と協力したことがない場合は、最初にそれらについて学ぶことをお勧めします。
特にコメントがない限り、Windows Server2003を使用していると想定します。
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アプリが実行されている正確なコンテキストによっては、「ネットワークサービス」を使用する必要がある場合があります。変更を有効にするには、IISを再起動する必要があります。 WinHttpCertCfgのドキュメント は、その実行内容をカバーしています。
これで、秘密鍵にアクセスするためのアクセス許可が得られます。 MYフラグを指定してCertOpenSystemStoreを引き続き使用します。
お役に立てば幸いです。
編集2:
承認された権限を持つ証明書を取得する簡単な場所はGoDaddyです。 1年間有効なSSL証明書を$ 30で取得できます。あなたが少し周りを狩るならばもっと安いかもしれない他の場所があります。それはそれほど難しいことではありません。ほとんどのサイトは非常にユーザーフレンドリーで、証明書を簡単に購入できます。
相互認証を行っているため、Gmailサーバーには検証方法がないため、自分で作成できる自己署名証明書だけでなく、有効な権限を持つ証明書が必要になります。