6

私はWindowsMo​​bile6で作業しており、ApacheWebサーバーと通信するときにクライアント認証を取得したいと考えています。ローカルの証明書ストアに証明書がありますが、それはかなり簡単なはずです。

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のセキュリティで保護されたチャネルを確立できませんでした」というメッセージが表示されます。不思議なことに、通常の.Net Frameworkでこの正確なコードを使用すると、証明書が完全に送信されます。

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

ありがとう。

4

2 に答える 2

1

Apache サーバーが安全な接続をサポートしていない可能性があります。

たとえば、ホストされているドメインで、ほとんどまたはまったく費用がかからない Web サイトをいくつか持っています。私はこれらの Web サイトを使用して、常にコードをテストしています。

しかし、SSL 機能を利用するには、月額 50 ドルほどの出費が必要です。そのため、自分のサイトでそれらをテストすることはできません。

テストするには: Apache サーバーが SSL をサポートしている場合、URL を SSL に相当するものに置き換えることができるはずです: http://www.stackoverflow.comhttps://www.stackoverflow.comに

于 2012-12-12T15:23:15.513 に答える
1

朗報: 解決しました。.Net Compact Framework とは関係ないことが判明しました。3.5 CF では、X509 証明書にアクセスできる限り、HTTPWebRequest.ClientCertificates がサポートされます。

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

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;  
    }*/
}

HTTPWebRequest の直前で参照

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

これにより、SSL/TLS セキュア チャネルに関する問題が解決されます。

于 2013-06-10T17:47:04.603 に答える