2

SSL で保護された外部 Web サービスに接続する必要がある Azure の Web ロールがあります。アプリケーションが Web サービスに接続しようとすると、次のエラーが発生します。

機関「certname.organization.org」との SSL/TLS セキュア チャネルの信頼関係を確立できませんでした。

必要な証明書はサービス証明書として Azure にアップロードされていますが、何らかの理由で適切に参照または使用されていないようです。

これを修正する方法について何か考えはありますか?

4

4 に答える 4

1

私もこの問題を断続的に見てきました。私の場合、ルート証明書の 1 つを取得するためのネットワーク接続がタイムアウトすることがあることがわかりました。その後、将来のリクエストで再び機能します。

私は、他の証明書の検証に影響を与えることなく、エラーにもかかわらず、関心のある特定の証明書を動作させるカスタム コールバックを作成することになりました。以下はそのための私のコードです。おそらくおわかりのように、私は Android Cloud-to-Device Messaging エンドポイントに到達しようとしており、Google が使用するワイルドカード証明書の問題を回避しようとしていますが、一般化できるはずです。これには、特定のエラーを診断するために使用したすべてのログも含まれています。証明書の検証を強制したくない場合でも、ロギング コードは続行方法を決定するのに役立ちます。

private static readonly Uri PUSH_URI = new Uri("https://android.apis.google.com/c2dm/send", UriKind.Absolute);

/**
//The following function needs to be wired up in code somewhere else, like this:
ServicePointManager.ServerCertificateValidationCallback += ValidateDodgyGoogleCertificate;
**/
/// <summary>
/// Validates the SSL server certificate. Note this is process-wide code.
/// Wrote a custom one because the certificate used for Google's push endpoint is not for the correct domain. Go Google. 
/// </summary>
/// <param name="sender">either a host name string, or an object derived from WebRequest</param>
/// <param name="cert">The certificate used to authenticate the remote party.</param>
/// <param name="chain">The chain of certificate authorities associated with the remote certificate.</param>
/// <param name="sslPolicyErrors">One or more errors associated with the remote certificate.</param>
/// <returns>
/// Returns a boolean value that determines whether the specified
/// certificate is accepted for authentication; true to accept or false to
/// reject.
/// </returns>
private static bool ValidateDodgyGoogleCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
    // Good certificate.
    return true;
    }

    string hostName = sender as string;
    if (hostName == null)
    {
    WebRequest senderRequest = sender as WebRequest;
    if (senderRequest != null)
    {
        hostName = senderRequest.RequestUri.Host;
    }
    }

    //We want to get past the Google name mismatch, but not allow any other errors
    if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch)
    {
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("Rejecting remote server SSL certificate from host \"{0}\" issued to Subject \"{1}\" due to errors: {2}", hostName, cert.Subject, sslPolicyErrors);

    if ((sslPolicyErrors | SslPolicyErrors.RemoteCertificateChainErrors) != SslPolicyErrors.None)
    {
        sb.AppendLine();
        sb.AppendLine("Chain status errors:");

        foreach (var chainStatusItem in chain.ChainStatus)
        {
        sb.AppendFormat("Chain Item Status: {0} StatusInfo: {1}", chainStatusItem.Status, chainStatusItem.StatusInformation);
        sb.AppendLine();
        }
    }

    log.Info(sb.ToString());

    return false; 
    }

    if (PUSH_URI.Host.Equals(hostName, StringComparison.InvariantCultureIgnoreCase))
    {
    return true;
    }

    log.Info("Rejecting remote server SSL certificate from host \"{0}\" issued to Subject \"{1}\" due to errors: {2}", hostName, cert.Subject, sslPolicyErrors);
    return false;
}
于 2012-04-05T17:54:49.907 に答える
1

Azure のサービス クライアントは、呼び出している外部サービスの SSL 証明書に満足していないようです。そのサービスを制御できますか?

これをテストするには、次を使用して、Azure のクライアントからの SSL エラーを無視します。

ServicePointManager.ServerCertificateValidationCallback =
    (obj, certificate, chain, errors) => true;
于 2012-04-05T16:13:57.547 に答える
0

プロジェクトのルートにcerを追加し、「常にコピー」を選択し、次のコマンドを使用して、AzureがSSL自己署名でサーバーに接続するようにします

 REM Install certificates.
certutil -addstore -enterprise -f -v root startsodev.cer
于 2013-01-23T00:03:10.433 に答える
0

SSL エラーを無視することは、できることの 1 つです。

しかし、それがマシンでは機能し、インスタンスでは機能しない場合は、インスタンスで証明書チェーンが不完全である可能性もあります。マシンで証明書を開き、Certification Pathに移動して、パス内の各証明書をエクスポートする必要があります。

次に、これらの証明書をプロジェクトに追加し、スタートアップ タスク (.bat または .cmd ファイル) でそれらを信頼されたルート CA に追加します。

REM Install certificates.
certutil -addstore -enterprise -f -v root Startup\Certificates\someROOTca.cer
certutil -addstore -enterprise -f -v root Startup\Certificates\otherROOTca.cer
于 2012-04-06T06:25:13.913 に答える