CertEnroll を使用して Windows 7 に証明書をインストールできない
-
26-09-2019 - |
質問
IE の XenRoll を使用して Windows XP ユーザーに証明書を発行する既存の証明書発行アプリケーション (C#、ASP.NET、JavaScript) があります。これを拡張して、IE を使用する Windows Vista および Windows 7 ユーザーをサポートする必要があります。
Vista および 7 では、Microsoft は XenRoll ActiveX コントロールを新しい CertEnroll コントロールに置き換えました。Vista SP2 ではこれが機能しましたが、7 ではインストール手順で次のエラーが発生します。
CertEnroll::CX509Enrollment::InstallResponse:証明書チェーンは処理されましたが、信託プロバイダーによって信頼されていないルート証明書で終了しました。0x800b0109 (-2146762487)
関連する HTML と JavaScript のスニペットを次に示します。
<object id="classFactoryObj" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"></object>
<script type="text/javascript">
function InstallCert()
{
try
{
var classFactory = document.getElementById("classFactoryObj");
var objEnroll = classFactory.CreateObject("X509Enrollment.CX509Enrollment");
var signedCert = '-----BEGIN CERTIFICATE-----' +
'REMOVED FOR BREVITY' +
'-----END CERTIFICATE-----';
objEnroll.Initialize(1); // User context
objEnroll.InstallResponse(4, signedCert, 6, ""); // AllowUntrustedRoot = 4
alert('Certificate installed');
}
catch (ex)
{
alert('Unable to install certificate: ' + ex.description);
}
}
InstallCert();
</script>
ルート証明書が信頼されていないのは事実ですが、最初のパラメータを 4 に設定して InstallResponse を呼び出しています。これにより、ルート証明書が信頼されない場合でもインストールが許可されることになっています。これは、Vista では宣伝どおりに機能しますが、Windows 7 では機能しないようです。
テストしたところ、ルート証明書が信頼されていれば機能します。きっと誰かがそう言うだろうと思うので、先回りして言います。クライアントにルート証明書を信頼させることは、私たちにとって実際には選択肢ではありません(顧客の認証の一環として、クライアント認証証明書を顧客に配布したいと考えています)当社のネットワーク上)。
ここで私は何か間違ったことをしていますか?他にWindows 7でこれを動作させた人はいますか?
解決
ソリューションをインストールすることでした修正プログラムKB 2078942 のます。
この修正プログラムはこの問題を解決することを主張しませんが、それはないことに注意してください!むしろannonying、または私はもっと早くそれに遭遇しているだろう: - /
修正プログラムのVista用があったとして、私は信じてこれはビスタからの回帰バグがあり、私が経験していた正確な問題を修正します。
Aありがとうとupvoteは私がこの問題を解決する支援しようと、昨日の時間を過ごすためにブルーノに出かけるます。
他のヒント
私が書いた このスクリプト しばらく前にデモのために(と組み合わせて) このページ)。サポートします <keygen/>
それを次のように置き換えます X登録 または 証明書登録 Internet Explorer で呼び出します。プロジェクトはそれ以来少し進化しましたが、テストしたばかりです この支店 Windows 7上のIE8で動作しました。CA 証明書がクライアント マシン上にまったくありませんでした。ActiveX を実行するには、セキュリティ設定を「低」に下げる必要がありました (そうしないと、要求を送信することさえできないため、応答で証明書をインストールすることさえできなくなります)。
それが役立つ場合は、次のようにします。
try {
enrollObj.InstallResponse(4, xmlHttpRequest.responseText,
0, "");
window.alert("A certificate has been installed.");
} catch (e1) {
try {
enrollObj.InstallResponse(0,
xmlHttpRequest.responseText, 0, "");
window.alert("A certificate has been installed.");
} catch (e2) {
window
.alert("You're probably using Vista without SP1 or above, in which case you need to add the certificate of this authority as a trusted root certificate.");
}
}
これら 2 つのケースのどちらが使用されたかをテストしなかったことを認めなければなりません (同じ警告メッセージであるため)。