TLS连接:覆盖证书验证

时间:2012-11-28 09:29:38

标签: c# ssl-certificate bouncycastle ssl windows-phone-8

尽管尝试了所有安全措施,但我希望我的客户端接受自签名的X.509证书,就像我们服务器中的证书一样。我正在使用WP8 SKD以及用于Windows Phone的Bouncy Castle的C#绑定,名为bouncywp7.1,因此大多数类/方法都可用。

在Android中完成此操作的方法是创建我自己的证书信任管理器,并使其对所有证书都返回true。

public static void allowAllSSL() 
{
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(final String hostname, final SSLSession session) {
            return true;
        }
    });
    SSLContext context = null;
    try {
        context = SSLContext.getInstance("TLS");
        context.init(null, sTrustManagers, new SecureRandom());
    } catch (final NoSuchAlgorithmException catchException) {
        LoggerFactory.consoleLogger().printStackTrace(catchException);
    } catch (final KeyManagementException catchException) {
        LoggerFactory.consoleLogger().printStackTrace(catchException);
    }
    mFakeFactory = context.getSocketFactory();
    HttpsURLConnection.setDefaultSSLSocketFactory(mFakeFactory);
}

在Windows Phone 8上执行相同操作的最不痛苦的方法是什么?

1 个答案:

答案 0 :(得分:7)

AFAIK你不能在WP8上欺骗SSL。您要么使用SSL,要么不是。你无法覆盖证书验证(或者至少我从未听说过)。

如果您使用的是SSL,并且希望使用自定义证书,那么用户应该是安装它的人。例如通过向用户发送cer文件,让用户通过设置屏幕加入您的组织,甚至通过使用Luncher.LaunchFileAsync()来获取CER文件。

例如,如果在项目中包含FiddlerRoot.cer(使用Build Action = Content),您可以要求用户使用以下代码段安装它:

    private async void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Launcher.LaunchFileAsync(await Package.Current.InstalledLocation.GetFileAsync("FiddlerRoot.cer"));
    }

运行此代码段会向用户显示以下对话框:

Install Certification confirmation dialogue