gpt4 book ai didi

android - 在 Android 应用程序中配置 SSL 客户端证书以在 Tomcat 上的 Web 服务器中进行客户端身份验证

转载 作者:行者123 更新时间:2023-11-28 22:57:00 24 4
gpt4 key购买 nike

我在我的计算机上本地安装了 apache 服务器并运行 .我从用于服务器身份验证的 SSL 服务器证书开始。为此,我将服务器 keystore 路径添加到 tomcat 的 server.xml 文件,并将服务器证书添加到 Android 应用程序中 SSL 上下文的信任库。它工作得很好。

现在我需要为客户端身份验证配置相同的内容。为此,我创建了一个客户端 keystore 并将该 keystore 存储在 android 应用程序的 resources/raw 文件夹中,并将其放入 android 应用程序的 keystore 中。

我使用以下命令为服务器和客户端创建了 keystore 。

keytool -genkey -alias server -keyalg RSA -keystore server.jks
keytool -genkey -alias client -keyalg RSA -keystore client.jks
keytool -export -file server.cert -keystore server.jks -storepass password -alias server
keytool -export -file client.cert -keystore client.jks -storepass password -alias client

所以我创建了 2 个 keystore ,一个用于客户端,另一个用于服务器,client.jks 和 server.jks。我有从相应 keystore 导出的 client.cer 和 server.cer 证书。

用于配置 SSL 上下文的客户端(Android 应用程序代码)。我已将 client.jks 和 server.cer 文件存储在 res/raw 文件夹中,并在下面的代码中引用它们。

public HttpClient myHttpsClient() {
HttpClient client = null;
char[] passphrase = "password".toCharArray();

try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
CertificateFactory clientcf = CertificateFactory.getInstance("X.509");
InputStream caInput = context.getResources().openRawResource(R.raw.server);
InputStream clientcert = context.getResources().openRawResource(R.raw.client);
Certificate ca;
Certificate clientca;
try {
clientca = clientcf.generateCertificate(clientcert);
ca = cf.generateCertificate(caInput);
System.out.println("ca="+ ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
clientcert.close();
}
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStoreclient = KeyStore.getInstance(keyStoreType);
keyStoreclient.load(null, null);
keyStoreclient.setCertificateEntry("ca", clientca);


// Create a KeyStore containing our trusted CAs
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);



String kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmfAlgorithm);
kmf.init(keyStoreclient,passphrase);



// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

MySSLSocketFactory socketFactory = new MySSLSocketFactory(context);//,new BrowserCompatHostnameVerifier());

client = createHttps(socketFactory);
} catch (Exception e) {
e.printStackTrace();
}

return client;

现在服务器配置如下。

<Connector SSLEnabled="true" acceptCount="100" clientAuth="false" truststoreFile="/Users/prabhuraj/client.cer" 
truststorePass="password" disableUploadTimeout="true" enableLookups="false" maxThreads="25"
port="8443" keystoreFile="/Users/prabhuraj/server.jks" keystorePass="password"
protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
secure="true" sslProtocol="TLS" />

如上配置后。 SSL 握手失败。有人可以让我知道我是否配置错误吗?提前致谢。

最佳答案

您没有使用 KeyManagerFactory 来初始化 SSLContext

改变:

context.init(null, tmf.getTrustManagers(), null);

context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

但是,您用于客户端身份验证的证书将需要它的私钥。查看此帖子以获取解释:https://stackoverflow.com/a/11199270/2762154

关于android - 在 Android 应用程序中配置 SSL 客户端证书以在 Tomcat 上的 Web 服务器中进行客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24629386/

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