3

この質問に記載されているエラーが表示されます:

X.509 証明書 CN=ファーム チェーンの構築に失敗しました。使用された証明書には、検証できない信頼チェーンがあります。証明書を置き換えるか、certificateValidationMode を変更してください。証明書チェーンが処理されましたが、信頼によって信頼されていないルート証明書で終了しました。

以下に示すように、WCF サービスへの要求に使用する証明書が追加されているため、このエラーが発生する理由がわかりません。

client.ClientCredentials.Peer.PeerAuthentication.CertificateValidationMode =     
    X509CertificateValidationMode.ChainTrust;        
client.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.CurrentUser,
    StoreName.My,
    X509FindType.FindBySerialNumber,
    "MyCertificatesSerialNumber" );

証明書自体は、上記のストアにある自己署名証明書です。クリックして証明書パスを表示すると、エラーは表示されません (ルート証明書も自己署名証明書です)。ルート証明書は、信頼されたルート証明機関に手動でインポートされました。

エラー メッセージから、証明書の 1 つで証明書チェーンにエラーがあると予想していましたが、そうではありません。何か案は?

アップデート

Web サービスにアクセスするためのブラウザとして Internet Explorer 9 を使用しています。プログラム的には、C# コンソール アプリケーションを使用しています。

4

3 に答える 3

2

私はこの問題を抱えていました-これは私が提案するものです:

サーバー上で、ルート証明書がコンピューターの「現在のユーザー」ではなく「ローカル コンピューター」側にあることを確認します。もう 1 つは、SSL 証明書をルート証明書から派生させる必要があることです。最終的に、次の行を含むスクリプトを使用してすべてを機能させることができました。

rem creates root authority file and cert in localmachine\root and gives it the right to sign certs 
makecert.exe -a sha1 -n CN=RootCert RootCertName -sr LocalMachine -ss Root -sky signature -pe -r -sk MyNewKey -cy authority  

rem creates ssl cert, puts it in the currentuser\Personal store, signing it based on the root cert
makecert.exe  -n cn=HostURL SSLCertName -is root -ic RootCertName  -sky exchange -pe -sv SSLCertPrivateKeyName -eku 1.3.6.1.5.5.7.3.1

複雑で面倒な作業です。あなたはそれを続けなければなりません。

于 2013-08-13T12:47:04.987 に答える
1

net.tcp バインディングを使用して自己ホスト型 WCF サービスに接続しようとしたときに、同様の問題に直面しました。CurrentUser 証明書ストアにインストールされている自己署名ルート CA 証明書が既にあり、クライアントはルート CA 証明書によって署名された証明書を使用していました。

LocalComputer 証明書ストアにルート CA 証明書をインストールすると、「信頼されたルート機関に対して証明書チェーンを構築できませんでした」というエラーが修正されました。私の WCF サーバー プロセスは現在のユーザー アカウントを使用して実行されるため、この手順は明確ではありませんでした。

次のエラーは「失効機能は証明書の失効を確認できませんでした」でした。

これを修正するために、ルート CA 証明書の空の証明書失効リストを作成し、LocalComputer 証明書ストアに CRL をインストールしました。(詳細については、このリンクを確認してください: https://msdn.microsoft.com/en-us/library/ff648732.aspx )

また、サーバー証明書とクライアント証明書の両方の失効チェック モードをオフラインに設定しました。

defaultCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.Offline;
            defaultCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
                X509CertificateValidationMode.ChainTrust;

これで、証明書の検証をオフにしたり、開発用に別の検証モードを使用したりする必要がなくなりました (私の場合、生産コードも当面の間、自己署名証明書を使用します)。

于 2016-04-04T11:36:33.837 に答える