乐趣区

nginx docker容器配置https(ssl)

证书生成
首先需要有 https 的证书文件,如果你已经向证书授权中心购买了证书,可以跳过这步,这里介绍如何生成自签名证书,自签名证书是指不是证书授权中心 (Certificate Authority) 颁发的证书,而是在个人计算机上通过相关工具自己生成的证书,一般用于测试,不可用于生产环境。
为了方便管理证书(证书生成过程中会产生很多文件),我们可以单独创建一个目录用于存放证书文件,下面是通过 openssl 工具生成证书的过程。
1. 创建目录
$ cd ~
$ mkdir ssl
$ cd ssl
2. 创建秘钥文件
创建秘钥文件 definesys.key,名称可以自定义,需要指定密码(随意密码即可)
$ openssl genrsa -des3 -out definesys.key 1024
Generating RSA private key, 1024 bit long modulus
…….++++++
………………++++++
e is 65537 (0x10001)
Enter pass phrase for definesys.key:
Verifying – Enter pass phrase for definesys.key:
3. 创建 csr 证书
需要输入相关信息,比较重要的是 Common Name,这个是访问 nginx 的地址
$ openssl req -new -key definesys.key -out definesys.csr

Enter pass phrase for definesys.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Definesys
Organizational Unit Name (eg, section) []:Definesys
Common Name (e.g. server FQDN or YOUR name) []:www.definesys.com
Email Address []:jianfeng.zheng@definesys.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: 可以不用输
An optional company name []: 可以不用输

# 此时文件
$ ssl ll
total 16
-rw-r–r– 1 asan staff 733 1 3 23:57 definesys.csr
-rw-r–r– 1 asan staff 963 1 3 23:55 definesys.key
4. 去除秘钥密码
nginx 使用私钥时需要去除密码,执行以下命令时需要输入秘钥的密码
$ cp definesys.key definesys.key.bak
$ openssl rsa -in definesys.key.bak -out definesys.key

Enter pass phrase for definesys.key.bak:
writing RSA key
5. 生成 crt 证书
$ openssl x509 -req -days 3650 -in definesys.csr -signkey definesys.key -out definesys.crt

Signature ok
subject=/C=CN/ST=Shanghai/L=Shanghai/O=Definesys/OU=Definesys/CN=www.definesys.com/emailAddress=jianfeng.zheng@definesys.com
Getting Private key

# 此时文件列表

$ ssl ll
total 32
-rw-r–r– 1 asan staff 1017 1 4 00:03 definesys.crt
-rw-r–r– 1 asan staff 733 1 3 23:57 definesys.csr
-rw-r–r– 1 asan staff 887 1 4 00:02 definesys.key
-rw-r–r– 1 asan staff 963 1 4 00:01 definesys.key.bak
nginx 容器配置
1. 证书文件上传
将 definesys.crt 文件和 definesys.key 文件拷贝到服务器上,假设你服务器上 nginx 的配置文件在 /etc/nginx/ 目录下,可以在该目录下创建一个文件夹,这里命名 certs,将文件拷贝至该文件夹下。
2. 配置文件修改
修改配置文件 nginx.conf
server {
listen 443 ssl;
server_name www.definesys.com;

ssl_certificate /etc/nginx/certs/definesys.crt;
ssl_certificate_key /etc/nginx/certs/definesys.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}

如果 server 配置不在 nginx.conf 文件上,可以在 conf.d 文件夹下找.conf 后缀的文件,一般有个 default.conf 文件。
3. 启动容器
docker run -d –restart=unless-stopped -p 443:443 -v /etc/nginx/:/etc/nginx -v /var/run/docker.sock:/tmp/docker.sock:ro -v /u01/application:/usr/share/nginx/html nginx
访问 https://localhost 验证配置是否正确,如果能够正常访问说明配置成功,由于是自签名证书,打开时会提示证书不安全,忽略即可。

退出移动版