1

このコードを使用して、自己署名証明書をインストールします (ユーザーはインストールを確認する必要があります)。

    // Constructor
    public MainPage()
    {
        this.Loaded += new RoutedEventHandler(MainPage_Loaded);

    }
    private async void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        try
        {
            StorageFolder packageLocation = Windows.ApplicationModel.Package.Current.InstalledLocation;
            StorageFolder certificateFolder = await packageLocation.GetFolderAsync("Certificates");
            StorageFile certificate = await certificateFolder.GetFileAsync("myCer.cer");

            await Launcher.LaunchFileAsync(certificate);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }

アプリを起動するたびに証明書をインストールする必要がないように、証明書が既にインストールされているかどうかを確認することはできますか?

4

2 に答える 2

1

証明書はさまざまな方法で比較できますが、最も一般的な 2 つは

  • 拇印で
    • 公開鍵の暗号ハッシュ
    • リクエストに応じて計算 - 証明書自体には保存されません
    • すべての証明書で一意
    • 衝突耐性のあるハッシュ アルゴリズムを使用すると偽造が困難 ( http://en.wikipedia.org/wiki/Preimage_attack )
  • シリアル番号と発行者別
    • PKI を使用する場合は一意であることが義務付けられています
    • 計算が不要なため比較が高速
    • チェーンの信頼を検証している場合にのみ信頼できます。攻撃者は、選択したシリアル番号と発行者名で自己署名証明書を生成する可能性があります。

コード内:

X509Certificate cert1 = /* your cert */;
X509Certificate cert2 = /* your other cert */;

// assuming you are validating pki chain
// X509Certificate compares the serial number and issuer
bool matchUsingSerialAndIssuer = cert1.Equals(cert2);

// otherwise
bool publicKeyIsIdentical = cert1.GetCertHashString() == cert2.GetCertHashString();
// or easier to read if using X509Certificate2 (Thumbprint calls GetCertHashString)
// bool publicKeyIsIdentical = cert1.Thumbprint == cert2.Thumbprint;
于 2013-08-11T18:46:20.733 に答える
0

証明書を見つけるためにこのようなことを試してみませんか。また、この名前空間をプロジェクト System.Security.Cryptography.X509Certificates に組み込みます。X509 を使用できない場合は、以下のコードを変更して証明書に別のタイプを使用できます。

 private static X509Certificate2 GetCertificateFromStore(string certSN)
        {

            X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
            try
            {
                store.Open(OpenFlags.ReadOnly);
                X509Certificate2Collection col = store.Certificates;

                foreach (var currCert in col)
                {
                    var currSN = currCert.SerialNumber;
                    if (certSN.ToUpperInvariant() == currSN)
                    {
                        return currCert; // you found it return it
                        break;
                    }

                }

                return null; // you didnt now install it...
            }
            finally
            {
                store.Close();
            }


        }
于 2013-02-22T21:28:52.110 に答える