gpt4 book ai didi

安卓和客户端证书

转载 作者:行者123 更新时间:2023-12-02 01:55:00 26 4
gpt4 key购买 nike

我已经搜索了几周,但似乎无法在任何地方找到答案。我正在尝试为 Android 执行以下操作。此代码来 self 编写的 C# 应用程序,但正在将其移植到 Android。 Web 端点需要将证书附加到相互身份验证请求以进行 Web 服务调用。

        string certThumbprint = "E1313F6A2D770783868755D016CE748F6A9B0028";
X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
certStore.Open(OpenFlags.ReadOnly);
}
catch (Exception e)
{
if (e is CryptographicException)
{
Console.WriteLine("Error: The store is unreadable.");
}
else if (e is SecurityException)
{
Console.WriteLine("Error: You don't have the required permission.");
}
else if (e is ArgumentException)
{
Console.WriteLine("Error: Invalid values in the store.");
}
else
{
throw;
}
}
X509Certificate2Collection certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, certThumbprint, false);
certStore.Close();
if (0 == certCollection.Count)
{
throw new Exception("Error: No certificate found containing thumbprint " + certThumbprint);
}
X509Certificate2 certificate = certCollection[0];
return certificate;

然后我正在这样做(请求是一个 HttpWebRequest):

request.ClientCertificates.Add(cert);

这在 C# 中工作正常,但是当我转移到 Android 时,我在 getInputStream() 调用中收到“找不到文件”错误。这是我的 Android 代码:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);
CertificateFactory cf = CertificateFactory.getInstance("X.509");

InputStream caInput = new BufferedInputStream(new FileInputStream("/sdcard/Certificate.pfx"));
KeyHelper kh = new KeyHelper();
Certificate ca = kh.GetKey("Password");
String keyStoreType = KeyStore.getDefaultType();
keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "Password".toCharArray());
SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(),null,new SecureRandom());
HttpsURLConnection urlConnection =
(HttpsURLConnection)url.openConnection();
urlConnection.setRequestProperty("x-ms-version",AZURE_REST_VERSION);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("GET");
urlConnection.setSSLSocketFactory(context.getSocketFactory());
urlConnection.connect();

InputStream in = new BufferedInputStream(urlConnection.getInputStream()); //<-----Blows up here

} catch (KeyStoreException e) {
throw new KeyStoreException("Keystore Exception",e);
} catch (NoSuchAlgorithmException e) {
throw new NoSuchAlgorithmException("Algorithm exception",e);
} catch (KeyManagementException e) {
throw new KeyManagementException("Key Exception", e);
}

我尝试将 fiddler 放在模拟器和端点之间,它返回 200。我认为这是因为我的证书在我的开发机器上的本地私有(private)存储中。有什么想法吗?

最佳答案

好的。我找到了这个问题的答案。问题在于自签名证书只有存在于 android TrustStore 中才能使用。但是,默认的 TrustStore 在应用程序启动后是只读的,因此很难对其进行修改。我正在设置自己的自定义信任库,但是根证书不是其中的一部分,因此调用任何 https 都会失败。解决方案来自这篇博文:

http://nelenkov.blogspot.com/2011/12/using-custom-certificate-trust-store-on.html

长话短说,设置一个包含自签名证书的自定义 TrustStore,然后从默认信任库导出所有证书并将它们导入自定义信任库。然后使用该信任库来设置您的 SSL 上下文(还需要使用自定义 keystore ,因为客户端证书也需要附加到请求中)。我相信,如果我不允许自签名证书,这也没什么大不了的,因为客户端证书的根证书将存在于默认的 TrustStore 中(或者至少我希望如此)。

关于安卓和客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20747873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com