Skip to content

Commit 2aa7a92

Browse files
authored
Merge pull request #34 from razorpay/fix_tls
[TLS]: Support for TLSv1.2
2 parents 60d81a9 + 43828fe commit 2aa7a92

File tree

4 files changed

+108
-16
lines changed

4 files changed

+108
-16
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Add this dependency to your project's POM:
2121
<dependency>
2222
<groupId>com.razorpay</groupId>
2323
<artifactId>razorpay-java</artifactId>
24-
<version>1.3.6</version>
24+
<version>1.3.7</version>
2525
</dependency>
2626
```
2727

@@ -30,7 +30,7 @@ Add this dependency to your project's POM:
3030
Add this dependency to your project's build file:
3131

3232
```groovy
33-
compile "com.razorpay:razorpay-java:1.3.6"
33+
compile "com.razorpay:razorpay-java:1.3.7"
3434
```
3535

3636
## Usage

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>com.razorpay</groupId>
66
<artifactId>razorpay-java</artifactId>
7-
<version>1.3.6</version>
7+
<version>1.3.7</version>
88
<packaging>jar</packaging>
99

1010
<name>razorpay-java</name>
@@ -67,7 +67,7 @@
6767
<dependency>
6868
<groupId>org.apache.commons</groupId>
6969
<artifactId>commons-text</artifactId>
70-
<version>1.4</version>
70+
<version>1.3</version>
7171
</dependency>
7272

7373
</dependencies>

src/main/java/com/razorpay/ApiUtils.java

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package com.razorpay;
22

33
import java.io.IOException;
4-
import java.util.ArrayList;
4+
import java.security.KeyStore;
5+
import java.security.KeyStoreException;
6+
import java.security.NoSuchAlgorithmException;
7+
import java.util.Arrays;
58
import java.util.HashMap;
69
import java.util.Iterator;
7-
import java.util.List;
810
import java.util.Map;
911
import java.util.Properties;
1012
import java.util.concurrent.TimeUnit;
1113

14+
import javax.net.ssl.TrustManager;
15+
import javax.net.ssl.TrustManagerFactory;
16+
import javax.net.ssl.X509TrustManager;
17+
1218
import org.json.JSONObject;
1319

14-
import okhttp3.ConnectionSpec;
1520
import okhttp3.HttpUrl;
1621
import okhttp3.OkHttpClient;
1722
import okhttp3.Request;
@@ -34,16 +39,17 @@ static void createHttpClientInstance(boolean enableLogging) throws RazorpayExcep
3439
} else {
3540
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
3641
}
37-
38-
List<ConnectionSpec> connectionSpecs = new ArrayList<ConnectionSpec>();
39-
connectionSpecs.add(ConnectionSpec.MODERN_TLS);
4042

41-
client = new OkHttpClient.Builder()
42-
.readTimeout(60, TimeUnit.SECONDS)
43-
.writeTimeout(60, TimeUnit.SECONDS)
44-
.addInterceptor(loggingInterceptor)
45-
.connectionSpecs(connectionSpecs)
46-
.build();
43+
try {
44+
client = new OkHttpClient.Builder()
45+
.readTimeout(60, TimeUnit.SECONDS)
46+
.writeTimeout(60, TimeUnit.SECONDS)
47+
.addInterceptor(loggingInterceptor)
48+
.sslSocketFactory(new CustomTLSSocketFactory(), createDefaultTrustManager())
49+
.build();
50+
} catch (Exception e) {
51+
throw new RazorpayException(e);
52+
}
4753
}
4854

4955
Properties properties = new Properties();
@@ -159,4 +165,15 @@ private static Response processRequest(Request request) throws RazorpayException
159165
static void addHeaders(Map<String, String> header) {
160166
headers.putAll(header);
161167
}
168+
169+
private static X509TrustManager createDefaultTrustManager() throws NoSuchAlgorithmException, KeyStoreException {
170+
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
171+
trustManagerFactory.init((KeyStore) null);
172+
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
173+
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
174+
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
175+
}
176+
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
177+
return trustManager;
178+
}
162179
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.razorpay;
2+
3+
import java.io.IOException;
4+
import java.net.InetAddress;
5+
import java.net.Socket;
6+
import java.net.UnknownHostException;
7+
import java.security.KeyManagementException;
8+
import java.security.NoSuchAlgorithmException;
9+
10+
import javax.net.ssl.SSLContext;
11+
import javax.net.ssl.SSLSocket;
12+
import javax.net.ssl.SSLSocketFactory;
13+
14+
class CustomTLSSocketFactory extends SSLSocketFactory {
15+
16+
private SSLSocketFactory internalSSLSocketFactory;
17+
18+
CustomTLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
19+
SSLContext context = SSLContext.getInstance("TLS");
20+
context.init(null, null, null);
21+
internalSSLSocketFactory = context.getSocketFactory();
22+
}
23+
24+
@Override
25+
public String[] getDefaultCipherSuites() {
26+
return internalSSLSocketFactory.getDefaultCipherSuites();
27+
}
28+
29+
@Override
30+
public String[] getSupportedCipherSuites() {
31+
return internalSSLSocketFactory.getSupportedCipherSuites();
32+
}
33+
34+
@Override
35+
public Socket createSocket() throws IOException {
36+
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
37+
}
38+
39+
@Override
40+
public Socket createSocket(Socket s, String host, int port, boolean autoClose)
41+
throws IOException {
42+
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
43+
}
44+
45+
@Override
46+
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
47+
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
48+
}
49+
50+
@Override
51+
public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
52+
throws IOException, UnknownHostException {
53+
return enableTLSOnSocket(
54+
internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
55+
}
56+
57+
@Override
58+
public Socket createSocket(InetAddress host, int port) throws IOException {
59+
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
60+
}
61+
62+
@Override
63+
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
64+
throws IOException {
65+
return enableTLSOnSocket(
66+
internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
67+
}
68+
69+
private Socket enableTLSOnSocket(Socket socket) {
70+
if (socket != null && (socket instanceof SSLSocket)) {
71+
((SSLSocket) socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
72+
}
73+
return socket;
74+
}
75+
}

0 commit comments

Comments
 (0)