Xamarin.Android Http 客户端允许我从 KeyStore 添加客户端证书

K.肯普斯基

我正在尝试添加从这种方法中获得的客户端证书:

    private X509Certificate[] GetCertificateChain(string alias)
    {
        try
        {
            return KeyChain.GetCertificateChain(this, alias);
        }
        catch (KeyChainException e)
        {

        }            

        return null;
    }

System.Net.Http.HttpClientHandler 不允许我添加客户端证书。抛出 NotImplemented 异常。有什么解决办法吗?也许其他Http客户端?

亚历克斯

您需要扩展AndroidClientHandler和覆盖ConfigureCustomSSLSocketFactory

public class HttpsClientHandler : AndroidClientHandler
{
    private static readonly Logger LOG = LogManager.GetLogger();

    private SSLContext sslContext;
    private readonly ITrustManager[] trustManagers;
    private IKeyManager[] keyManagers = null;

    public HttpsClientHandler() : base()
    {
        trustManagers = GetTrustManagers();
        sslContext = GetSSLContext();
    }

    private SSLContext GetSSLContext()
    {
        string protocol;
        if (SslProtocols == SslProtocols.Tls11)
        {
            protocol = "TLSv1.1";
        } else if (SslProtocols == SslProtocols.Tls || SslProtocols == SslProtocols.Tls12)
        {
            protocol = "TLSv1.2";
        } else
        {
            throw new IOException("unsupported ssl protocol: " + SslProtocols.ToString());
        }
        SSLContext ctx = SSLContext.GetInstance(protocol);
        ctx.Init(keyManagers, trustManagers, null);
        return ctx;
    }

    public new SslProtocols SslProtocols { get; set; } = SslProtocols.Tls12;

    public void SetClientCertificate(byte[] pkcs12, char[] password)
    {
        keyManagers = GetKeyManagersFromClientCert(pkcs12, password);
        SSLContext newContext = GetSSLContext();
        sslContext = newContext;
    }

    private ITrustManager[] GetTrustManagers()
    {
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.GetInstance(TrustManagerFactory.DefaultAlgorithm);
        trustManagerFactory.Init((KeyStore)null);
        return trustManagerFactory.GetTrustManagers();
    }

    private IKeyManager[] GetKeyManagersFromClientCert(byte[] pkcs12, char[] password)
    {
        if (pkcs12 != null)
        {
            using (MemoryStream memoryStream = new MemoryStream(pkcs12))
            {
                KeyStore keyStore = KeyStore.GetInstance("pkcs12");
                keyStore.Load(memoryStream, password);
                KeyManagerFactory kmf = KeyManagerFactory.GetInstance("x509");
                kmf.Init(keyStore, password);
                return kmf.GetKeyManagers();
            }
        }
        return null;
    }

    protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
    {
        SSLSocketFactory socketFactory = sslContext.SocketFactory;
        if (connection != null)
        {
            connection.SSLSocketFactory = socketFactory;
        }
        return socketFactory;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Xamarin Android与客户端证书进行SSL通信

来自分类Dev

HTTP 客户端 Android Studio

来自分类Dev

客户端证书Android Https

来自分类Dev

Android和客户端证书

来自分类Dev

Xamarin android的Socket.IO客户端.NET示例

来自分类Dev

我如何连接http客户端

来自分类Dev

在Android上实现HTTP流客户端

来自分类Dev

Android中的自定义异步Http客户端

来自分类Dev

HTTP响应被缓存在Android客户端中

来自分类Dev

Spring HTTP客户端

来自分类Dev

Coffeescript HTTP客户端

来自分类Dev

与http客户端的会话

来自分类Dev

Android的插件摇篮3.0.0:找不到com.google.http客户端:谷歌HTTP客户端父:1.24.1

来自分类Dev

Apache Http客户端SSL证书错误

来自分类Dev

客户端证书无法在Android上运行-如何调试?

来自分类Dev

Web客户端Android

来自分类Dev

Web客户端Android

来自分类Dev

Xamarin XMPP客户端库

来自分类Dev

Xamarin Studio上的Sip客户端

来自分类Dev

我应该在异步任务的dobackground中使用android-async-http客户端吗?

来自分类Dev

使用Android异步Http客户端(Loopj)获取HTTP响应代码

来自分类Dev

从客户端调用 SignalR Hub 方法锁定 Xamarin android 应用程序

来自分类Dev

Websocketpp简单的HTTP客户端

来自分类Dev

Java http客户端和POODLE

来自分类Dev

java非阻塞HTTP客户端

来自分类Dev

爪子HTTP客户端-链请求

来自分类Dev

获取HTTP客户端的IP地址

来自分类Dev

HTTP客户端错误403

来自分类Dev

在Twisted中限制http客户端