- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我以前问过这个问题,但没有得到任何帮助。我取得了一些进展,但又因新错误而陷入困境。
我必须使用一个安全设备来保存 key 对和 CA 证书。当应用程序与需要相互身份验证的服务器建立 TLS 连接时,我现在必须使用此设备。我有一个能够与安全设备通信的“KeyPair”类。
我的问题是,当建立 ssl 连接时,我在客户端收到错误“tlsv1 alert unknown ca”,在服务器上收到“SSL3_GET_CLIENT_CERTIFICATE:no certificate returned”。我的调试日志显示 SSL 上下文确实以信任管理器的身份查询我的对象。首先调用我的 checkServerTrusted() 函数,它通过了。接下来调用 chooseClientAlias() 函数,然后调用带有客户端别名的 getPrivateKey() 函数。此时我从设备中提取私钥并将其返回。接下来调用函数 getCertificateChain(),我获取并返回数组中的匹配证书及其签署者 CA。我的调试输出显示返回的证书为:
Subject DN: CN=be2576a357228b303189ab62bd2497807d2276493ddfc6fd037a0c8fc6e9ac9a,C=YY,E=a@b.com
Issuer DN: O=myCompany,E=email@mydomain.net,L=myCity,ST=myState,C=XX,CN=LJB
Serial Num = 3877882041
Subject DN = O=myCompany,E=email@mydomain.net,L=myCity,ST=myState,C=XX,CN=LJB
Issuer DN = O=myCompany,E=email@mydomain.net,L=myCity,ST=myState,C=XX,CN=LJB
Serial Num = 10069430368951295741
然后 SSL 连接暂停,然后出现上述错误。
我已经扩展了“KeyPair”类来充当 key 和信任管理器,如下所示:
public class Keypair implements X509KeyManager, X509TrustManager
在这个类中,我覆盖了这些管理器的所有函数,以查看何时调用什么。我的应用程序将始终是对服务器工作的客户端。
因此,在创建此类对象期间以及在设备上对 key 对的所有测试都成功之后,我创建了一个使用特定 key 对的 SSL 上下文。目前设备上只有一对 key 。我用...
sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(new KeyManager[] {this}, new TrustManager[] {this}, new SecureRandom());
稍后任务将使用此对象创建到服务器的连接
protected boolean Connect(String host, int port) {
SSLSocketFactory factory = getKeypair().getSecureSocketFactory();
socket = (SSLSocket) factory.createSocket(host, port);
:
}
其中 getSecureSocketFactory() 函数只是从 key 对类对象返回 sslCtx.getSocketFactory()。
我搜索了很多,看到了创建工厂等的代码,但没有一个能够帮助我。我不想创建任何 key 存储 - 这就是设备的用途。
那么错误指的是哪个“CA”?服务器证书也是由上述 CA 直接签名的。如果我不需要客户端进行身份验证,则连接有效。我正在使用 Android 4.1.2 的手机上进行测试。
跟进:我确信我的问题出在我的 getCertificateChain() 函数上。我只是包含了我从安全设备中检索到的公共(public)证书和 CA 证书。它不应该使用 Android 附带的任何证书。那么,有人可以就退回链条的规则给我一些建议吗?我对“链”的理解是否正确:这必须是与私钥匹配的证书以及直到主 CA(自签名)的所有证书?”
最佳答案
为了设置您的 TrustManager,我使用了在某处找到的一些实用函数:
void trustCertificate(X509Certificate cert) {
if (cert!=null) {
try {
KeyStore.TrustedCertificateEntry x = new KeyStore.TrustedCertificateEntry(cert);
sslKeystore.setEntry(cert.getSubjectDN().getName(), x, null);
} catch (KeyStoreException e) {
e.printStackTrace();
}
saveKeystore();
}
}
private void createKeystore() {
try {
sslKeystore.load(null,null);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore)null);
// Copy current certs into our keystore so we can use it...
// TODO: don't actually do this...
X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0];
for (X509Certificate cert : xtm.getAcceptedIssuers()) {
sslKeystore.setCertificateEntry(cert.getSubjectDN().getName(), cert);
}
} catch (Exception e) {
e.printStackTrace();
}
saveKeystore();
}
private void saveKeystore() {
try {
sslKeystore.store(new FileOutputStream(keystoreFile), KEYSTORE_PASSWORD.toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
}
来自调用类:
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = new BufferedInputStream(cafile);
Certificate ca = null;
try {
ca = cf.generateCertificate(caInput);
} catch(Exception e) {
}
finally {
caInput.close();
}
certManagerCA.trustCertificate((X509Certificate) ca);
KeyStore keyStoreCA = certManagerCA.sslKeystore;
tmf = TrustManagerFactory.getInstance("X509");
tmf.init(keyStoreCA);
关于java - android自定义信任和 key 管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22269458/
从今天早上开始,我的证书在 Android 上不再受信任,然后我的应用程序无法再连接: Catch exception while startHandshake: javax.net.ssl.SSL
我想知道是否有人有解决方案允许从usize类型(从访问数组索引或获取矢量长度中获得)的隐式转换为i32?可能吗? 当然,我假设矢量长度和数组范围在i32限制之内。 最佳答案 您可以在函数参数中使用 T
我用 mitmproxy从离开我们网络的出站 AS2 (HTTP) 请求中收集情报。架构是这样的: Mendelson AS2 ➡ mitmproxy ➡ partner AS2 server
我有几个实例,我的 Javascript 代码似乎在泄漏内存,但我不确定我应该从垃圾收集器那里得到什么。 例如 var = new Object() 在 Firefox 中运行的间隔计时器函数似乎会随
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我想我在这里没有想法。 我正在尝试使用具有 ssl 证书的 java 中的 Web 服务。 我创建了一个 keystore 文件,并在其中添加了证书。该文件位于我的项目文件夹中。 我使用以下方式导入它
我在/etc/pki/ca-trust/source/anchors 中添加了一个 crt,这样服务器证书就可以被 ssl 客户端信任。所以,例如,当我 curl https://证书自动受信任。 有
我搜索了很多帖子,但找不到任何解决方案或问题的答案。如何从安装了中间证书的站点下载文件?使用 DownloadManager 时,出现错误“java.security.cert.CertPathVal
我无法使用 SSL: 我从服务器下载了证书,它运行良好。 我还使用本文中的代码将 myCertificate.cert 添加到我的 iPhone 钥匙串(keychain)线程:Importing a
首先,我知道信任所有证书可能存在的风险,但是出于某些测试目的,我必须实现这一点。 如何强制我的客户信任所有证书?我正在使用 javax.websocket 来实现 我所做的只是像连接到 ws 一样 W
信任 $_SERVER['REMOTE_ADDR'] 是否安全?可以通过更改请求的 header 或类似的东西来代替吗? 这样写安全吗? if ($_SERVER['REMOTE_ADDR'] ==
我有一个产品由内部 ASP.NET/MVC 网站组成,所有网站都使用 WIF 通过自定义 STS/IdP 服务启用 SSO。我们现在有一个新的合作伙伴站点托管在我们网络之外的另一个域上,并且希望在用户
我在我开始构建的 Rails 应用程序上使用 sendgrid。我处于测试模式,主要做本地工作,但我发送了很多电子邮件来检查我的流程或电子邮件布局。 我用来接收电子邮件的电子邮件是在 Gmail 上。
我一直在研究我得到的原因: java.util.concurrent.ExecutionException: javax.net.ssl.SSLException: Received fatal al
我有 SVN 服务器通过 HTTPS 在 Apache 下运行 这是我的服务器端配置,“/etc/httpd/conf.d/subversion.conf”: SSLRequireSSL S
我有一个用于开发测试的自签名证书。我已将它添加到证书管理器中的“受信任的根证书颁发机构”文件夹下,当在 IE 或 Chrome 下访问该站点时,它被认为是有效的(在 Firefox 下它不喜欢它是自签
我遇到了 android 4 设备的问题,这些设备在连接到服务器时收到以下异常: java.security.cert.CertPathValidatorException: Trust anchor
我是一个安卓新手。这个问题已经被问过很多次了,但我已经解决了这里几乎所有的问题。 我正在尝试在 Node.Js 服务器(使用 express)和 Android 上的 Volley 上使用自签名证书。
我想使用 WebClient 从安全服务器检索 JSON 文件,但我的 Windows Phone 8 不允许我这样做,因为如果 WebCLient 不信任 SSL 证书,它会抛出异常。 问题在于它不
我正在编写服务器以支持适用于 iOS 和 Android 的基于位置的应用程序。该应用程序要求我们验证用户的身份及其位置。我知道如何做前者,但不知道后者。 是否可以验证客户端发送给我的纬度/经度实际上
我是一名优秀的程序员,十分优秀!