gpt4 book ai didi

android - 客户端证书 Android Https

转载 作者:太空狗 更新时间:2023-10-29 16:19:23 26 4
gpt4 key购买 nike

我已经在这个问题上苦苦挣扎了一个星期......我在安卓设备上安装了一个客户端证书。我的应用程序必须将文件上传到服务器,需要客户端证书才能进行握手。

是否有实现此连接的任何提示?谢谢...

最佳答案

尝试以下..

您应该拥有客户端证书的别名,该别名存储在您的安卓设备的 keystore 中。这你可以通过使用

private void chooseCert() {
KeyChain.choosePrivateKeyAlias(this, this, // Callback
new String[] {"RSA", "DSA"}, // Any key types.
null, // Any issuers.
null, // Any host
-1, // Any port
DEFAULT_ALIAS);
}

在此之后您将获得回调。你的类应该实现 KeyChainAliasCallback

在这次尝试之后..

 private void connect(){
String alias = getAliasForClientCertificate();

final X509Certificate[] certificates =getCertificateChain(alias);
final PrivateKey pk = getPrivateKey(alias);



KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());


X509ExtendedKeyManager keyManager = new X509ExtendedKeyManager() {

@Override
public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket) {
return alias;
}

@Override
public String chooseServerAlias(String s, Principal[] principals, Socket socket) {
return alias;
}

@Override
public X509Certificate[] getCertificateChain(String s) {
return certificates;
}

@Override
public String[] getClientAliases(String s, Principal[] principals) {
return new String[]{alias};
}

@Override
public String[] getServerAliases(String s, Principal[] principals) {
return new String[]{alias};
}

@Override
public PrivateKey getPrivateKey(String s) {
return pk;
}
};

TrustManagerFactory trustFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());

trustFactory.init(trustStore);

TrustManager[] trustManagers = trustFactory.getTrustManagers();



X509TrustManager[] tm = new X509TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

// public X509Certificate[] getAcceptedIssuers() {
// return certificates;
// }

public X509Certificate[] getAcceptedIssuers() {
return certificates;
}

public boolean isClientTrusted(X509Certificate[] arg0) {
return true;
}
public boolean isServerTrusted(X509Certificate[] arg0) {
return true;
}


} };
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(new KeyManager[] {keyManager}, tm, null);
SSLContext.setDefault(sslContext);

URL url = new URL("url..");
HttpsURLConnection urlConnection = (HttpsURLConnection) url
.openConnection();
urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());

HostnameVerifier hv = new HostnameVerifier() {

@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
urlConnection.setHostnameVerifier(hv);


urlConnection.setInstanceFollowRedirects(false);
urlConnection.connect();
int responseCode = urlConnection.getResponseCode();

}

private X509Certificate[] getCertificateChain(String alias) {
try {
return KeyChain.getCertificateChain(this, alias);
} catch (KeyChainException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}

关于android - 客户端证书 Android Https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18891174/

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