首页 > 解决方案 > 如何使用我自己的 CA 证书在 stunnel 和 Android 应用程序之间建立 TLS 连接

问题描述

我的服务器上运行了stunnel,配置如下:

[myservice]
accept = 12345
connect = 9999
verifyPeer = yes
cert = /etc/stunnel/stunnel.pem
CAfile = /etc/stunnel/androidApp.crt

两者都由同一个私有 CA 颁发certCAfile

我想在 stunnel(在端口上12345)和我的 Android 应用程序之间实现安全通信。此外,我希望 stunnel 验证对等方(其证书已由与 stunnel 相同的 CA 颁发),另一方面,Android 应用程序还应验证 stunnel(服务器)部分的身份。

在我的应用程序中,我有以下代码

// ...
InputStream caInputStream = ctx.getResources().openRawResource(R.raw.android_app); //PKCS12
KeyStore keyStore;
KeyManagerFactory keyManagerFactory;
SSLContext sslContext;
SSLSocketFactory sslSocketFactory;
Socket socket;

keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(caInputStream, "password".toCharArray());

keyManagerFactory = KeyManagerFactory.getInstance("X509");
keyManagerFactory.init(keyStore, "password".toCharArray());

sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), null, SecureRandom.getInstance("SHA1PRNG"));

sslSocketFactory = sslContext.getSocketFactory();
socket = sslSocketFactory.createSocket("hostname", 12345);
// ...

创建套接字后,我从 stunnel 获得以下日志:

2021.05.13 17:01:21 LOG5[2]: Service [myservice] accepted connection from XXX.XXX.XXX.XXX:YYYYY                                                                                          
2021.05.13 17:01:21 LOG6[2]: Peer certificate required
2021.05.13 17:01:25 LOG3[2]: SSL_accept: 1417C0C7: error:1417C0C7:SSL routines:tls_process_client_certificate:peer did not return a certificate                                          
2021.05.13 17:01:25 LOG5[2]: Connection reset: 0 byte(s) sent to TLS, 0 byte(s) sent to socket

在这个阶段,我完全意识到我在做一些根本错误的事情(比如我没有发送对等证书),但我有点困惑如何做到这一点。你能帮我解决这个问题吗?

干杯

标签: javaandroidsslssl-certificatestunnel

解决方案


这是一个假设,但您打开的 PKCS12 文件似乎不包含私钥。

添加私钥 -> 创建 CSR -> 使用 CA 签名 -> 将链导入密钥库。

其他一切看起来都井井有条。


推荐阅读