我需要帮助,
我正在尝试在我的react-native应用程序(v0.63)上实现sslpin。
我已经遵循OkHttp github页面的文档
下面是我为我的应用程序编写的代码:public class CustomClientFactory implements OkHttpClientFactory {
@Override
public OkHttpClient createNewNetworkModuleClient() {
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add(BuildConfig.HOSTNAME, BuildConfig.SHA_PUBLIC_KEY_1)
.add(BuildConfig.HOSTNAME, BuildConfig.SHA_PUBLIC_KEY_2)
.add(BuildConfig.HOSTNAME, BuildConfig.SHA_PUBLIC_KEY_3)
.build();
OkHttpClient.Builder client = new OkHttpClient.Builder()
.connectTimeout(0, TimeUnit.MILLISECONDS)
.readTimeout(0, TimeUnit.MILLISECONDS)
.writeTimeout(0, TimeUnit.MILLISECONDS)
.cookieJar(new ReactCookieJarContainer())
.certificatePinner(certificatePinner);
OkHttpClient newClient = OkHttpClientProvider.enableTls12OnPreLollipop(client).build();
return newClient;
}
}
OkHttpCertPin:
public class OkHttpCertPin {
public static void rebuildOkHttpForSslPinning() {
OkHttpClientProvider.setOkHttpClientFactory(new CustomClientFactory());
}
}
这是我在MainActivity上的onCreate方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OkHttpCertPin.rebuildOkHttpForSslPinning();
}
它允许所有的请求通过,即使我使用随机的公钥和主机名。
我做错了什么?
所有的公钥我得到它从sslLabs
CertificatePinner将只限制主机BuildConfig的流量。主机名,所有其他主机都可以通过。这就是为什么你的CertificatePinner没有阻止任何东西。
您可以创建一个自定义网络拦截器来拒绝所有其他流量。见https://square.github.io/okhttp/interceptors/
的被害者。以后你可以实现一个EventListener并打印出你正在连接的主机和证书链的引脚来帮助调试。
见https://stackoverflow.com/a/66398516/1542667