当前位置: 首页 > 知识库问答 >
问题:

Android中不抛出SignatureException的自签名证书验证

梁丘钊
2023-03-14

在下面一段Android应用程序的代码中,服务器向连接Android客户端提供了一个自签名证书。也就是说,我已经用自己的CA签署了服务器的证书。该证书将使用CA的公钥进行验证,该公钥是从放置在/raw中的名为trust_store_ca的文件中获得的。问题是,如果我使用不同的证书(使用不同的CA签名,即),验证步骤不会抛出相应的SignatureException。我在NetBeans中测试了代码,它确实抛出了上面提到的异常。然而,在AndroidStudio中却没有。问题可能是什么?

KeyStore ts = KeyStore.getInstance("BKS");
InputStream trustin = v.getResources().openRawResource(R.raw.trust_store_ca);
ts.load(trustin, "MyKey".toCharArray());
// Create own trustmanager with self-signed cert.
final TrustManagerFactory tmf = TrustManagerFactory.
    getInstance(KeyManagerFactory.getDefaultAlgorithm());
//tmf.init((KeyStore) null);
tmf.init(ts);
trustManagers = tmf.getTrustManagers();

CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream cA_certificate = v.getResources().openRawResource(R.raw.ca_certif);
final X509Certificate caCertificate = (X509Certificate)cf
    .generateCertificate(cA_certificate);
// Check server certificate is valid
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];

wrappedTrustManagers = new TrustManager[]{
                                    new X509TrustManager() {
    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                                            return origTrustmanager.getAcceptedIssuers();
                                        }
    @Override
    public void checkClientTrusted(X509Certificate[] certs, String authType) {//Not used}

    @Override
    public void checkServerTrusted(X509Certificate[] certs, String authType) 
throws CertificateException{
    if (certs == null || certs.length == 0) {
        throw new IllegalArgumentException(
"checkServerTrusted: null or zero-length certificate chain");
    }
    if (authType == null || authType.length() == 0) {
        throw new IllegalArgumentException(
"checkServerTrusted: null or zero-length authentication type");
    }

// This does not work in Android, at least from me in JB...
//
// try { 
//      certs[0].verify(caCertificate.getPublicKey(), "BC");
//      Log.i(TAG,"Pubkey for caCertificate: "+ caCertificate.getPublicKey());
//      } catch (CertificateException | NoSuchAlgorithmException | 
//           NoSuchProviderException | InvalidKeyException | SignatureException e)
//            {Log.i(TAG,"Certificate verification exception" + e);}
//

// Do signature verification by decrypting it and comparing to expected
// value (01FFFFFFFFFFFFFFF.....FFFFFF003021300906052B0E03021A05 000414... etc)

byte[] signature = certs[0].getSignature();   // signature in server's certif.
BigInteger exp = new BigInteger("010001",16); // 65537 as usual
BigInteger decrypt_sign = new BigInteger(1, signature).modPow(exp, ca_pubkey.getModulus());
System.out.println("Signature after decryption: " +decrypt_sign);

编辑:我正在重写验证过程,因为它检测不到假证。查看我的代码版本,现在只剩下检查解密值与预期值。

为出色的解释。

同时,感谢所有帮助过你的人。:)

共有1个答案

宁卓
2023-03-14

这可能与以下事实有关:您正在吃(捕获而不是重新抛出)证书[0]可能抛出的一堆异常。验证

 类似资料:
  • 我正在尝试从我的android应用程序访问HTTPS url。我有服务器端的自签名证书(server_certificate.cer)。 我想知道如何添加自签名证书到volley网络请求信任我的自签名证书。使用http://blog.applegrew.com/2015/04/using-pinned-self-signed-ssl-certificate-with-android-volley/

  • 我的手被https、ssl、PKI之类的东西弄得脏兮兮的。对于自签名证书,有一点我不太理解。假设我想创建一个自签名证书,并在我们想要建立安全连接时将其发送给我的朋友。 所以步骤是: 创建一个私钥。 创建一个公钥。 用我的公钥在证书上签名。 因此,当我的朋友得到我的证书时,他必须验证他得到的证书是我的,他需要解密数字签名。但为了解密和验证他必须拥有我的私钥。所以,我有点困惑。

  • 我试图使用Terraform创建一个自签名证书,以便在测试/开发环境中内部使用。 我首先创建一个CA私钥,自签名证书。 然后,为要启用HTTPS的内部域名创建证书签名请求和私钥。 然后我在证书上签字。以下是我使用的整个Terraform清单: 我查了Terraform舱单。然后我从状态文件中提取生成的证书并将它们保存到文件中。 我试图用openssl验证最终证书,但得到一个错误: 你知道问题出在哪

  • 我最近升级了Inteliij IDEA 2019.2,如果我尝试从IDE中提取Git,我会发现以下错误:无法访问'https://github.xxx.com/app-Hello-USD/DGS.git/“:SSL证书问题:证书链中的自签名证书。 有人能帮我什么选项,我必须启用。 谢谢

  • 问题内容: 当尝试使用其PHP库通过Twilio发送消息时,我正在为这个错误而苦苦挣扎: 我在Windows 7上使用了wamp。 我当然找到了所有其他有关证书错误的信息。据我所知,通常更新或添加文件即可解决该问题。但是,即使这样做,我仍然遇到相同的错误。 就像这里所做的健全性检查一样,这正是我所做的: 从此处下载了最新的证书:http : //curl.haxx.se/ca/cacert.pem

  • 我尝试将带有正确应用程序ID、应用程序机密等的curl请求发送到 我需要从中获取访问令牌,但获取FALSE和print next message,否则: 我的代码是: 当我手动移动到上面的链接时,我很好地获得了访问权。为什么卷曲不起作用?请帮忙。