> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/devops/ngnix/group-1/nginx-pei-zhi-https-xie-yi.md).

# nginx配置https协议

## 获取密钥对和证书

1. 使用openssl获取密钥对和证书，密钥对使用文件domain.key存放，证书使用domain.crt存放

   [Broken mention](broken://spaces/XswOsPx3RsMmwwn0j7vt/pages/Kf4NkJYsbksBJUqgv6Po)
2. 新建文件夹ssl，并在ssl文件夹下分别创建certs、static两个文件夹：

   <pre class="language-bash"><code class="lang-bash"><strong>mkdir -p ssl/certs
   </strong>mkdir -p ssl/static
   </code></pre>
3. 将密钥对和证书文件移入certs目录下：

   ```bash
   cp domain.crt ssl/certs
   cp domain.key ssl/certs
   ```
4. 在static路径下新建一个index.html页面：

   ```bash
   echo '
   <!DOCTYPE html>
   <html lang="en">
   <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>Document</title>
   </head>
   <body>
       <h1>Hello World!</h1>
   </body>
   </html>
   ' > ssl/static/index.html
   ```
5. 在ssl目录下新建custom.conf文件：

   ```bash
   vim ssl/custom.conf
   ```

   ```nginx
   server
   {
       listen 80;
       listen 443 ssl;
       server_name  192.168.10.110;
       index  index.html  index.htm;

       location / {
           root   /usr/share/nginx/html;
       }

       # ssl_certificate表示证书路径
       ssl_certificate /certs/domain.crt;
       # ssl_certificate_key表示密钥对路径
       ssl_certificate_key /certs/domain.key;
   }
   ```
6. 在ssl目录下创建Dockerfile：

   <mark style="color:orange;">**注意：在nginx容器的/etc/nginx/conf.d目录下默认存在一个default.conf配置文件，该配置文件中配置了一个监听80端口的虚拟机主机(server)，所以在当前的测试实例中，如果不覆盖该文件，会导致配置冲突！**</mark>

   ```bash
   vim ssl/Dockerfile
   ```

   ```docker
   FROM nginx:1.14.2

   LABEL MAINTAINCE="bohanz838@gmail.com"

   ADD certs /certs
   ADD custom.conf /etc/nginx/conf.d/default.conf
   ADD static /usr/share/nginx/html
   ```
7. 在ssl目录下创建compose.yaml：

   ```bash
   vim ssl/compose.yaml
   ```

   ```yaml
   services:
     nginx:
       build:
         context: .
         tags:
           - "nginx:v1"
       ports:
         - 443:443
         - 80:80
   ```
8. 检查：

   ```bash
   $ ls -lR ssl
   ssl:
   总用量 12
   drwxrwxr-x. 2 docker docker  42 11月 21 20:26 certs
   -rw-rw-r--. 1 docker docker 121 11月 21 20:35 compose.yaml
   -rw-rw-r--. 1 docker docker 342 11月 21 20:28 custom.conf
   -rw-rw-r--. 1 docker docker 157 11月 21 20:29 Dockerfile
   drwxrwxr-x. 2 docker docker  24 11月 21 20:27 static

   ssl/certs:
   总用量 8
   -rw-rw-r--. 1 docker docker 1403 11月 21 20:26 domain.crt
   -rw-rw-r--. 1 docker docker 1704 11月 21 20:26 domain.key

   ssl/static:
   总用量 4
   -rw-rw-r--. 1 docker docker 179 11月 21 20:27 index.html
   ```
9. 使用docker compose启动服务：

   ```bash
   cd ssl
   docker compose up -d
   ```
10. 在浏览器中进行测试：

    <figure><img src="https://2820704264-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fcia81SyIbV4ECEQL4Mxy%2Fuploads%2FXe5kQcXEiwZ09TxuS20i%2Fimage.png?alt=media&amp;token=6f2b4394-409c-4d85-b1fb-87db15452cf8" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
证书中的通用名称并不需要绝对匹配：

生成证书时使用example.com作为通用名称，但是上述的nginx配置使用IP地址进行访问，在这种情况下，并未出现异常反应。

### 但是，这并不能说明通用名称是无用的，可能是因为被自签名证书本就存在的异常信息所掩盖了！&#x20;

![](https://2820704264-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fcia81SyIbV4ECEQL4Mxy%2Fuploads%2F1UQvnahzFQ30MKAuITi0%2Fimage.png?alt=media\&token=0da631d3-e742-4995-9559-b1b09818cd67)
{% endhint %}
