Skip to content

Commit e731401

Browse files
committed
update certificate pinning logic
1 parent 784efed commit e731401

File tree

1 file changed

+52
-7
lines changed

1 file changed

+52
-7
lines changed

app/src/main/java/infosecadventures/allsafe/challenges/CertificatePinning.java

+52-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import org.jetbrains.annotations.NotNull;
1414

1515
import java.io.IOException;
16+
import java.util.ArrayList;
17+
import java.util.List;
1618
import java.util.Objects;
1719

1820
import infosecadventures.allsafe.R;
@@ -27,21 +29,28 @@
2729

2830
public class CertificatePinning extends Fragment {
2931

32+
private static final String INVALID_HASH = "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
33+
3034
@Override
3135
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3236
View view = inflater.inflate(R.layout.fragment_certificate_pinning, container, false);
3337
setHasOptionsMenu(true);
38+
39+
// make an intentional request with broken config
40+
// to get the actual peer certificate chain public key hashes from okhttp exception
41+
List<String> hashes = extractPeerCertificateChain();
42+
3443
Button test = view.findViewById(R.id.execute);
3544
test.setOnClickListener(v -> {
36-
CertificatePinner certificatePinner = new CertificatePinner.Builder()
37-
.add("httpbin.org",
38-
"sha256/J0dKy1gw45muM4o/vm/tskFQ2BWudtp9XLxaW7OtowQ=")
39-
.add("httpbin.org",
40-
"sha256/JSMzqOOrtyOT1kmau6zKhgT676hGgczD5VMdRMyJZFA=")
41-
.build();
45+
46+
CertificatePinner.Builder certificatePinner = new CertificatePinner.Builder();
47+
for (String hash : hashes) {
48+
Log.d("ALLSAFE", hash);
49+
certificatePinner.add("httpbing.org", hash);
50+
}
4251

4352
OkHttpClient okHttpClient = new OkHttpClient.Builder()
44-
.certificatePinner(certificatePinner)
53+
.certificatePinner(certificatePinner.build())
4554
.build();
4655

4756
Request request = new Request.Builder()
@@ -51,6 +60,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
5160
okHttpClient.newCall(request).enqueue(new Callback() {
5261
@Override
5362
public void onFailure(@NotNull Call call, @NotNull IOException e) {
63+
Log.d("ALLSAFE", e.getMessage());
5464
requireActivity().runOnUiThread(() -> SnackUtil.INSTANCE.simpleMessage(requireActivity(), e.getMessage()));
5565
}
5666

@@ -67,4 +77,39 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO
6777
});
6878
return view;
6979
}
80+
81+
private List<String> extractPeerCertificateChain() {
82+
List<String> chain = new ArrayList<>();
83+
84+
OkHttpClient okHttpClient = new OkHttpClient.Builder()
85+
.certificatePinner(new CertificatePinner.Builder()
86+
.add("httpbin.org", INVALID_HASH)
87+
.build())
88+
.build();
89+
90+
Request request = new Request.Builder()
91+
.url("https://httpbin.org/json")
92+
.build();
93+
94+
okHttpClient.newCall(request).enqueue(new Callback() {
95+
@Override
96+
public void onFailure(@NotNull Call call, @NotNull IOException e) {
97+
requireActivity().runOnUiThread(() -> {
98+
String[] lines = e.getMessage().split(System.getProperty("line.separator"));
99+
for (String line : lines) {
100+
if (!line.trim().equals(INVALID_HASH) && line.trim().startsWith("sha256")) {
101+
String pin = line.trim().split(":")[0].trim();
102+
chain.add(pin);
103+
}
104+
}
105+
});
106+
}
107+
108+
@Override
109+
public void onResponse(@NotNull Call call, @NotNull Response response) {
110+
111+
}
112+
});
113+
return chain;
114+
}
70115
}

0 commit comments

Comments
 (0)