Skip to content

Commit 53f2d2e

Browse files
author
Joonas Kannisto
committed
Created separate enable and disable methods for SSL validation
1 parent 481ccef commit 53f2d2e

File tree

5 files changed

+98
-57
lines changed

5 files changed

+98
-57
lines changed

README.md

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -483,18 +483,24 @@ certificatePinningAdd("mydomain.com", ["DCU5TkA8n3L8+QM7dyTjfRlxWibigF+1cxMzRhlJ
483483
certificatePinningClear();
484484
```
485485

486-
### Allow SSL errors and self-signed certificates
486+
### Enable or disable SSL validations
487487

488-
You can allow SSL errors and self-signed certificates if you want. This only works on android devices.
488+
Enable or disable SSL validations. This only works on android devices.
489489

490490
```typescript
491-
import { allowSslErrors } from "@klippa/nativescript-http";
491+
import { disableSSLValidation, enableSSLValidation } from "@klippa/nativescript-http";
492492

493493
/**
494-
* Allow SSL errors and self-signed certificates
495-
* @param allow true/false
494+
* Enable SSL validation
495+
* ** Only Android **
496496
*/
497-
allowSslErrors(true);
497+
export declare function enableSSLValidation(): void;
498+
499+
/**
500+
* Disable SSL validation
501+
* ** Only Android **
502+
*/
503+
export declare function disableSSLValidation(): void;
498504
```
499505
500506
## Roadmap

src/http.android.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,8 +496,12 @@ export function clearCookies() {
496496
com.klippa.NativeScriptHTTP.Async.Http.ClearCookies();
497497
}
498498

499-
export function allowSslErrors(allow: boolean) {
500-
com.klippa.NativeScriptHTTP.Async.Http.AllowSslErrors(allow);
499+
export function enableSSLValidation() {
500+
com.klippa.NativeScriptHTTP.Async.Http.EnableSSLValidation();
501+
}
502+
503+
export function disableSSLValidation() {
504+
com.klippa.NativeScriptHTTP.Async.Http.DisableSSLValidation();
501505
}
502506

503507
export function setUserAgent(userAgent?: string) {

src/index.d.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,16 @@ export declare function setConcurrencyLimits(maxRequests: number, maxRequestsPer
113113
export declare function clearCookies(): void;
114114

115115
/**
116-
* Allow SSL errors and self-signed certificates
116+
* Enable SSL validation
117117
* ** Only Android **
118-
* @param allow true/false
119118
*/
120-
export declare function allowSslErrors(allow: boolean): void;
119+
export declare function enableSSLValidation(): void;
120+
121+
/**
122+
* Disable SSL validation
123+
* ** Only Android **
124+
*/
125+
export declare function disableSSLValidation(): void;
121126

122127
/**
123128
* Set a global user agent.

src/platforms/android/java/com/klippa/NativeScriptHTTP/Async.java

Lines changed: 70 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.io.Closeable;
1010
import java.io.IOException;
1111
import java.io.InputStream;
12+
import java.security.KeyStore;
13+
import java.security.SecureRandom;
1214
import java.util.ArrayList;
1315
import java.util.Locale;
1416
import java.util.Stack;
@@ -17,6 +19,11 @@
1719
import java.util.concurrent.ThreadPoolExecutor;
1820
import java.util.concurrent.TimeUnit;
1921

22+
import javax.net.ssl.SSLContext;
23+
import javax.net.ssl.TrustManager;
24+
import javax.net.ssl.TrustManagerFactory;
25+
import javax.net.ssl.X509TrustManager;
26+
2027
import okhttp3.Call;
2128
import okhttp3.Callback;
2229
import okhttp3.CertificatePinner;
@@ -29,6 +36,7 @@
2936
import okhttp3.ResponseBody;
3037
import okhttp3.WebSocket;
3138
import okhttp3.WebSocketListener;
39+
import okhttp3.internal.tls.OkHostnameVerifier;
3240

3341
public class Async {
3442
static final String TAG = "Async";
@@ -89,55 +97,26 @@ public static class Http {
8997
private static MemoryCookieJar cookieJar;
9098
private static CertificatePinner.Builder certificatePinnerBuilder;
9199
private static ImageParseMethod imageParseMethod = ImageParseMethod.CONTENTTYPE;
92-
private static boolean allowSslErrors = false;
100+
101+
private static TrustManager TRUST_ALL_CERTS = new X509TrustManager() {
102+
@Override
103+
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) { }
104+
105+
@Override
106+
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) { }
107+
108+
@Override
109+
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
110+
return new java.security.cert.X509Certificate[] {};
111+
}
112+
};
93113

94114
public static void InitClient() {
95115
if (cookieJar == null) {
96116
cookieJar = new MemoryCookieJar();
97117
}
98118

99119
if (client == null) {
100-
if (allowSslErrors) {
101-
// Allow all ssl errors
102-
try {
103-
javax.net.ssl.TrustManager TRUST_ALL_CERTS = new javax.net.ssl.X509TrustManager() {
104-
@Override
105-
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
106-
}
107-
108-
@Override
109-
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
110-
}
111-
112-
@Override
113-
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
114-
return new java.security.cert.X509Certificate[] {};
115-
}
116-
};
117-
118-
javax.net.ssl.SSLContext sslContext = javax.net.ssl.SSLContext.getInstance("SSL");
119-
sslContext.init(null, new javax.net.ssl.TrustManager[] { TRUST_ALL_CERTS }, new java.security.SecureRandom());
120-
client = new OkHttpClient.Builder()
121-
.writeTimeout(60, TimeUnit.SECONDS)
122-
.readTimeout(60, TimeUnit.SECONDS)
123-
.connectTimeout(60, TimeUnit.SECONDS)
124-
.sslSocketFactory(sslContext.getSocketFactory(), (javax.net.ssl.X509TrustManager) TRUST_ALL_CERTS)
125-
.hostnameVerifier(new javax.net.ssl.HostnameVerifier() {
126-
@Override
127-
public boolean verify(String hostname, javax.net.ssl.SSLSession session) {
128-
return true;
129-
}
130-
})
131-
.cookieJar(cookieJar)
132-
.build();
133-
} catch (java.security.KeyManagementException e) {
134-
e.printStackTrace();
135-
} catch (java.security.NoSuchAlgorithmException e) {
136-
e.printStackTrace();
137-
}
138-
return;
139-
}
140-
141120
client = new OkHttpClient.Builder()
142121
.writeTimeout(60, TimeUnit.SECONDS)
143122
.readTimeout(60, TimeUnit.SECONDS)
@@ -230,10 +209,56 @@ public static void ClearCookies() {
230209
}
231210
}
232211

233-
public static void AllowSslErrors(boolean allow) {
234-
client = null;
235-
allowSslErrors = allow;
212+
public static void EnableSSLValidation() {
213+
InitClient();
214+
215+
try {
216+
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
217+
trustManagerFactory.init((KeyStore) null);
218+
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
219+
220+
X509TrustManager trustManager = null;
221+
for (TrustManager tm : trustManagers) {
222+
if (tm instanceof X509TrustManager) {
223+
trustManager = (X509TrustManager) tm;
224+
break;
225+
}
226+
}
227+
if (trustManager != null) {
228+
SSLContext sslContext = SSLContext.getInstance("TLS");
229+
sslContext.init(null, new TrustManager[] { trustManager }, new SecureRandom());
230+
231+
client = client.newBuilder()
232+
.sslSocketFactory(sslContext.getSocketFactory(), trustManager)
233+
.hostnameVerifier(OkHostnameVerifier.INSTANCE)
234+
.build();
235+
}
236+
} catch (Exception e) {
237+
e.printStackTrace();
238+
}
239+
}
240+
241+
public static void DisableSSLValidation() {
236242
InitClient();
243+
244+
try {
245+
SSLContext sslContext = SSLContext.getInstance("SSL");
246+
sslContext.init(null, new TrustManager[] { TRUST_ALL_CERTS }, new SecureRandom());
247+
248+
client = client.newBuilder()
249+
.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) TRUST_ALL_CERTS)
250+
.hostnameVerifier(new javax.net.ssl.HostnameVerifier() {
251+
@Override
252+
public boolean verify(String hostname, javax.net.ssl.SSLSession session) {
253+
return true;
254+
}
255+
})
256+
.build();
257+
} catch (java.security.KeyManagementException e) {
258+
e.printStackTrace();
259+
} catch (java.security.NoSuchAlgorithmException e) {
260+
e.printStackTrace();
261+
}
237262
}
238263

239264
public static void SetImageParseMethod(ImageParseMethod newImageParseMethod) {

src/typings/android.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ declare module com {
2525
public static class: java.lang.Class<com.klippa.NativeScriptHTTP.Async.Http>;
2626
public static SetConcurrencyLimits(param0: number, param1: number): void;
2727
public static ClearCookies(): void;
28-
public static AllowSslErrors(param0: boolean): void;
28+
public static EnableSSLValidation(): void;
29+
public static DisableSSLValidation(): void;
2930
public static MakeRequest(param0: com.klippa.NativeScriptHTTP.Async.Http.RequestOptions, param1: com.klippa.NativeScriptHTTP.Async.CompleteCallback, param2: any): void;
3031
public constructor();
3132
public static InitClient(): void;

0 commit comments

Comments
 (0)