Android SSL固定即使在不同的证书上也能获得成功

Android SSL固定即使在不同的证书上也能获得成功,android,ssl,public-key,certificate-pinning,Android,Ssl,Public Key,Certificate Pinning,我正在尝试做证书固定。我公司使用的网络库不支持固定。所以我必须手动操作 这是我使用的代码 protected Void doInBackground(Void... params) { String actualKey = "OpenSSLRSAPublicKey{modulus=ccf0883ebc511bb86f7f6e360385cf3a" + "8720fa0d9f3367278baf2fd43d29c21b4384f09ae14207beeb42956

我正在尝试做证书固定。我公司使用的网络库不支持固定。所以我必须手动操作

这是我使用的代码

protected Void doInBackground(Void... params) {

    String actualKey = "OpenSSLRSAPublicKey{modulus=ccf0883ebc511bb86f7f6e360385cf3a" +
            "8720fa0d9f3367278baf2fd43d29c21b4384f09ae14207beeb429563639d4388aca65a3" +
            "a5f5d2c902bf33e6df904598e6a5a1c037add731bdce606c664368cbc4bb7e269bbda82" +
            "ff20bd9ca484f5bd660d5628bca4a8f376acf1cab07f0d9476df283ef44d3bf52d4b730" +
            "3187cf587cbb2ce981e01b6cb32ba4f9b197b60013ff19215abb7d2ca9608007df82641" +
            "b05127ec9557927e8bd68ff183f8b72720f93152f207f89b446e38fc7aa3db4928f5fb7" +
            "92f33898381e7bc5ddb612d2e3a3191854797add8e0d47ed9f7da709e55a89aa7369620" +
            "2d90275ada9d43fb462a16839787b6ea3c83df66a1d6e528a38d0d,publicExponent=1" +
            "0001}";

    try {
        SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
        SSLSocket socket = (SSLSocket) factory.createSocket("prisonvoicemail.com", 443);
        socket.startHandshake();

        Certificate[] certs = socket.getSession().getPeerCertificates();
        Certificate cert = certs[0];
        String key = cert.getPublicKey().toString();

        Log.d(LOG_TAG, key);

        if(key.equals(actualKey)){
            Log.d(LOG_TAG, "Success");
        } else {
            Log.d(LOG_TAG, "Failure");
        }

    } catch (IOException e){
        e.printStackTrace();
    }

    return null;

但由于某种原因,它不起作用。当我正常连接时,它会获得成功,当我通过代理(MITMyPro)连接来测试一个模拟中间人攻击的不同证书时,我也会获得成功。这就像完全绕过代理,直接进入正常的认证。我不知道这是为什么。

很可能你的mitmproxy设置错误,你没有在中间安排一个人。使用公钥的toString()方法是比较公钥的一种糟糕的方法。相反,您应该使用类似getEncoded()的东西。@JamesKPolk我已经尝试使用getEncoded并将其转换为base64。Mitmproxy配置正确,因为它在使用OKhttp时工作。但该应用程序最初是由其他人使用Ion创建的。所以不得不写它很烦人。@JamesKPolk我曾尝试使用
SSLSocket
从套接字中检索证书。