2012-12-11 57 views
6

私はWindows Mobile 6で作業しており、Apache Webサーバーと通信するときにクライアント認証を受けたいと考えています。私は私のローカル証明書ストアに証明書を持って、それはかなり簡単です:クライアント認証に.NET Compact FrameworkでX509証明書を使用するHTTPRequest

X509Store myStore = new X509Store("MY", StoreLocation.CurrentUser); 
myStore.Open(OpenFlags.ReadOnly); 
X509Certificate2Collection certificates = myStore.Certificates; 
X509Certificate2 clientcertificate; 
foreach (X509Certificate 2certificate in certificates) { 
    clientcertificate = certificate; //omitted code to validate certificate 
} 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(webPage); 
req.AllowWriteStreamBuffering = true; 
req.AllowAutoRedirect = false; 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
req.Accept = "text/xml"; 
req.ClientCertificates.Add(clientcertificate); 
Stream stream = req.GetRequestStream(); 
stream.Write(buffer, 0, buffer.Length); 
stream.Close(); 

このコードセグメントは、限り、私は「req.ClientCertificates.Add(clientcertificate)」の行を削除して動作します。

これが挿入されると、「SSL/TLSの安全なチャネルを確立できませんでした」というメッセージが表示されます。 Maddeningly十分に、私はこの正確なコードを通常の.NET Frameworkで使用すると、証明書を完全に送信します。

Compact Frameworkでこれが可能かどうかは知っていますか?クライアント認証用のX509証明書を提示できない場合は、認証が適切であることを確認するために他にどのような方法をとるべきですか(CAPIまたは他のMicrosoft暗号化モジュールにアクセスする必要があります)

ありがとうございました。

+0

[ServicePointManager.CertificatePolicy](http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.certificatepolicy%28v=vs.90%29.aspx)プロパティを見て、 [ICertificatePolicy](http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy%28v=vs.90%29.aspx)インターフェイス。 –

+0

お返事ありがとうございます。中間証明書をインストールし、ICertificatePolicyにコードを追加して、すべての証明書、同じ問題を許可しました。 –

答えて

1

グッドニュースをhttp://www.stackoverflow.com:ApacheサーバがSSLをサポートしている場合は、SSLと同等とURLを交換することができるはず私はそれを解決しました。それは、.Net Compact Frameworkと関係がないことが判明しました。 3.5 CFでは、X509証明書にアクセスできる限りHTTPWebRequest.ClientCertificatesがサポートされています。

SSLハンドシェイクが失敗した理由は、サーバー側の証明書の信頼問題のためです。私たちのサーバー証明書は自己署名されており、間違ったURLで署名された証明書を使用していたため、アプリケーションは提供されたサーバー証明書を信頼できませんでした。テスト目的のために、すべての証明書を信頼するポリシーを設定します。このポリシーは、本番環境では削除されます。右のHttpWebRequest

System.Net.ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); 

そして、これは、SSL/TLSのセキュリティで保護されたチャネルで私たちの問題を解決する前に参照さ

sealed class AcceptAllCertificatePolicy : ICertificatePolicy 
{ 
    private const uint CERT_E_UNTRUSTEDROOT = 0x800B0109; 

    public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate 
    certificate, WebRequest request, int certificateProblem) 
    { 
     // Just accept. 
     return true; 
    } 
    /*public bool CheckValidationResult(ServicePoint sp, 
    X509Certificate cert, WebRequest req, int problem) 
    { 
     return true; 
    }*/ 
} 

+0

注:実行する必要があるもう1つの事柄は、ルート証明書をインストールすることです。同じエラーが発生しましたが、ルート証明書と中間証明書をインストールしたときに解決されました。 –

1

Apacheサーバーがセキュアな接続をサポートしていない可能性があります。

たとえば、ほとんど、またはまったく費用がかからないホステッドドメイン上のいくつかのウェブサイトがあります。私はこれらのウェブサイトを使って常にコードをテストしています。

しかし、SSL機能を利用するためには、月額50ドルのように外出する必要があります。だから私は自分のサイトでそれらをテストすることはできません。テストへ

https://www.stackoverflow.com

+0

残念ながら、Apache Serverはセキュアな接続をサポートしています。 HTTPS://ではクライアント証明書なしで、またブラウザでも正常に動作します。コンパクトフレームワークのWeb要求にクライアント証明書を追加するだけで、動作が停止します。 –

+0

ちょっと偶然、別の男が今日彼のX509コードをここに掲載しました:[13858609](http://stackoverflow.com/q/13858609/153923)あなたの二人が協力できるかもしれません。ちょっとした考え。 – jp2code

関連する問題