mirror of
https://github.com/square/okhttp.git
synced 2026-01-12 10:23:16 +03:00
Deployed a8206ac07 with MkDocs version: 1.0.4
This commit is contained in:
138
https/index.html
138
https/index.html
@@ -315,15 +315,15 @@
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#certificate-pinning" title="Certificate Pinning" class="md-nav__link">
|
||||
Certificate Pinning
|
||||
<a href="#certificate-pinning-kt-java" title="Certificate Pinning (.kt, .java)" class="md-nav__link">
|
||||
Certificate Pinning (.kt, .java)
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#customizing-trusted-certificates" title="Customizing Trusted Certificates" class="md-nav__link">
|
||||
Customizing Trusted Certificates
|
||||
<a href="#customizing-trusted-certificates-kt-java" title="Customizing Trusted Certificates (.kt, .java)" class="md-nav__link">
|
||||
Customizing Trusted Certificates (.kt, .java)
|
||||
</a>
|
||||
|
||||
</li>
|
||||
@@ -660,15 +660,15 @@
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#certificate-pinning" title="Certificate Pinning" class="md-nav__link">
|
||||
Certificate Pinning
|
||||
<a href="#certificate-pinning-kt-java" title="Certificate Pinning (.kt, .java)" class="md-nav__link">
|
||||
Certificate Pinning (.kt, .java)
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#customizing-trusted-certificates" title="Customizing Trusted Certificates" class="md-nav__link">
|
||||
Customizing Trusted Certificates
|
||||
<a href="#customizing-trusted-certificates-kt-java" title="Customizing Trusted Certificates (.kt, .java)" class="md-nav__link">
|
||||
Customizing Trusted Certificates (.kt, .java)
|
||||
</a>
|
||||
|
||||
</li>
|
||||
@@ -728,39 +728,122 @@
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
|
||||
</pre></div>
|
||||
|
||||
<h4 id="certificate-pinning"><a href="https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CertificatePinning.java">Certificate Pinning</a><a class="headerlink" href="#certificate-pinning" title="Permanent link">¶</a></h4>
|
||||
<h3 id="certificate-pinning-kt-java">Certificate Pinning (<a href="https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/kt/CertificatePinning.kt">.kt</a>, <a href="https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CertificatePinning.java">.java</a>)<a class="headerlink" href="#certificate-pinning-kt-java" title="Permanent link">¶</a></h3>
|
||||
<p>By default, OkHttp trusts the certificate authorities of the host platform. This strategy maximizes connectivity, but it is subject to certificate authority attacks such as the <a href="http://www.computerworld.com/article/2510951/cybercrime-hacking/hackers-spied-on-300-000-iranians-using-fake-google-certificate.html">2011 DigiNotar attack</a>. It also assumes your HTTPS servers’ certificates are signed by a certificate authority.</p>
|
||||
<p>Use <a href="http://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/">CertificatePinner</a> 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. <strong>Do not use certificate pinning without the blessing of your server’s TLS administrator!</strong></p>
|
||||
<div class="codehilite"><pre><span></span> <span class="kd">public</span> <span class="nf">CertificatePinning</span><span class="o">()</span> <span class="o">{</span>
|
||||
<span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OkHttpClient</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
|
||||
<span class="o">.</span><span class="na">certificatePinner</span><span class="o">(</span><span class="k">new</span> <span class="n">CertificatePinner</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
|
||||
<span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"publicobject.com"</span><span class="o">,</span> <span class="s">"sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig="</span><span class="o">)</span>
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">())</span>
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
|
||||
<span class="o">}</span>
|
||||
<div class="superfences-tabs">
|
||||
<input name="__tabs_1" type="radio" id="__tab_1_0" checked="checked" />
|
||||
<label for="__tab_1_0">Kotlin</label>
|
||||
<div class="superfences-content"><div class="codehilite"><pre><span></span> <span class="k">private</span> <span class="k">val</span> <span class="py">client</span> <span class="p">=</span> <span class="n">OkHttpClient</span><span class="p">.</span><span class="n">Builder</span><span class="p">()</span>
|
||||
<span class="p">.</span><span class="n">certificatePinner</span><span class="p">(</span>
|
||||
<span class="n">CertificatePinner</span><span class="p">.</span><span class="n">Builder</span><span class="p">()</span>
|
||||
<span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="s">"publicobject.com"</span><span class="p">,</span> <span class="s">"sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig="</span><span class="p">)</span>
|
||||
<span class="p">.</span><span class="n">build</span><span class="p">())</span>
|
||||
<span class="p">.</span><span class="n">build</span><span class="p">()</span>
|
||||
|
||||
<span class="k">fun</span> <span class="nf">run</span><span class="p">()</span> <span class="p">{</span>
|
||||
<span class="k">val</span> <span class="py">request</span> <span class="p">=</span> <span class="n">Request</span><span class="p">.</span><span class="n">Builder</span><span class="p">()</span>
|
||||
<span class="p">.</span><span class="n">url</span><span class="p">(</span><span class="s">"https://publicobject.com/robots.txt"</span><span class="p">)</span>
|
||||
<span class="p">.</span><span class="n">build</span><span class="p">()</span>
|
||||
|
||||
<span class="n">client</span><span class="p">.</span><span class="n">newCall</span><span class="p">(</span><span class="n">request</span><span class="p">).</span><span class="n">execute</span><span class="p">().</span><span class="n">use</span> <span class="p">{</span> <span class="n">response</span> <span class="p">-></span>
|
||||
<span class="k">if</span> <span class="p">(!</span><span class="n">response</span><span class="p">.</span><span class="n">isSuccessful</span><span class="p">)</span> <span class="k">throw</span> <span class="n">IOException</span><span class="p">(</span><span class="s">"Unexpected code $response"</span><span class="p">)</span>
|
||||
|
||||
<span class="k">for</span> <span class="p">(</span><span class="n">certificate</span> <span class="k">in</span> <span class="n">response</span><span class="p">.</span><span class="n">handshake</span><span class="o">!!</span><span class="p">.</span><span class="n">peerCertificates</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="n">println</span><span class="p">(</span><span class="n">CertificatePinner</span><span class="p">.</span><span class="n">pin</span><span class="p">(</span><span class="n">certificate</span><span class="p">))</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div></div>
|
||||
<input name="__tabs_1" type="radio" id="__tab_1_1" />
|
||||
<label for="__tab_1_1">Java</label>
|
||||
<div class="superfences-content"><div class="codehilite"><pre><span></span> <span class="kd">private</span> <span class="kd">final</span> <span class="n">OkHttpClient</span> <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OkHttpClient</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
|
||||
<span class="o">.</span><span class="na">certificatePinner</span><span class="o">(</span>
|
||||
<span class="k">new</span> <span class="n">CertificatePinner</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
|
||||
<span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">"publicobject.com"</span><span class="o">,</span> <span class="s">"sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig="</span><span class="o">)</span>
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">())</span>
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
|
||||
|
||||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
|
||||
<span class="n">Request</span> <span class="n">request</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Request</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
|
||||
<span class="o">.</span><span class="na">url</span><span class="o">(</span><span class="s">"https://publicobject.com/robots.txt"</span><span class="o">)</span>
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
|
||||
|
||||
<span class="n">Response</span> <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newCall</span><span class="o">(</span><span class="n">request</span><span class="o">).</span><span class="na">execute</span><span class="o">();</span>
|
||||
<span class="k">if</span> <span class="o">(!</span><span class="n">response</span><span class="o">.</span><span class="na">isSuccessful</span><span class="o">())</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">IOException</span><span class="o">(</span><span class="s">"Unexpected code "</span> <span class="o">+</span> <span class="n">response</span><span class="o">);</span>
|
||||
<span class="k">try</span> <span class="o">(</span><span class="n">Response</span> <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newCall</span><span class="o">(</span><span class="n">request</span><span class="o">).</span><span class="na">execute</span><span class="o">())</span> <span class="o">{</span>
|
||||
<span class="k">if</span> <span class="o">(!</span><span class="n">response</span><span class="o">.</span><span class="na">isSuccessful</span><span class="o">())</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">IOException</span><span class="o">(</span><span class="s">"Unexpected code "</span> <span class="o">+</span> <span class="n">response</span><span class="o">);</span>
|
||||
|
||||
<span class="k">for</span> <span class="o">(</span><span class="n">Certificate</span> <span class="n">certificate</span> <span class="o">:</span> <span class="n">response</span><span class="o">.</span><span class="na">handshake</span><span class="o">().</span><span class="na">peerCertificates</span><span class="o">())</span> <span class="o">{</span>
|
||||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">CertificatePinner</span><span class="o">.</span><span class="na">pin</span><span class="o">(</span><span class="n">certificate</span><span class="o">));</span>
|
||||
<span class="k">for</span> <span class="o">(</span><span class="n">Certificate</span> <span class="n">certificate</span> <span class="o">:</span> <span class="n">response</span><span class="o">.</span><span class="na">handshake</span><span class="o">().</span><span class="na">peerCertificates</span><span class="o">())</span> <span class="o">{</span>
|
||||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">CertificatePinner</span><span class="o">.</span><span class="na">pin</span><span class="o">(</span><span class="n">certificate</span><span class="o">));</span>
|
||||
<span class="o">}</span>
|
||||
<span class="o">}</span>
|
||||
<span class="o">}</span>
|
||||
</pre></div>
|
||||
|
||||
<h4 id="customizing-trusted-certificates"><a href="https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java">Customizing Trusted Certificates</a><a class="headerlink" href="#customizing-trusted-certificates" title="Permanent link">¶</a></h4>
|
||||
</pre></div></div>
|
||||
</div>
|
||||
<h3 id="customizing-trusted-certificates-kt-java">Customizing Trusted Certificates (<a href="https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/kt/CustomTrust.kt">.kt</a>, <a href="https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java">.java</a>)<a class="headerlink" href="#customizing-trusted-certificates-kt-java" title="Permanent link">¶</a></h3>
|
||||
<p>The full code sample shows how to replace the host platform’s certificate authorities with your own set. As above, <strong>do not use custom certificates without the blessing of your server’s TLS administrator!</strong></p>
|
||||
<div class="codehilite"><pre><span></span> <span class="kd">private</span> <span class="kd">final</span> <span class="n">OkHttpClient</span> <span class="n">client</span><span class="o">;</span>
|
||||
<div class="superfences-tabs">
|
||||
<input name="__tabs_2" type="radio" id="__tab_2_0" checked="checked" />
|
||||
<label for="__tab_2_0">Kotlin</label>
|
||||
<div class="superfences-content"><div class="codehilite"><pre><span></span> <span class="k">private</span> <span class="k">val</span> <span class="py">client</span><span class="p">:</span> <span class="n">OkHttpClient</span>
|
||||
|
||||
<span class="n">init</span> <span class="p">{</span>
|
||||
<span class="k">val</span> <span class="py">trustManager</span> <span class="p">=</span> <span class="n">trustManagerForCertificates</span><span class="p">(</span><span class="n">trustedCertificatesInputStream</span><span class="p">())</span>
|
||||
<span class="k">val</span> <span class="py">sslContext</span> <span class="p">=</span> <span class="n">SSLContext</span><span class="p">.</span><span class="n">getInstance</span><span class="p">(</span><span class="s">"TLS"</span><span class="p">)</span>
|
||||
<span class="n">sslContext</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="n">arrayOf</span><span class="p"><</span><span class="n">TrustManager</span><span class="p">>(</span><span class="n">trustManager</span><span class="p">),</span> <span class="k">null</span><span class="p">)</span>
|
||||
<span class="k">val</span> <span class="py">sslSocketFactory</span> <span class="p">=</span> <span class="n">sslContext</span><span class="p">.</span><span class="n">socketFactory</span>
|
||||
|
||||
<span class="n">client</span> <span class="p">=</span> <span class="n">OkHttpClient</span><span class="p">.</span><span class="n">Builder</span><span class="p">()</span>
|
||||
<span class="p">.</span><span class="n">sslSocketFactory</span><span class="p">(</span><span class="n">sslSocketFactory</span><span class="p">,</span> <span class="n">trustManager</span><span class="p">)</span>
|
||||
<span class="p">.</span><span class="n">build</span><span class="p">()</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="k">fun</span> <span class="nf">run</span><span class="p">()</span> <span class="p">{</span>
|
||||
<span class="k">val</span> <span class="py">request</span> <span class="p">=</span> <span class="n">Request</span><span class="p">.</span><span class="n">Builder</span><span class="p">()</span>
|
||||
<span class="p">.</span><span class="n">url</span><span class="p">(</span><span class="s">"https://publicobject.com/helloworld.txt"</span><span class="p">)</span>
|
||||
<span class="p">.</span><span class="n">build</span><span class="p">()</span>
|
||||
|
||||
<span class="n">client</span><span class="p">.</span><span class="n">newCall</span><span class="p">(</span><span class="n">request</span><span class="p">).</span><span class="n">execute</span><span class="p">().</span><span class="n">use</span> <span class="p">{</span> <span class="n">response</span> <span class="p">-></span>
|
||||
<span class="k">if</span> <span class="p">(!</span><span class="n">response</span><span class="p">.</span><span class="n">isSuccessful</span><span class="p">)</span> <span class="k">throw</span> <span class="n">IOException</span><span class="p">(</span><span class="s">"Unexpected code $response"</span><span class="p">)</span>
|
||||
|
||||
<span class="k">for</span> <span class="p">((</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">in</span> <span class="n">response</span><span class="p">.</span><span class="n">headers</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="n">println</span><span class="p">(</span><span class="s">"$name: $value"</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="n">println</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">body</span><span class="o">!!</span><span class="p">.</span><span class="n">string</span><span class="p">())</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="cm">/**</span>
|
||||
<span class="cm"> * Returns an input stream containing one or more certificate PEM files. This implementation just</span>
|
||||
<span class="cm"> * embeds the PEM files in Java strings; most applications will instead read this from a resource</span>
|
||||
<span class="cm"> * file that gets bundled with the application.</span>
|
||||
<span class="cm"> */</span>
|
||||
<span class="k">private</span> <span class="k">fun</span> <span class="nf">trustedCertificatesInputStream</span><span class="p">():</span> <span class="n">InputStream</span> <span class="p">{</span>
|
||||
<span class="p">...</span> <span class="c1">// Full source omitted. See sample.</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="k">private</span> <span class="k">fun</span> <span class="nf">trustManagerForCertificates</span><span class="p">(</span><span class="n">inputStream</span><span class="p">:</span> <span class="n">InputStream</span><span class="p">):</span> <span class="n">X509TrustManager</span> <span class="p">{</span>
|
||||
<span class="p">...</span> <span class="c1">// Full source omitted. See sample.</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div></div>
|
||||
<input name="__tabs_2" type="radio" id="__tab_2_1" />
|
||||
<label for="__tab_2_1">Java</label>
|
||||
<div class="superfences-content"><div class="codehilite"><pre><span></span> <span class="kd">private</span> <span class="kd">final</span> <span class="n">OkHttpClient</span> <span class="n">client</span><span class="o">;</span>
|
||||
|
||||
<span class="kd">public</span> <span class="nf">CustomTrust</span><span class="o">()</span> <span class="o">{</span>
|
||||
<span class="n">SSLContext</span> <span class="n">sslContext</span> <span class="o">=</span> <span class="n">sslContextForTrustedCertificates</span><span class="o">(</span><span class="n">trustedCertificatesInputStream</span><span class="o">());</span>
|
||||
<span class="n">X509TrustManager</span> <span class="n">trustManager</span><span class="o">;</span>
|
||||
<span class="n">SSLSocketFactory</span> <span class="n">sslSocketFactory</span><span class="o">;</span>
|
||||
<span class="k">try</span> <span class="o">{</span>
|
||||
<span class="n">trustManager</span> <span class="o">=</span> <span class="n">trustManagerForCertificates</span><span class="o">(</span><span class="n">trustedCertificatesInputStream</span><span class="o">());</span>
|
||||
<span class="n">SSLContext</span> <span class="n">sslContext</span> <span class="o">=</span> <span class="n">SSLContext</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="s">"TLS"</span><span class="o">);</span>
|
||||
<span class="n">sslContext</span><span class="o">.</span><span class="na">init</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="k">new</span> <span class="n">TrustManager</span><span class="o">[]</span> <span class="o">{</span> <span class="n">trustManager</span> <span class="o">},</span> <span class="kc">null</span><span class="o">);</span>
|
||||
<span class="n">sslSocketFactory</span> <span class="o">=</span> <span class="n">sslContext</span><span class="o">.</span><span class="na">getSocketFactory</span><span class="o">();</span>
|
||||
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">GeneralSecurityException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="n">RuntimeException</span><span class="o">(</span><span class="n">e</span><span class="o">);</span>
|
||||
<span class="o">}</span>
|
||||
|
||||
<span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OkHttpClient</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
|
||||
<span class="o">.</span><span class="na">sslSocketFactory</span><span class="o">(</span><span class="n">sslContext</span><span class="o">.</span><span class="na">getSocketFactory</span><span class="o">())</span>
|
||||
<span class="o">.</span><span class="na">sslSocketFactory</span><span class="o">(</span><span class="n">sslSocketFactory</span><span class="o">,</span> <span class="n">trustManager</span><span class="o">)</span>
|
||||
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
|
||||
<span class="o">}</span>
|
||||
|
||||
@@ -780,7 +863,8 @@
|
||||
<span class="kd">public</span> <span class="n">SSLContext</span> <span class="nf">sslContextForTrustedCertificates</span><span class="o">(</span><span class="n">InputStream</span> <span class="n">in</span><span class="o">)</span> <span class="o">{</span>
|
||||
<span class="o">...</span> <span class="c1">// Full source omitted. See sample.</span>
|
||||
<span class="o">}</span>
|
||||
</pre></div>
|
||||
</pre></div></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user