<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Https on Allens' Blog</title><link>https://allens.tech/tags/https/</link><description>Recent content from Allens' Blog</description><generator>Hugo</generator><language>en-us</language><managingEditor>allens.leng@gmail.com (Allens)</managingEditor><webMaster>allens.leng@gmail.com (Allens)</webMaster><copyright>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</copyright><lastBuildDate>Mon, 09 Dec 2019 20:00:00 +0800</lastBuildDate><atom:link href="https://allens.tech/tags/https/index.xml" rel="self" type="application/rss+xml"/><item><title>HTTPS 双向认证（Mutual TLS authentication）</title><link>https://allens.tech/post/201912092000/</link><pubDate>Mon, 09 Dec 2019 20:00:00 +0800</pubDate><author>allens.leng@gmail.com (Allens)</author><guid>https://allens.tech/post/201912092000/</guid><description>
<![CDATA[<h1>HTTPS 双向认证（Mutual TLS authentication）</h1><p>Author: Allens(allens.leng@gmail.com)</p>
        
          <h2 id="描述">
<a class="header-anchor" href="#%e6%8f%8f%e8%bf%b0"></a>
描述
</h2><p>单向认证指浏览器与服务器交互需要对服务器证书进行认证，而双向认证就是服务端对客户端也要进行一次认证，认证的主要条件为：客户端需要有一张客户端证书，而这张客户端证书必须是由服务端指定的 <code>CA</code> 根证书签发的（中间 CA 个人没验证过）。</p>
<h2 id="常规操作">
<a class="header-anchor" href="#%e5%b8%b8%e8%a7%84%e6%93%8d%e4%bd%9c"></a>
常规操作
</h2><p>服务端的 Nginx 配置：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    listen                      <span style="color:#ae81ff">443</span> ssl;
</span></span><span style="display:flex;"><span>    server_name                 example.com;
</span></span><span style="display:flex;"><span>    server_tokens               off;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    access_log /etc/nginx/access.log;
</span></span><span style="display:flex;"><span>    error_log /etc/nginx/example.log;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ssl_certificate             /etc/nginx/certs/example.pem;
</span></span><span style="display:flex;"><span>    ssl_certificate_key         /etc/nginx/certs/example.key;
</span></span><span style="display:flex;"><span>    ssl_client_certificate      /etc/nginx/certs/example_server_ca.crt;
</span></span><span style="display:flex;"><span>    ssl_verify_client           on;
</span></span><span style="display:flex;"><span>    ssl_verify_depth            2;
</span></span><span style="display:flex;"><span>    ssl_prefer_server_ciphers   on;
</span></span><span style="display:flex;"><span>    ssl_session_tickets off;
</span></span><span style="display:flex;"><span>    ssl_session_cache off;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        proxy_http_version      1.1;
</span></span><span style="display:flex;"><span>        proxy_ignore_headers    Set-Cookie;
</span></span><span style="display:flex;"><span>        proxy_hide_header       Vary;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        proxy_set_header        Host             $http_host;
</span></span><span style="display:flex;"><span>        proxy_set_header        X-Real-IP        $remote_addr;
</span></span><span style="display:flex;"><span>        proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>        proxy_set_header        X-SSL-CERT       $ssl_client_escaped_cert;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        proxy_pass              http://127.0.0.1:serverPort;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        add_header Access-Control-Allow-Origin         https://server.example.com;
</span></span><span style="display:flex;"><span>        add_header Access-Control-Allow-Credentials    true;
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="配置说明">
<a class="header-anchor" href="#%e9%85%8d%e7%bd%ae%e8%af%b4%e6%98%8e"></a>
配置说明
</h3><h4 id="基础部分">
<a class="header-anchor" href="#%e5%9f%ba%e7%a1%80%e9%83%a8%e5%88%86"></a>
基础部分
</h4><ul>
<li>listen：为监听的端口</li>
<li>server_name：指定访问该服务的域名</li>
<li>server_tokens：在错误页和“服务器”响应头字段中启用或禁用nginx版本（有道翻译）<a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens">点此查看具体细节</a></li>
<li>access_log：服务日志路径</li>
<li>error_log：错误日志路径</li>
</ul>
<h4 id="证书及验证部分">
<a class="header-anchor" href="#%e8%af%81%e4%b9%a6%e5%8f%8a%e9%aa%8c%e8%af%81%e9%83%a8%e5%88%86"></a>
证书及验证部分
</h4><ul>
<li>ssl_certificate：服务器证书</li>
<li>ssl_certificate_key：服务器证书私钥</li>
<li>ssl_client_certificate：服务器验证客户端证书的 CA 证书</li>
<li>ssl_verify_client：是否开启客户端验证</li>
<li>ssl_verify_depth：验证深度（如果是中间证书颁发的客户端证书深度至少要写2）</li>
<li>ssl_prefer_server_ciphers：指定在使用SSLv3和TLS协议时，服务器密码应该优于客户端密码（有道翻译）<a href="http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers">点此查看具体细节</a></li>
<li>ssl_session_tickets：是否可以通过 ssl_session_tickets 恢复 session 会话（有道翻译）<a href="http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_tickets">点此查看具体细节</a></li>
<li>ssl_session_cache：设置存储会话参数的缓存的类型和大小（有道翻译）<a href="http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache">点此查看具体细节</a></li>
</ul>
<h4 id="代理部分">
<a class="header-anchor" href="#%e4%bb%a3%e7%90%86%e9%83%a8%e5%88%86"></a>
代理部分
</h4><ul>
<li>proxy_http_version：代理 http 协议版本</li>
<li>proxy_ignore_headers：禁止从代理服务器处理某些响应标头字段（有道翻译）<a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers">点此查看具体细节</a></li>
<li>proxy_hide_header：设置不传递的非默认不传递的字段<a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_hide_header">点此查看具体细节</a></li>
<li>proxy_set_header：设置请求头</li>
<li>proxy_pass：设置代理服务器的协议和地址</li>
</ul>
<h4 id="跨域设置">
<a class="header-anchor" href="#%e8%b7%a8%e5%9f%9f%e8%ae%be%e7%bd%ae"></a>
跨域设置
</h4><ul>
<li>add_header：添加头部信息</li>
<li>Access-Control-Allow-Origin：访问控制允许来源</li>
<li>Access-Control-Allow-Credentials：响应头告诉浏览器是否将响应公开给前端JavaScript代码</li>
</ul>
<h2 id="扩展">
<a class="header-anchor" href="#%e6%89%a9%e5%b1%95"></a>
扩展
</h2><h3 id="nginx-反向代理作为客户端请求服务端进行双向认证">
<a class="header-anchor" href="#nginx-%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e4%bd%9c%e4%b8%ba%e5%ae%a2%e6%88%b7%e7%ab%af%e8%af%b7%e6%b1%82%e6%9c%8d%e5%8a%a1%e7%ab%af%e8%bf%9b%e8%a1%8c%e5%8f%8c%e5%90%91%e8%ae%a4%e8%af%81"></a>
Nginx 反向代理作为客户端请求服务端进行双向认证
</h3><p>服务端配置：</p>
        
        <hr><p>Published on 2019-12-09 at <a href='https://allens.tech/'>Allens' Blog</a>, last modified on 2019-12-09</p>]]></description><category>HTTPS</category></item></channel></rss>