mirror of
https://github.com/square/okhttp.git
synced 2026-01-12 10:23:16 +03:00
Update and improve recipes page in docs (#6270)
* Add PymdownX tabbed * Update recipes.md * fix invalid tab names * Fix additional tabs and publish * remove site directory
This commit is contained in:
248
docs/https.md
248
docs/https.md
@@ -70,137 +70,139 @@ By default, OkHttp trusts the certificate authorities of the host platform. This
|
||||
|
||||
Use [CertificatePinner](http://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/) to restrict which certificates and certificate authorities are trusted. Certificate pinning increases security, but limits your server team’s abilities to update their TLS certificates. **Do not use certificate pinning without the blessing of your server’s TLS administrator!**
|
||||
|
||||
```Kotlin tab=
|
||||
private val client = OkHttpClient.Builder()
|
||||
.certificatePinner(
|
||||
CertificatePinner.Builder()
|
||||
.add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
|
||||
.build())
|
||||
.build()
|
||||
|
||||
fun run() {
|
||||
val request = Request.Builder()
|
||||
.url("https://publicobject.com/robots.txt")
|
||||
.build()
|
||||
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||
|
||||
for (certificate in response.handshake!!.peerCertificates) {
|
||||
println(CertificatePinner.pin(certificate))
|
||||
=== "Kotlin"
|
||||
```kotlin
|
||||
private val client = OkHttpClient.Builder()
|
||||
.certificatePinner(
|
||||
CertificatePinner.Builder()
|
||||
.add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
|
||||
.build())
|
||||
.build()
|
||||
|
||||
fun run() {
|
||||
val request = Request.Builder()
|
||||
.url("https://publicobject.com/robots.txt")
|
||||
.build()
|
||||
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||
|
||||
for (certificate in response.handshake!!.peerCertificates) {
|
||||
println(CertificatePinner.pin(certificate))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```Java tab=
|
||||
private final OkHttpClient client = new OkHttpClient.Builder()
|
||||
.certificatePinner(
|
||||
new CertificatePinner.Builder()
|
||||
.add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
|
||||
.build())
|
||||
.build();
|
||||
|
||||
public void run() throws Exception {
|
||||
Request request = new Request.Builder()
|
||||
.url("https://publicobject.com/robots.txt")
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
|
||||
|
||||
for (Certificate certificate : response.handshake().peerCertificates()) {
|
||||
System.out.println(CertificatePinner.pin(certificate));
|
||||
```
|
||||
=== "Java"
|
||||
```java
|
||||
private final OkHttpClient client = new OkHttpClient.Builder()
|
||||
.certificatePinner(
|
||||
new CertificatePinner.Builder()
|
||||
.add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
|
||||
.build())
|
||||
.build();
|
||||
|
||||
public void run() throws Exception {
|
||||
Request request = new Request.Builder()
|
||||
.url("https://publicobject.com/robots.txt")
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
|
||||
|
||||
for (Certificate certificate : response.handshake().peerCertificates()) {
|
||||
System.out.println(CertificatePinner.pin(certificate));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
### Customizing Trusted Certificates ([.kt][CustomTrustKotlin], [.java][CustomTrustJava])
|
||||
|
||||
The full code sample shows how to replace the host platform’s certificate authorities with your own set. As above, **do not use custom certificates without the blessing of your server’s TLS administrator!**
|
||||
|
||||
```Kotlin tab=
|
||||
private val client: OkHttpClient
|
||||
|
||||
init {
|
||||
val trustManager = trustManagerForCertificates(trustedCertificatesInputStream())
|
||||
val sslContext = SSLContext.getInstance("TLS")
|
||||
sslContext.init(null, arrayOf<TrustManager>(trustManager), null)
|
||||
val sslSocketFactory = sslContext.socketFactory
|
||||
|
||||
client = OkHttpClient.Builder()
|
||||
.sslSocketFactory(sslSocketFactory, trustManager)
|
||||
.build()
|
||||
}
|
||||
|
||||
fun run() {
|
||||
val request = Request.Builder()
|
||||
.url("https://publicobject.com/helloworld.txt")
|
||||
.build()
|
||||
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||
|
||||
for ((name, value) in response.headers) {
|
||||
println("$name: $value")
|
||||
=== "Kotlin"
|
||||
```kotlin
|
||||
private val client: OkHttpClient
|
||||
|
||||
init {
|
||||
val trustManager = trustManagerForCertificates(trustedCertificatesInputStream())
|
||||
val sslContext = SSLContext.getInstance("TLS")
|
||||
sslContext.init(null, arrayOf<TrustManager>(trustManager), null)
|
||||
val sslSocketFactory = sslContext.socketFactory
|
||||
|
||||
client = OkHttpClient.Builder()
|
||||
.sslSocketFactory(sslSocketFactory, trustManager)
|
||||
.build()
|
||||
}
|
||||
|
||||
println(response.body!!.string())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an input stream containing one or more certificate PEM files. This implementation just
|
||||
* embeds the PEM files in Java strings; most applications will instead read this from a resource
|
||||
* file that gets bundled with the application.
|
||||
*/
|
||||
private fun trustedCertificatesInputStream(): InputStream {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
|
||||
private fun trustManagerForCertificates(inputStream: InputStream): X509TrustManager {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
```
|
||||
|
||||
```Java tab=
|
||||
private final OkHttpClient client;
|
||||
|
||||
public CustomTrust() {
|
||||
X509TrustManager trustManager;
|
||||
SSLSocketFactory sslSocketFactory;
|
||||
try {
|
||||
trustManager = trustManagerForCertificates(trustedCertificatesInputStream());
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||
sslContext.init(null, new TrustManager[] { trustManager }, null);
|
||||
sslSocketFactory = sslContext.getSocketFactory();
|
||||
} catch (GeneralSecurityException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
client = new OkHttpClient.Builder()
|
||||
.sslSocketFactory(sslSocketFactory, trustManager)
|
||||
.build();
|
||||
}
|
||||
|
||||
public void run() throws Exception {
|
||||
Request request = new Request.Builder()
|
||||
.url("https://publicobject.com/helloworld.txt")
|
||||
.build();
|
||||
|
||||
Response response = client.newCall(request).execute();
|
||||
System.out.println(response.body().string());
|
||||
}
|
||||
|
||||
private InputStream trustedCertificatesInputStream() {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
|
||||
public SSLContext sslContextForTrustedCertificates(InputStream in) {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
```
|
||||
|
||||
fun run() {
|
||||
val request = Request.Builder()
|
||||
.url("https://publicobject.com/helloworld.txt")
|
||||
.build()
|
||||
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||
|
||||
for ((name, value) in response.headers) {
|
||||
println("$name: $value")
|
||||
}
|
||||
|
||||
println(response.body!!.string())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an input stream containing one or more certificate PEM files. This implementation just
|
||||
* embeds the PEM files in Java strings; most applications will instead read this from a resource
|
||||
* file that gets bundled with the application.
|
||||
*/
|
||||
private fun trustedCertificatesInputStream(): InputStream {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
|
||||
private fun trustManagerForCertificates(inputStream: InputStream): X509TrustManager {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
```
|
||||
=== "Java"
|
||||
```java
|
||||
private final OkHttpClient client;
|
||||
|
||||
public CustomTrust() {
|
||||
X509TrustManager trustManager;
|
||||
SSLSocketFactory sslSocketFactory;
|
||||
try {
|
||||
trustManager = trustManagerForCertificates(trustedCertificatesInputStream());
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||
sslContext.init(null, new TrustManager[] { trustManager }, null);
|
||||
sslSocketFactory = sslContext.getSocketFactory();
|
||||
} catch (GeneralSecurityException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
client = new OkHttpClient.Builder()
|
||||
.sslSocketFactory(sslSocketFactory, trustManager)
|
||||
.build();
|
||||
}
|
||||
|
||||
public void run() throws Exception {
|
||||
Request request = new Request.Builder()
|
||||
.url("https://publicobject.com/helloworld.txt")
|
||||
.build();
|
||||
|
||||
Response response = client.newCall(request).execute();
|
||||
System.out.println(response.body().string());
|
||||
}
|
||||
|
||||
private InputStream trustedCertificatesInputStream() {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
|
||||
public SSLContext sslContextForTrustedCertificates(InputStream in) {
|
||||
... // Full source omitted. See sample.
|
||||
}
|
||||
```
|
||||
|
||||
[CustomTrustJava]: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java
|
||||
[CustomTrustKotlin]: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/kt/CustomTrust.kt
|
||||
|
||||
Reference in New Issue
Block a user