java - 如何使用我自己的 CA 证书在 stunnel 和 Android 应用程序之间建立 TLS 连接
问题描述
我的服务器上运行了stunnel,配置如下:
[myservice]
accept = 12345
connect = 9999
verifyPeer = yes
cert = /etc/stunnel/stunnel.pem
CAfile = /etc/stunnel/androidApp.crt
两者都由同一个私有 CA 颁发cert
。CAfile
我想在 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
在这个阶段,我完全意识到我在做一些根本错误的事情(比如我没有发送对等证书),但我有点困惑如何做到这一点。你能帮我解决这个问题吗?
干杯
解决方案
这是一个假设,但您打开的 PKCS12 文件似乎不包含私钥。
添加私钥 -> 创建 CSR -> 使用 CA 签名 -> 将链导入密钥库。
其他一切看起来都井井有条。
推荐阅读
- javascript - 带路径的 vue-persistedstate 减速器
- java - Pinging 服务器偶尔会离线返回 java Minecraft
- python - 如何使用正则表达式从迭代器中获得完全匹配?
- android - 如何用图片制作自定义形状(形状内部)
- javascript - javascript 使用 serializeObject() 使用嵌套对象值序列化表单
- matlab - 为什么我的 PDE 模型的总能量不随时间守恒?
- wordpress - WordPress:如何根据另一个高级自定义字段设置特定角色
- python - 在 Python3 中使用 filter() 从字典值列表中删除一个列表
- react-native - react native:如何刷新屏幕(按下按钮时调用api)
- python - python我得到一个错误字典更新序列元素#0的长度为1;我的 python 程序中需要 2