在Android上使用Volley网络库进行SSL固定

在Android上使用Volley网络库进行SSL固定,android,ssl,ssl-certificate,android-volley,pinning,Android,Ssl,Ssl Certificate,Android Volley,Pinning,我想在volley网络库中使用SSL固定。有没有办法通过截取实现SSL固定?volley是否为安全改进提供了这种支持?我正在实现同样的事情。我发现了一篇博客文章,希望能对你有所帮助 您可以使用公钥固定而不是证书固定: 我刚刚为我正在从事的一个项目调查了同样的事情。然而,我所处的位置可能与你不同 我正在使用带有OKHttp网络堆栈()的Volley: 将这些添加到Gradle构建中:1 compile "com.squareup.okhttp:okhttp:2.7.5" compile "com.

我想在volley网络库中使用SSL固定。有没有办法通过截取实现SSL固定?volley是否为安全改进提供了这种支持?

我正在实现同样的事情。我发现了一篇博客文章,希望能对你有所帮助


您可以使用公钥固定而不是证书固定:


我刚刚为我正在从事的一个项目调查了同样的事情。然而,我所处的位置可能与你不同

我正在使用带有OKHttp网络堆栈()的Volley:

将这些添加到Gradle构建中:1

compile "com.squareup.okhttp:okhttp:2.7.5"
compile "com.squareup.okhttp:okhttp-urlconnection:2.7.5"
添加一个OKHttpStack类

public class OKHttpStack extends HurlStack {
    private final OkUrlFactory okUrlFactory;
    public OKHttpStack() {

        this(new OkUrlFactory( 
            new OkHttpClient.Builder()
                    .certificatePinner(
                        new CertificatePinner.Builder()
                            .add("example.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=") //This is the cert
                            .build())
                    .build();
        ));
    }
    public OKHttpStack(OkUrlFactory okUrlFactory) {
        if (okUrlFactory == null) {
            throw new NullPointerException("Client must not be null.");
        }
        this.okUrlFactory = okUrlFactory;
    }

    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {
        return okUrlFactory.open(url);
    }
}
然后创建RequestQueue时,请执行以下操作:

Network network = new BasicNetwork(new OKHttpStack());
File cacheDir = new File(context.getCacheDir(), "volley");
int threads = 4;
mRequestQueue = new RequestQueue(new DiskBasedCache(cacheDir), network, threads);
请注意,我还没有测试这一点,我们目前正在考虑固定

祝你好运! Gav

参考资料:


我刚刚实现了如下所述:

以下是volley实现所需的代码:

CertificateFactory cf = CertificateFactory.getInstance("X.509");

// Generate the certificate using the certificate file under res/raw/cert.cer
InputStream caInput = new BufferedInputStream(getResources().openRawResource(R.raw.cert));
Certificate ca = cf.generateCertificate(caInput);
caInput.close();

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore trusted = KeyStore.getInstance(keyStoreType);
trusted.load(null, null);
trusted.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(trusted);

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);

SSLSocketFactory sf = context.getSocketFactory();
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext(), new HurlStack(null, sf));

似乎有用

你发现什么了吗?这主要是为了防止MITM吗?如果攻击者可以反向编译APK并提取证书,那么它真正阻止了什么?@TakeshiKaga我认为你说得不太对。从应用程序中提取公钥不会帮助您执行MITM攻击,因为您需要私钥。为了更好地理解,请检查TLS是如何工作的。你可以做的是重新编译应用程序并更改密钥,但这只会使你的构建易受攻击。我尝试了这个,但出现了一个问题。我下载了示例代码,只需将网站url更改为“”,连接到google.com并获取数据时不会出现任何错误。你看到了吗?我尝试了测试证书文件和我自己的证书,但结果是一样的。HPKP的问题是,应用程序在第一次连接到Web服务时就会受到攻击。如果攻击者能够在这一刻执行MitM,则客户端可能会被错误的证书锁定很长一段时间。如果您使用传统的证书固定连接,则不会发生这种情况。谢谢您,您的解决方案救了我。我必须在24岁以下的android版本上实现ssl固定,我们的应用程序中有两个库:Volley和Ksoap。我没有得到任何地方的帮助,甚至trustkit也不起作用。然后我遇到了你的索尔,扮演了这个角色。在一瞬间就可以用抽射的方式将球固定住。我不明白的是,我创建了一个okhttp客户机,向其添加了一个证书pinner,然后使用代码mRequestQueue=Volley.newRequestQueue(上下文,new-HurlStack(null,okClien.sslSocketFactory),应用程序运行平稳,但ssl pinning不起作用,你知道为什么吗?当你创建请求队列(mRequestQueue)实例时您正在向它传递一个
new HurlStack
,而不是自定义的
OKHttpStack
。请尝试使用类似于
mRequestQueue=Volley.newRequestQueue(上下文,new OKHttpStack(…)的内容来切换请求队列的实例化
好的,不知道我们可以用okhttpStack实例化一个截击请求。受我在本节的知识限制。每当我再次遇到这种情况时,我们都会尝试。谢谢:)第一次/第二次有效,显示SSLHandshake异常。但是,当您重试时,它不起作用,您将成功获得网络响应。