让WPF Browser Application自动下载并安装数字证书

原文地址:http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Fstarlee

在我的那篇《给WPF Browser Application创建数字证书》一文中,我提供了一个给WPF Browser Application创建数字证书的方法,从而避免出现“Trust Not Granted”的错误,而使它成为一个真正的“full trust”的WPF Browser Application。
    可是为了在客户端电脑上用浏览器访问这个WPF Browser Application,就必须在客户端电脑上安装数字证书。要是有很多客户端访问的话,他们都要自己去下载和安装数字证书。为此,就必须给用户提供一个可供下载的数字证书和数字证书的安装方法。可以说,是给用户带来了很多不便。
    下面就提供一种让客户端用浏览器访WPF Browser Application时自动下载并安装数字证书的方法。
    这个方法包含两个大步骤:首先,是写一个下载并安装数字证书的程序;然后,是将这个程序包含到WPF Browser Application的安装程序中。
    下载并安装数字证书的程序比较简单,只要用C#创建一个Console Application,然后添加如下的代码就行了。(本例中创建的是一个名为CertificateInstaller的控制台程序)

using System;  
using System.Net;  
using System.Windows.Forms;  
using System.Security.Cryptography.X509Certificates;  
namespace CertificateInstaller  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            try 
            {  
                if (args.Length > 0)  
                {  
                    WebClient webclient = new WebClient();  
                    byte[] certificatefile = webclient.DownloadData(args[0]);  
                    if (certificatefile.Length > 0)  
                    {  
                        InstallCertificate(StoreName.AuthRoot, certificatefile);  
                        InstallCertificate(StoreName.TrustedPublisher, certificatefile);  
                    }  
                    else 
                    {  
                        ShowErrorMessage("Can't download the certificate file.");  
                    }  
                }  
            }  
            catch (System.Exception ex)  
            {  
                ShowErrorMessage(ex.Message);  
            }  
        }  
        static void InstallCertificate(StoreName storageName, byte[] certificatefile)  
        {  
            X509Certificate2 certificate = new X509Certificate2(certificatefile);  
            X509Store store = new X509Store(storageName, StoreLocation.LocalMachine);  
            store.Open(OpenFlags.ReadWrite);  
            store.Remove(certificate);  
            store.Add(certificate);  
            store.Close();  
        }  
        static void ShowErrorMessage(string strErrorMessage)  
        {  
            MessageBox.Show(strErrorMessage, "Certificate Installation Error", MessageBoxButtons.OK, MessageBoxIcon.Error);  
        }  
    }  
}

下面是将编译好的CertificateInstaller.exe添加到WPF Browser Application的安装程序中的步骤。
    1. 到目录C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\下找到WindowsInstaller3_1文件夹。
    2. 拷贝并粘贴WindowsInstaller3_1文件夹,并重命名为CertificateInstaller。
    3. 将CertificateInstaller.exe拷贝到C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CertificateInstaller文件夹下。
    4. 将该文件夹中的Product.xml改成如下的内容。

<?xml version="1.0" encoding="utf-8" ?> 
<Product 
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  ProductCode="CertificateInsteraller" 

    <PackageFiles CopyAllPackageFiles="true"> 
        <PackageFile Name="CertificateInstaller.exe" /> 
    </PackageFiles> 
    <Commands Reboot="Immediate"> 
        <Command PackageFile="CertificateInstaller.exe" 
                 Arguments= 'http://XXX/xxx.cer'
                 EstimatedInstallSeconds="30" > 
            <ExitCodes> 
                <ExitCode Value="0" Result="Success"/> 
                <ExitCode Value="1641" Result="SuccessReboot"/> 
                <ExitCode Value="3010" Result="SuccessReboot"/> 
                <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" /> 
            </ExitCodes> 
        </Command> 
    </Commands> 
</Product> 
<?xml version="1.0" encoding="utf-8" ?>

<Product
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  ProductCode="CertificateInsteraller"
>

    <PackageFiles CopyAllPackageFiles="true">
        <PackageFile Name="CertificateInstaller.exe" />
    </PackageFiles>

    <Commands Reboot="Immediate">
        <Command PackageFile="CertificateInstaller.exe"
                 Arguments= 'http://XXX/xxx.cer'
                 EstimatedInstallSeconds="30" >
            <ExitCodes>
                <ExitCode Value="0" Result="Success"/>
                <ExitCode Value="1641" Result="SuccessReboot"/>
                <ExitCode Value="3010" Result="SuccessReboot"/>
                <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
            </ExitCodes>
        </Command>
    </Commands>
</Product>
    里面的“http://XXX/xxx.cer”就是可供下载的数字证书的链接(可以跟WPF Browser Application放到同一个Web Server上,这样管理起来方便一些。当然,也可以放在任何一个用户可以访问的Web Server上)。
    5. 进入“en”文件夹,并将Package.xml改成如下的内容。

<?xml version="1.0" encoding="utf-8" ?> 
<Package 
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  Name="DisplayName" 
  Culture="Culture" 

    <Strings> 
        <String Name="DisplayName">My Certificate Insteraller</String> 
    </Strings> 
</Package> 
<?xml version="1.0" encoding="utf-8" ?>

<Package
  xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
  Name="DisplayName"
  Culture="Culture"
>

    <Strings>
        <String Name="DisplayName">My Certificate Insteraller</String>
    </Strings>

</Package>

    6. 打开WPF Browser Application。
    7. 在属性面板里面选择“Publish”选项,点击“Preequisites...”按钮。

让WPF Browser Application自动下载并安装数字证书_第1张图片

    8. 在弹出的“Preequisites”对话框中选中“Create setup program to install prerequisite components”,并在列表中找到“My Certificate Insteraler”(如果找不到的话,关闭VS再重新打开),选中它并点击“OK”按钮。

让WPF Browser Application自动下载并安装数字证书_第2张图片

    9. 重新发布WPF Browser Application。

    下面是用户在客户端安装数字证书的步骤。
    1. 用户在客户端用浏览器访问WPF Browser Application时会出现类似下面这样的页面。

让WPF Browser Application自动下载并安装数字证书_第3张图片

    可以看到“My Certificate Insteraler”已经被包含在安装程序中了。
    2. 点击“Run”按钮,会弹出下面的对话框。

让WPF Browser Application自动下载并安装数字证书_第4张图片

    3. 点击“Run”按钮,并在弹出的对话框上继续点击“Run”按钮。

让WPF Browser Application自动下载并安装数字证书_第5张图片

    4. 这个时候就会弹出安装对话框,点击“Install”按钮就会运行CertificateInstaller.exe,自动下载并安装数字证书。

让WPF Browser Application自动下载并安装数字证书_第6张图片

  通过上面的步骤,数字证书就自动安装到了客户端电脑上了。以后用户就可以直接访问WPF Browser Application了。

你可能感兴趣的:(application)