实现 https 访问与 Nginx 代理

## VPS 中生成 csr 和 key 用于 ssl 证书

当我们要为网站申请 ssl 证书的时候需要准备 csr (证书请求文件)， 包含申请证书所需要的相关信息，其中最重要的是域名，填写的域名必须是你要以 https 方式访问的那个域名。
比如我要生成 yus.bio 的证书

需要执行

Copy
openssl req -new -newkey rsa:2048 -nodes -keyout yus.key -out yus.csr

此命令将会生成两个文件，cmsky.key 是密钥文件，小心保存好这个文件，安装 SSL 证书的时候要用到。需要根据提示输入相应的信息，如域名等，按照提示一步一步操作，最后生成这两个文件。

Copy
Country Name (2 letter code) [AU]: CN （国家代码）
State or Province Name (full name) [Some-State]: Fujian （省）
Locality Name (eg, city) []: Xiamen （城市）
Organizat[iON](http://www.idcbaby.com/tag/418) Name (eg, company) [Internet Widgits Pty Ltd]: Cisco （企业/组织）
Organizational Unit Name (eg, section) []: IT （部门）
Common Name (eg, YOUR name) []: yus.bio （域名/请正确填写）
Email Address []: （可直接回车）
Please enter the following ‘extra’ attributes to be sent with your certificate request

A challenge password []: （直接回车）
An optional company name []: （直接回车）

其中的 Email Address 和 A challenge password 可以留空，不必填写，直接回车。以上需要填写的内容，如果不清楚应该怎么填写，除了域名其它的可以按照上面的内容填写。

之后执行命令

Copy
cat yus.csr

就会得到 csr 的内容

另外一个 .key 文件，一定不能搞丢 ，安装的的时候需要用到

## 申请 ssl，获得证书

如果是在 name.com 注册的域名，可以直接激活

首先得添加 dns 的 A 记录

接着在 ssl 的申请界面中

将上一步获取的 yus.csr 的内容 全部 复制到 ssl 申请界面中的 证书签名请求
点击下一步

就会得到以下证书

其中这个 SERVER CERTIFICATE 就是 pem 证书，将要添加到 VPS 服务器中

Copy
vi yus.pem

将 SERVER CERTIFICATE 、CA CERTIFICATE 、ROOT 中的内容复制进去

最后将 yus.pem 和 yus.key 放到 /home/cert 目录下

## VPS 中通过 nginx 安装证书

### 安装 Nginx

查看状态

Copy
sudo systemctl status nginx

通过 apt 安装

Copy
sudo apt-get install nginx -y

启动
默认安装目录为 /etc/nginx

Copy
/etc/init.d/nginx start

测试 Nginx 配置是否正确，以后修改配置也常常用到

Copy
nginx -t

查看 nginx 版本

Copy
nginx -v

Nginx 启动、停止、重启

Copy
service nginx start / stop / restart

## 修改配置文件

例如现在需要把部署在 8090 端口的 halo 应用映射到 https 的 443 端口

首先进入 conf.d 目录，添加 halo.conf 文件
内容如下

Copy
upstream halo {
server 127.0.0.1:8090;
}

接着进入到 sites-enabled 目录

删除默认的 default 文件

添加 halo 文件

Copy
vi halo

内容如下

Copy
server {
# https 监听的端口为 443
# http 监听的端口为 80
listen 443 ssl http2;
listen [::]:443 ssl http2;

# 需要映射到的域名
server_name www.yus.bio;

# pem 证书的路径
ssl_certificate "/home/cert/yus.pem";

# 生成的 key 的路径
ssl_certificate_key "/home/cert/yus.key";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;

client_max_body_size 1024m;
location / {
# conf.d 目录中创建的 .conf 文件名
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.

}

}

保存后执行

Copy
nginx -t

检查是否有配置错误

### 启动 nginx

最后执行

Copy
service nginx restart

成功通过域名访问

Bryce's Blog