我相信我已经做了我应该做的一切,根据相关的文章,但我仍然得到这个错误。我已经创建了自己的CA,并使用此CA签署了服务器证书。在Android方面,我使用自定义信任库创建了一个自定义TrustManager,其中包含这个CA根证书。在服务器端使用System.setProperty("javax.net.debug","ssl") (遗憾的是,它在安卓端无法工作,甚至在4.4中),我得到了一些更多的信息。我通过服务器你好和秘密密钥的交换。然后Android给了我上面的错误(没有找到证书路径的信任锚),在服务器端,我得到了javax.net.ssl.SSLException:入站关闭,然后才收到对等程序的close_notify:可能的截断攻击?
我在我的个人电脑上镜像了应用程序(客户端),它可以工作。
是安卓不支持使用SHA512withRSA的2048个密钥吗?我对自签名证书(1024和SHA1withRSA)没有问题;也没有尝试过使用2048年和SHA512的自签名证书.
不知何故,我相信这是安卓系统的一个缺点,它没有被记录下来,也没有被发现(有点像System.setProperty("javax.net.debug","ssl")不起作用)。
我实际上实现了我自己的KeyManager和TrustManager以及密钥库和信任库,因为最终我将需要相互的TLS。都在电脑上工作。希望这将是一个简单的迁移到Android。
下面是Keystores/Truststores的Android设置(获取文件并加载它们)
LoadFile(getString(R.string.truststore_filename), R.raw.androidtruststore);
LoadFile(getString(R.string.keystore_filename), R.raw.androidkeystore);
String basePath = getFilesDir().getAbsolutePath() + "/";
SecureRawHttpWanSender.setSecureProperties(basePath + getString(R.string.truststore_filename),
getString(R.string.truststore_password),
basePath + getString(R.string.keystore_filename),
getString(R.string.keystore_password),
true);
下面是在PC上也使用的TrustManagers ()中所做的setSecureProperties等的设置。只有文件的加载不同(PC使用jks,Android使用bks)。
FileInputStream fIS = null;
try
{
// On Android this is "BKS". Otherwise Sun Java is "JKS"
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
Manager.log.log(Level.Info, Task.WanSecure, "Type of truststore: " + trustStore.getType());
fIS = new FileInputStream(trustStoreFileName);
trustStore.load(fIS, trustStorePassword.toCharArray());
fIS.close();
tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
if(keyStoreFileName != null)
{
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
Manager.log.log(Level.Info, Task.WanSecure, "Type of keystore: " + keyStore.getType());
fIS = new FileInputStream(keyStoreFileName);
keyStore.load(fIS, keyStorePassword.toCharArray());
fIS.close();
kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, keyStorePassword.toCharArray());
}
return true;
}
谢谢你的帮助(我所做的任何事情都是愚蠢的!)
发布于 2014-03-11 03:16:30
我找到了解决上述问题的办法,但我不喜欢。实际上,我可能在与这个主题相关的问题之一中提到过这个问题。我所做的是将由CA签名的服务器证书添加到android信任库中。因此,在我的信任库中,我有两个服务器证书,一个是由CA签名的服务器证书,另一个是CA根证书。
我不喜欢的是不一致。在我的Windows 7 PC上,我不需要由CA签名的服务器证书,只要有CA根就足够了。如果服务器证书是由CA签名的,而CA可能是由信任库中的根CA验证的,但是中间CA的证书不在信任库中,我可以理解对中间证书的需求。然后锁链就断了。
为什么我需要CA根签名的服务器证书,加上Android上的根CA,而只需要我的PC上的根CA,这是一个很大的困惑。我认为这是Android的一个典型的不完全实现。正如我所发现的,XML模式验证的情况就是如此!
https://stackoverflow.com/questions/22313892
复制